Перейти к содержанию
    

Не передаются данные в DMA

Всем доброго дня! Подскажите, что я мог сделать неправильно?

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

АЦП все измеряет, но данные так и не попадают в буфер(((

 

    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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, что я мог сделать неправильно?
А тип или хотя бы серию процессора мы должны угадать из вашего ника? :wacko:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А тип или хотя бы серию процессора мы должны угадать из вашего ника? :wacko:

Ах да, забыл )-stm32f407

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, запросы к DMA формируются только при обновлении данных в ADC1->DR. Поэтому запись DMA2_Stream0->PAR= (uint32_t)&ADC1->JDR1; хоть и корректна, но особого смысла не имеет. Пересылка будет запущена только (и каждый раз) после обновления результата в ADC1->DR.

И в чем глубокий смысл писать биты регистр по одному, используя операции ИЛИ и И? Неужели нельзя сформировать нужную константу и записать ее в регистр одной пересылкой? Например так: (пример для F100, но это непринципиально):

    // 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
          ;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин, как меня задолбал этот АЦП, все никак не могу настроить(((((((((

Не могу понять почему ацп не тактируется от таймера!!!!!!!!

//*********************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" то данные попадают в буфер, но меня такой режим не устраивает! мне необходимо чтобы ацп измерял по таймеру!Все биты для тактирования, от таймера, я установил

ADC1->CR2|=DC_CR2_EXTSEL_1|ADC_CR2_EXTSEL_2);//  0110 tim 2 (TRGO)

но толку нет (((((

Подскажите пожалуйста, в чем может быть причина?

 

    // 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
         ;

Спасибо, за совет)Форма записи-действительно удобней!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...