带有 DMA 7 通道常规组的 STM32F4 ADC 不工作

Posted

技术标签:

【中文标题】带有 DMA 7 通道常规组的 STM32F4 ADC 不工作【英文标题】:STM32F4 ADC with DMA 7 Channel regular group isn't working 【发布时间】:2020-09-12 03:55:00 【问题描述】:

我正在尝试设置我的 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 data     
    DMA2_Stream0->NDTR = 2;                                 // number of data to be transferred (here 1)    
    DMA2_Stream0->CR |= 0x00022901;                         // DMA Stream Konfiguration for the incoming ADC1 data (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位数据传输方向:Peripheral-to-memory 00 1 位外设流量控制器 0 1 位传输完成中断使能 0 1位半传输中断使能0 1 位传输错误中断使能 0 1 位直接模式错误中断使能 0 1 位启用 1 总结:10 0010 1001 0000 0001

GPIOA 引脚 1 到 7 配置为模拟模式:11 个用于七个通道

GPIOA->MODER |= 0x0000FFFC;

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

常规序列寄存器 1 被配置为在第 1 位进行引脚 A1 转换,在第 2 位进行引脚 A2 转换。 ADC1->SQR3 = 0x00000041;

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

【问题讨论】:

我使用了“注册”模式。端口 A 引脚 1 到 7 定义为模拟模式 GPIOA->MODER |= 0x0000FFFC; // Pin 1-7 Port a as analog 你不理解也不想合作 - 我出去了这是 CMSIS 定义 ADC_CR2_CONT,这是幻数:0x00022901。你看得到差别吗?寄存器在这里无关紧要 是的,你是对的,我不明白你想通过评论告诉我什么 mamy increment 必须启用。 谢谢。妈妈增量?在手册中找不到这个 【参考方案1】:

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

谢谢大家。

【讨论】:

在我的评论中,我认为这个错字并不难猜

以上是关于带有 DMA 7 通道常规组的 STM32F4 ADC 不工作的主要内容,如果未能解决你的问题,请参考以下文章

STM32F4 DMA重新启动问题

STM32F4 UART1 DMA发送和接收不定长度数据

STM32F103(二十一)DMA(超详细的~)

STM32F4 HAL库开发 -- DMA

[STM32F103]DMA原理

STM32F4 ADC模块使用不同DMA模式的区别和对比