12.04.2013, 12:00
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
ADC+DMA stm32f4
Всем доброго дня! Подскажите, что я мог сделать неправильно?
Хочу настроить АЦП так что бы он передавал измеряемые данные в буфер, с использованием ДМА(ПДП)!
АЦП все измеряет, но данные так и не попадают в буфер(((
PHP код:
|
uint32_t ADC_BUFF[100];
SystemInit();
//*********************TIM3*************************
RCC-›APB1ENR |= RCC_APB1ENR_TIM4EN; // тактирование таймера
TIM4-›PSC = 160-1; // предделитель
TIM4-›ARR = 1000-1; // переполнение
// TIM4-›DIER |= TIM_DIER_UIE; // прерывание по переполнению
TIM4-›CR2 |= TIM_CR2_MMS_1; // output (TRGO)
TIM4-›CR1 |= TIM_CR1_CEN; // запуск счета
NVIC_EnableIRQ(TIM4_IRQn);
NVIC_SetPriority(TIM4_IRQn,9);
RCC-›AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
//********************ADC1**CH6 PA6***************
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN;
//********************DMA***************************
RCC-›AHB1ENR |= RCC_AHB1ENR_DMA1EN;
DMA1_Stream0-›CR&=~ DMA_SxCR_CHSEL; // 001: channel 0 selected
DMA1_Stream0-›PAR= (uint32_t)&ADC1-›JDR1; // Предача в регистр DHR12R1
DMA1_Stream0-›M0AR=(uint32_t)&ADC_BUFF[0]; // Массив
DMA1_Stream0-›NDTR=11; // Длина буфера
DMA1_Stream0-›CR|= DMA_SxCR_MINC; // Инкремент адреса
DMA1_Stream0-›CR|= DMA_SxCR_MSIZE_0; // 16 бит
DMA1_Stream0-›CR|= DMA_SxCR_PSIZE_0; // 16 бит
DMA1_Stream0-›CR|= DMA_SxCR_CIRC; // Непрерывный режим
DMA1_Stream0-›CR&=~ DMA_SxCR_DIR; // 01: peripheral-to-Memory
DMA1_Stream0-›CR|= DMA_SxCR_PL; // 11: Very high приоритет
DMA1_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-›SMPR2 |=ADC_SMPR2_SMP2; //111: 480 cycles, ADC sample time
// ADC1-›SMPR2 |=ADC_SMPR2_SMP6;
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.04.2013, 13:12
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: ADC+DMA stm32f4
Чем пинается DMA ?
У DMA1 на все потоки на канал 0 запросы только от SPI .
С DMA2 перепутал ?
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 12.04.2013 в 13:16.
|
|
|
Сказали "Спасибо" dosikus
|
|
|
12.04.2013, 14:28
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ADC+DMA stm32f4
Сообщение от dosikus
|
Чем пинается DMA ?
У DMA1 на все потоки на канал 0 запросы только от SPI .
С DMA2 перепутал ?
|
Ох, как жешь я так не досмотрел)Спасибо большое !
Но все равно, что то данные не идут(
Не подскажите в АЦП, для работы с дма, кроме бита ADC_CR2_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; |
|
|
|
|
12.04.2013, 15:02
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: ADC+DMA stm32f4
STM32F4, Это ты код с STM32F1xx перетаскиваешь ?
Похоже не полная настройка . Надо рыть ...
__________________
Осторожно , злой кот
|
|
|
Сказали "Спасибо" dosikus
|
|
|
18.04.2013, 10:24
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ADC+DMA stm32f4
ХМ, а у АЦП вообще есть DMA? для инжектированных каналов...
|
|
|
|
18.04.2013, 10:39
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: ADC+DMA stm32f4
Сообщение от STM32F4
|
ХМ, а у АЦП вообще есть DMA? для инжектированных каналов...
|
Вы вообще понимаете что спросили?
|
|
|
|
18.04.2013, 11:21
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ADC+DMA stm32f4
Сообщение от SasaVitebsk
|
Вы вообще понимаете что спросили?
|
глупость?
Там ДМА нет!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
18.04.2013, 11:32
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: ADC+DMA stm32f4
Сообщение от STM32F4
|
глупость?
Там ДМА нет!!!!!!!!!!!!!!!!!!!!!!
|
Где нет? В АЦП? Конечно нет. АЦП вообще не должна знать о существовании DMA. Ему это для функционирования абсолютно не надо.
Вы уточняйте вопрос. А то вроде слова правильные и вроде даже предложения составляются, падежи верные, а смысла нет.
Может бы вы хотели спросить "узнает ли DMA о том что инжектированный канал завершил преобразование"?
Последний раз редактировалось SasaVitebsk; 18.04.2013 в 14:11.
|
|
|
|
18.04.2013, 11:42
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ADC+DMA stm32f4
|
|
|
|
18.04.2013, 11:55
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: ADC+DMA stm32f4
Ладно. )) Не буду издеваться. Хорошо, что вы думаете и изучаете. Отвечу Вам максимально детально.
1. Имеются регулярные каналы АЦП. Которые Вы можете перебирать любым способом в любом порядке. При этом результаты валятся в один регистр. В связи с этим Вам надо контролировать какому каналу соответствует значение этого регистра. Это сделать по прерыванию достаточно хлопотно. Либо синхронизироваться, либо самому переключать каналы. В связи с этим применение DMA очень удобно. DMA будет считывать значения в память и размещать их там последовательно. Вам остаётся только читать нужную ячейку памяти, которая соответствует необходимому Вам каналу.
2. Имеются 4 инжектированных канала. Каждому каналу соответствует свой регистр. Таким образом вы абсолютно точно знаете, какому регистру соответствует какой канал. Таким образом применение DMA, в данном случае, не даёт никаких преимуществ, при этом уменьшает производительность камня в целом. Вам без разницы откуда брать значение из памяти либо из регистра. Вы просто тратите силы на пустую операцию пересылки из регистра в память.
3. Тем не менее Вы можете это сделать. DMA самостоятельный узел. К АЦП не имеющий никакого отношения. По сути DMA просто пересылает данные из одного места в другое. Специфицырованы все виды пересылок: память-›память, память-›регистр, регистр-›память и регистр-›регистр. Вам надо только указать источник и приёмник. Без всяких автоинкрементов и указать событие, которое будет инициировать транзакцию. В качестве события, например можно выбрать таймер либо завершение цикла преобразования АЦП. Особой разницы в данном случае нет.
PS: можно даже с пинов процессора данные получать.
Последний раз редактировалось SasaVitebsk; 18.04.2013 в 11:58.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо SasaVitebsk за это сообщение:
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:53.
|
|