具有DMA 7通道常规组的STM32F4 ADC不起作用

问题描述 投票:0回答:1

我正在尝试设置STM32F407-Discovery开发板,以使用DMA控制器从ADC1读取多个ADC通道。无需使用DMA即可读取一个值。启用DMA时,仅通道1被转换。其他数组元素填充为0。不幸的是我找不到我的错误,因为我不太确定从哪里开始。也许您可以在这里帮助我。我的完整代码显示在下面。

#include "stm32f4xx.h"
#include "system_stm32f4xx.h"

/*****************************
MAIN function
*****************************/
void ADC_IRQHandler(void);

uint32_t n=0;                                               // defines global variable n for number of convertions
uint32_t value[2];
float show[2];
int i=0;

int main()
{
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;                    // activate clock for port A
    RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;                     // activate clock for DMA2
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;                     // activate clock for ADC1

  DMA2_Stream0->PAR = (uint32_t) &ADC1->DR;                 // Regular Data Register to load ADC1 as DMA-Sourceadress
    DMA2_Stream0->M0AR = (uint32_t) &value;                 // Regular Data Register to store ADC1 DMA datas        
    DMA2_Stream0->NDTR = 2;                                 // number of datas to be transfered (hier 1)    
    DMA2_Stream0->CR |= 0x00022901;                         // DMA Stream Konfiguration for the incomming ADC1 datas (prio: Medium / MSIZE: Half-word / PSIZE: half-word / circular/ enable)

    GPIOA->MODER |= 0x0000FFFC;                                     // Pin 1-7 Port a as analog
    ADC1->SQR1 = 0x00100000;                                            // two conversions
    ADC1->SQR2 = 0; 
    ADC1->SQR3 = 0x00000041;                                            // conversion ADC in1 and in2
    ADC1->SMPR2 |= 0xFFFFFFFF;                                      // sampletime 
    ADC1->CR2 |= ADC_CR2_CONT;                                      // choose continiouse Mode for ADC3
    ADC1->CR2 |= ADC_CR1_SCAN;                                      // scan mode active
    ADC1->CR2 |= ADC_CR2_DDS;                                           // DMA via DDS-Bit
    ADC1->CR2 |= ADC_CR2_DMA;                                           // activate DMA module
    ADC1->CR2 |= ADC_CR2_ADON;                                      // Activate the AD converter
    ADC1->CR2 |= ADC_CR2_SWSTART;                                   // start convertion

    while(1)
    {
        show[0] = (float) value[0]*(float) 3.3 / (float)0xFFF;
        show[1] = (float) value[1]*(float) 3.3 / (float)0xFFF;
    }
}

因此DMA流设置为:

  • 4位保留
  • 3位通道选择:我正在使用通道0来访问ADC1
  • 2位内存突发传输配置:单次传输
  • 2位外围设备突发传输配置:单次传输
  • 1位保留
  • 1位当前目标0(DMA_SxM0AR指针)
  • 1位双缓冲模式:无缓冲切换
  • 2位优先级:中:01
  • 禁用1位外设增量偏移量0
  • 2位存储器的数据大小:半字01
  • 2位外围数据大小:半字01
  • 1位内存增量模式:禁用0
  • [1位外设递增模式:禁用0
  • 1位循环模式:启用1
  • 1位数据传输方向:外设到存储器00
  • 1位外围流量控制器0
  • 1位传输完成中断允许0
  • 1位半传输中断允许0
  • 1位传输错误中断允许0
  • 1位直接模式错误中断使能0
  • 1位使能1总结:10 0010 1001 0000 0001

GPIOA引脚1至7配置为模拟模式,其中:11个代表7个通道

GPIOA->MODER |= 0x0000FFFC;

ADC 1是常规序列寄存器1,配置为进行2次转换ADC1->SQR1 = 0x00100000;

常规序列寄存器1配置为在第一位的引脚A1转换和第二位的引脚A2。ADC1->SQR3 = 0x00000041;

用于测试,将采样时间寄存器的0至9通道设置为480个周期ADC1->SMPR2 |= 0xFFFFFFFF;

c stm32 dma adc
1个回答
0
投票

发现我的错误,需要启用内存增加模式。另一个错误是错误的内存数据大小。将我的数据类型从值更改为16位。现在可以正常工作。

谢谢大家。

© www.soinside.com 2019 - 2024. All rights reserved.