STM32F4 AD C с DMA 7-канальная обычная группа не работает - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь настроить свою плату 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;

1 Ответ

0 голосов
/ 25 мая 2020

Нашел свою ошибку, нужно включить режим инкремента памяти. Другой ошибкой был неправильный размер данных в памяти. Изменил мой тип данных со значений на 16 бит. Теперь работает нормально.

Всем спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...