реклама на сайте
подробности

 
 
> Не передаются данные в DMA, ADC+DMA
stm32f4
сообщение Apr 12 2013, 07:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-08-12
Пользователь №: 73 098



Всем доброго дня! Подскажите, что я мог сделать неправильно?
Хочу настроить АЦП так что бы он передавал измеряемые данные в буфер, с использованием ДМА(ПДП)!
АЦП все измеряет, но данные так и не попадают в буфер(((

Код
    uint32_t BUFF[100];
        RCC->APB2ENR    |= RCC_APB2ENR_ADC1EN;
//********************DMA***************************
        RCC->AHB1ENR    |= RCC_AHB1ENR_DMA2EN;
        DMA2_Stream0->CR&=~ DMA_SxCR_CHSEL;            // 000: channel 0 selected
        DMA2_Stream0->PAR= (uint32_t)&ADC1->JDR1;     //
        DMA2_Stream0->M0AR=(uint32_t)&BUFF[0];        // Массив
        DMA2_Stream0->NDTR=10;                        // Длина буфера
        DMA2_Stream0->CR|= DMA_SxCR_MINC;            // Инкремент адреса
        DMA2_Stream0->CR|= DMA_SxCR_MSIZE_0;        // 16 бит
        DMA2_Stream0->CR|= DMA_SxCR_PSIZE_0;        // 16 бит
        DMA2_Stream0->CR|= DMA_SxCR_CIRC;            // Непрерывный режим
        DMA2_Stream0->CR&=~ DMA_SxCR_DIR;            // 01: peripheral-to-Memory
        DMA2_Stream0->CR|= DMA_SxCR_PL;                // 11: Very high приоритет
        DMA2_Stream0->CR|= DMA_SxCR_EN;                 // Вкл. передачу

        GPIOA->MODER    |= GPIO_MODER_MODER6;            //ADC1 CH6 PA6
        GPIOA->MODER    |= GPIO_MODER_MODER1;            //ADC1 CH2 PA1
        ADC1->CR1        |= ADC_CR1_DISCNUM_0;            //Discontinuous mode channel count   001: 2 channels
        ADC1->CR1        |= ADC_CR1_JDISCEN;                //1: Discontinuous mode on injected channels enabled
        ADC1->CR1        |= ADC_CR1_SCAN;
        ADC1->CR2        |= (ADC_CR2_JEXTSEL_3|ADC_CR2_JEXTSEL_0);//tim 4 (TRGO)
        ADC1->CR1        |=ADC_CR1_JAUTO;                //автоматическое преобразование для каналов в инжектированной группе после каналов  регулярной группы.
        ADC1->JSQR        |=ADC_JSQR_JL_0;                //выбор кол-ва каналов для преобразования (2 каналa инжектированной группы)
        ADC1->CR2         |=ADC_CR2_DMA;                    //разрешаем рабуту DMA
//        ADC1->CR2         |=ADC_CR2_DDS;
        ADC1->CR1        |=ADC_CR1_JEOCIE;
        ADC1->CR2        |=ADC_CR2_CONT;
//        ADC->CCR        |= ADC_CCR_DMA_0;                //01: DMA mode 1 enabled (2 / 3 half-words one by one - 1 then 2 then 3)
//        ADC->CCR        |= ADC_CCR_DDS;
        ADC1->JSQR        |=(ADC_JSQR_JSQ3_1|ADC_JSQR_JSQ3_2);// CH6 PA6
        ADC1->JSQR        |= ADC_JSQR_JSQ4_0;                // CH1 PA1
        ADC1->CR2         |=ADC_CR2_JEXTEN_0;                //01: Запуск обнаружения по фронту
        ADC1->CR2         |=ADC_CR2_JSWSTART;
        ADC1->CR2         |=ADC_CR2_ADON;


Сообщение отредактировал stm32f4 - Apr 12 2013, 13:49
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Apr 15 2013, 19:48
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Да, запросы к DMA формируются только при обновлении данных в ADC1->DR. Поэтому запись DMA2_Stream0->PAR= (uint32_t)&ADC1->JDR1; хоть и корректна, но особого смысла не имеет. Пересылка будет запущена только (и каждый раз) после обновления результата в ADC1->DR.
И в чем глубокий смысл писать биты регистр по одному, используя операции ИЛИ и И? Неужели нельзя сформировать нужную константу и записать ее в регистр одной пересылкой? Например так: (пример для F100, но это непринципиально):
CODE
    // start conversions
    ADC1->CR2 = 0
            | 1 * ADC_CR2_ADON          // A/D Converter ON
            | 0 * ADC_CR2_CONT          // Continuous Conversion disabled
            | 0 * ADC_CR2_CAL           // A/D Calibration
            | 0 * ADC_CR2_RSTCAL        // Reset Calibration
            | 1 * ADC_CR2_DMA           // Direct Memory access enabled
            | 1 * ADC_CR2_ALIGN         // Data Alignment: left
            | 7 * ADC_CR2_JEXTSEL_0     // External event for injected group: JSWSTART
            | 0 * ADC_CR2_JEXTTRIG      // External Trigger Conversion mode for injected channels: disabled
            | 4 * ADC_CR2_EXTSEL_0      // External Event for regular group: TIM3TRGO
            | 1 * ADC_CR2_EXTTRIG       // External Trigger Conversion mode for regular channels: enabled
            | 0 * ADC_CR2_JSWSTART      // Start Conversion of injected channels
            | 0 * ADC_CR2_SWSTART       // Start Conversion of regular channels
            | 0 * ADC_CR2_TSVREFE       // Temperature Sensor and VREFINT disabled
          ;


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 02:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01354 секунд с 7
ELECTRONIX ©2004-2016