我正在尝试设置我的STM32F407-Discoveryboard,使用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流被设置为:
<代码>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
<代码>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个周期。
发布于 2020-05-25 16:41:36
发现我的错误,需要启用内存增量模式。另一个错误是内存数据大小错误。将数据类型从值更改为16位。现在工作得很好。
谢谢你们所有人。
https://stackoverflow.com/questions/62003626
复制相似问题