stm32f4 0 12 апреля, 2013 Опубликовано 12 апреля, 2013 (изменено) · Жалоба Всем доброго дня! Подскажите, что я мог сделать неправильно? Хочу настроить АЦП так что бы он передавал измеряемые данные в буфер, с использованием ДМА(ПДП)! АЦП все измеряет, но данные так и не попадают в буфер((( 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; Изменено 12 апреля, 2013 пользователем stm32f4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 12 апреля, 2013 Опубликовано 12 апреля, 2013 · Жалоба Подскажите, что я мог сделать неправильно?А тип или хотя бы серию процессора мы должны угадать из вашего ника? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stm32f4 0 12 апреля, 2013 Опубликовано 12 апреля, 2013 · Жалоба А тип или хотя бы серию процессора мы должны угадать из вашего ника? Ах да, забыл )-stm32f407 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
btolfa 0 15 апреля, 2013 Опубликовано 15 апреля, 2013 · Жалоба Насколько я понял dma умеет работать только с регулярными каналами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 15 апреля, 2013 Опубликовано 15 апреля, 2013 · Жалоба Да, запросы к 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 ; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stm32f4 0 19 апреля, 2013 Опубликовано 19 апреля, 2013 · Жалоба Блин, как меня задолбал этот АЦП, все никак не могу настроить((((((((( Не могу понять почему ацп не тактируется от таймера!!!!!!!! //*********************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 ; Спасибо, за совет)Форма записи-действительно удобней!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться