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

 
 
> Не передаются данные в 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
Ответов
stm32f4
сообщение Apr 19 2013, 08:51
Сообщение #2


Участник
*

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



Блин, как меня задолбал этот АЦП, все никак не могу настроить(((((((((
Не могу понять почему ацп не тактируется от таймера!!!!!!!!
Код
//*********************TIM3*************************
        RCC->APB1ENR    |= RCC_APB1ENR_TIM2EN;            // тактирование таймера
        TIM2->PSC         = 160-1;                            // предделитель
        TIM2->ARR         = 1000-1;                            // переполнение
        TIM2->CR2         |= TIM_CR2_MMS_1;                // output (TRGO)
        TIM2->CR1         |= TIM_CR1_CEN;                    // запуск счета


        RCC->AHB1ENR    |= RCC_AHB1ENR_GPIOAEN;
//********************ADC1**CH6 PA6***************
        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->DR;     //
        DMA2_Stream0->M0AR=(uint32_t)&BUFF[0];        // Массив
        DMA2_Stream0->NDTR=100;                        // Длина буфера
        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
        ADC1->CR1        |= ADC_CR1_SCAN;
        ADC1->CR2        |= (ADC_CR2_EXTSEL_1|ADC_CR2_EXTSEL_2);//  0110 tim 2 (TRGO)
        ADC1->CR2         |=ADC_CR2_DMA;                    //разрешаем рабуту DMA
//        ADC1->CR2        |=ADC_CR2_CONT;
        ADC1->SQR3        =6;
        ADC1->CR2         |=ADC_CR2_SWSTART;
        ADC1->CR2         |=ADC_CR2_ADON;

Если установить бит "ADC_CR2_CONT" то данные попадают в буфер, но меня такой режим не устраивает! мне необходимо чтобы ацп измерял по таймеру!Все биты для тактирования, от таймера, я установил [PHP]ADC1->CR2|=DC_CR2_EXTSEL_1|ADC_CR2_EXTSEL_2);// 0110 tim 2 (TRGO)[/PHP] но толку нет (((((
Подскажите пожалуйста, в чем может быть причина?

Цитата(Сергей Борщ @ Apr 15 2013, 23:48) *
Код
    // 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
         ;

Спасибо, за совет)Форма записи-действительно удобней!!!
Go to the top of the page
 
+Quote Post



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

 


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


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