具有 DMA 7 通道常规组的 STM32F4 ADC 不工作
STM32F4 ADC with DMA 7 Channel regular group isn't working
我正在尝试设置我的 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 位通道Select:我正在使用通道 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 Bit 数据传输方向: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 配置为第一个位置的引脚 A1 转换和第二个位置的引脚 A2 转换。
ADC1->SQR3 = 0x00000041;
为了测试,采样时间寄存器设置为通道 0 到 9 的 480 个周期
ADC1->SMPR2 |= 0xFFFFFFFF;
发现我的错误,需要开启内存增量模式。另一个错误是错误的内存数据大小。将我的数据类型从值更改为 16 位。现在工作正常。
谢谢大家
我正在尝试设置我的 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 位通道Select:我正在使用通道 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 Bit 数据传输方向: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 配置为第一个位置的引脚 A1 转换和第二个位置的引脚 A2 转换。
ADC1->SQR3 = 0x00000041;
为了测试,采样时间寄存器设置为通道 0 到 9 的 480 个周期
ADC1->SMPR2 |= 0xFFFFFFFF;
发现我的错误,需要开启内存增量模式。另一个错误是错误的内存数据大小。将我的数据类型从值更改为 16 位。现在工作正常。
谢谢大家