首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有DMA 7通道规则组的STM32F4 ADC不工作

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

Stack Overflow用户
提问于 2020-05-25 13:39:45
回答 1查看 778关注 0票数 0

我正在尝试设置我的STM32F407-Discoveryboard,使用DMA控制器从ADC1读取多个ADC通道。可以不使用DMA读取一个值。当DMA启用时,只有通道1被转换。其他数组元素被填充为0。

不幸的是,我找不到我的错误,因为我不太确定从哪里开始。也许你能帮我。

我的完整代码如下所示:

代码语言:javascript
复制
#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位外设突发传输配置:单传输

<代码>H 1101位保留<代码>H 211<代码>H 1121位当前目标0 (DMA_SxM0AR指针)<代码>H 213/代码><代码>H 114H 1141位双缓冲模式:没有缓冲区切换<代码>H 215<代码>H 1162位优先级级别:介质:介质:<01<代码>H 217<代码H 118<1位代码H 118<1位边角码>0偏移量<120位代码<120位码><数据码<<221>数据码<<><数据码<数据码<位外设数据大小:半字01

  • 1位内存增量模式:禁用0
  • 1位外设增量模式:禁用0
  • 1位循环模式:启用1
  • 1位数据传输方向:外围存储器00

<代码>H 1321位外设流控制器0<代码>H 233<代码>H 1341位传输完全中断启用0<<代码>H 235<代码>H 1361位传输中断启用0<代码>H 237<代码>H 1381位错误传输中断使0<<代码>H 239><代码H 140/1位错误码>0位中断模式<0 0 1<0 0 1码><0 0 0 1<0 0 1码<0 0 0 1<0 0 0码<0 0 0 1<0 0 1H 138代码>1位错误传输中断使0<<代码>>H 239>代码><代码H 140/1位错误代码>0位中断模式<<0 0 4 1<0 0 1码><0 0 1<0 0 1<0 0 0 1<0 0 0 1<0 0 0 1<0 0 0 1<0 0 0 1<0 0 0><0 0 0 1<0 0 6><0 0 6><0 0 6><0 0 0 1<0 0 6>H 138代码>1位错误中断使0<0>H 239><>H 140码>1位错误码><0 0 4 1<0 0 1码><0 0 0 1码<0 0 0 1<0 0 0 1<0 0 0 1<0 0 0 1<0 0 0 1<0 0 0><0 0 0><0 0 0 1<0 0 0 1<0 0 0 1<0 0

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

GPIOA->MODER |= 0x0000FFFC;

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

规则序列寄存器1被配置为第1位的Pin A1转换和第2位的Pin A2。ADC1->SQR3 = 0x00000041;

对于测试,对于通道0到9 ADC1->SMPR2 |= 0xFFFFFFFF;,示例时间寄存器设置为480个周期。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-25 16:41:36

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

谢谢你们所有人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62003626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档