Я пытаюсь настроить свою плату STM32F407-Discovery для чтения нескольких каналов AD C с ADC1 с помощью контроллера DMA. Можно прочитать одно значение без использования 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 для семи каналов
GPIOA->MODER |= 0x0000FFFC;
AD C 1 - регистр обычной последовательности 1 настроен для 2 преобразований ADC1->SQR1 = 0x00100000;
регистр 1 обычной последовательности настроен для преобразования контакта A1 на 1-м месте и контакта A2 на 2-м месте. ADC1->SQR3 = 0x00000041;
Для тестирования регистр времени выборки установлен на 480 циклов для каналов с 0 по 9 ADC1->SMPR2 |= 0xFFFFFFFF;