22.04.2013, 01:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: ADC+DMA stm32f4
Сообщение от SasaVitebsk
|
3.
|
Прошу пардона...
А предыдущее значение АЦП хде забрать?
Аль ОНО само FIFO делать умеет?
|
|
|
|
22.04.2013, 02:00
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: ADC+DMA stm32f4
Если вы имеете ввиду что надо выполнить "ряд измерений" из одного канала и только потом запускать обработку результатов, то тогда я извиняюсь. Я не понялвопроса.
Поскольку всё равно, надо обработать все результаты, то я не вижу смысла в DMA. Я бы делал распределённую обработку в этом случае.
Но, как говорится, хозяин барин. Тогда надо делать либо так как я говорил, то есть использовать инжектированные каналы и запускать DMA по таймеру, которым запускаете АЦП. При этом надо создавать 3 потока DMA. По потоку на один регистр инжектированного канала. Либо можно использовать регулярные каналы. Ну например вам надо каналы 5-7-9. Программируете, а в буфере объявляете как двумерный массив. И получаете по одному измерению номера каналов, по другому - ваши выборки.
Короче более ясно изложите вашу задачу, а то всё как-то невнятно.
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
22.04.2013, 02:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: ADC+DMA stm32f4
Задача-то не моя... но думаю именно это и надо.
|
|
|
Сказали "Спасибо" omercury
|
|
|
22.04.2013, 12:09
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ADC+DMA stm32f4
Сообщение от SasaVitebsk
|
Если вы имеете ввиду что надо выполнить "ряд измерений" из одного канала и только потом запускать обработку результатов, то тогда я извиняюсь. Я не понялвопроса.
Поскольку всё равно, надо обработать все результаты, то я не вижу смысла в DMA. Я бы делал распределённую обработку в этом случае.
Но, как говорится, хозяин барин. Тогда надо делать либо так как я говорил, то есть использовать инжектированные каналы и запускать DMA по таймеру, которым запускаете АЦП. При этом надо создавать 3 потока DMA. По потоку на один регистр инжектированного канала. Либо можно использовать регулярные каналы. Ну например вам надо каналы 5-7-9. Программируете, а в буфере объявляете как двумерный массив. И получаете по одному измерению номера каналов, по другому - ваши выборки.
Короче более ясно изложите вашу задачу, а то всё как-то невнятно.
|
Да, не спорю, вопрос я замудрил! Еще раз повторюсь,мне нужно запускать измерения АЦП по таймеру т.к я измеряю синусоидальный сигнал, заранее известной частоты, по-этому мне необходимо производить измерения кратно периоду сигнала!!!Для этого я хочу использовать DMA, что бы данные сами записывались в массив, а режим АЦП не важен.............Главное что бы данные ацепировались по таймеру и посредством DMA попадали в массив!!!!!!
А проблема моя в том что : если настроить АЦП на передачу данных из регулярного канала, с помощью ДМА, в массив, то АЦП работает только в непрерывном режиме, а от таймера не работает!!!!!!!!!!!!!!!!!!!!!!
В чем может быть причина?
PHP код:
|
//*********************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-›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)
но толку нет (((((
Что касается ваших сообщений, о принципе работы ДМА, написаны не зря -очень познавательно ) Спасибо.
|
|
|
|
22.04.2013, 14:34
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: ADC+DMA stm32f4
А вот это забыли?
Bits 29:28 EXTEN: External trigger enable for regular channels
These bits are set and cleared by software to select the external trigger polarity and enable
the trigger of a regular group.
00: Trigger detection disabled
01: Trigger detection on the rising edge
10: Trigger detection on the falling edge
11: Trigger detection on both the rising and falling edges
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
23.04.2013, 10:50
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ADC+DMA stm32f4
Сообщение от SasaVitebsk
|
А вот это забыли?
Bits 29:28 EXTEN
the trigger of a regular group.
01: Trigger detection on the rising edge
|
эт да, пропустил бит!Но и с ним что-то не то(((((Данные то приходят, но 0xFFF.
Если добавить прерывание по окончанию преобразования ацп, то видно что ацп ацепирует согласно таймеру!!!
Если посмотреть на буфер то первое значение приходит то что и должно, это по-видимому из-за установки бита ADC_CR2_SWSTART после ADC_CR2_ADON.
Почему это может происходить?
PHP код:
|
void TIM2_IRQHandler(void)
{
TIM2-›SR&= ~TIM_SR_UIF; //Сбрасываем флаг UIF
}
float i;
void ADC_IRQHandler(void)
{
ADC1-›SR&= ~ADC_SR_AWD;
GPIOD-›ODR ^=((1‹‹12)|(1‹‹13)|(1‹‹14)|(1‹‹15));
}
uint16_t BUFF[100];
int main(void)
{
SystemInit();
//*********************TIM2*************************
RCC-›APB1ENR |= RCC_APB1ENR_TIM2EN; // тактирование таймера
TIM2-›PSC = 16000-1; // предделитель
TIM2-›ARR = 1000-1; // переполнение
TIM2-›CR2 |= TIM_CR2_MMS_1; // output (TRGO)
TIM2-›DIER |= TIM_DIER_UIE; //Прерывания по переполнению
TIM2-›DIER |= TIM_DIER_UDE;
TIM2-›CR1 |= TIM_CR1_CEN; //запуск счета
NVIC_EnableIRQ(TIM2_IRQn);
NVIC_SetPriority(TIM2_IRQn,16);
RCC-›AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
GPIOA-›MODER |= GPIO_MODER_MODER6; //ADC1 CH6 PA6
//********************ADC1**CH6 PA6***************
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN;
//********************DMA***************************
RCC-›AHB1ENR |= RCC_AHB1ENR_DMA2EN;
DMA2_Stream4-›CR&=~ DMA_SxCR_CHSEL; // 000: channel 0 selected
DMA2_Stream4-›PAR= (uint32_t)&ADC1-›DR; //
DMA2_Stream4-›M0AR=(uint32_t)&BUFF[0]; // Массив
DMA2_Stream4-›NDTR=100; // Длина буфера
DMA2_Stream4-›CR|= DMA_SxCR_MINC; // Инкремент адреса
DMA2_Stream4-›CR|= DMA_SxCR_MSIZE_0; // 16 бит
DMA2_Stream4-›CR|= DMA_SxCR_PSIZE_0; // 16 бит
// DMA2_Stream4-›CR|= DMA_SxCR_CIRC; // Непрерывный режим
ADC1-›CR1 |= ADC_CR1_EOCIE; //разрешаем прерывания
DMA2_Stream4-›CR&=~ DMA_SxCR_DIR; // 01: peripheral-to-Memory
DMA2_Stream4-›CR|= DMA_SxCR_PL; // 11: Very high приоритет
DMA2_Stream4-›CR|= DMA_SxCR_EN; // Вкл. передачу
ADC1-›CR2 |= (ADC_CR2_EXTSEL_1|ADC_CR2_EXTSEL_2);//tim 2 (TRGO)
ADC1-›CR2 |=ADC_CR2_DMA; //разрешаем рабуту DMA
// ADC1-›CR2 |=ADC_CR2_CONT;
ADC1-›CR2 |=ADC_CR2_EXTEN_0;
ADC1-›SQR3 =6;
ADC1-›CR2 |=ADC_CR2_ADON;
ADC1-›CR2 |=ADC_CR2_SWSTART;
NVIC_EnableIRQ(ADC_IRQn);
NVIC_SetPriority(ADC_IRQn,5);
|
|
|
|
|
23.04.2013, 11:16
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: ADC+DMA stm32f4
Не обижайтесь, но много бесполезной суеты. Вы один раз определитесь что именно вы хотите сделать и внятно прочитайте мануал. Я, например, беру устройство, и каждый регистр ... каждый бит определяю. А то вы как тот тракторист с магнитолой - не работает - я и так полярность подавал и так.
Понимаете - это не тот случай, чтобы методом тыка делать и сразу 10 параметров менять. Я за вами неуспеваю.
Я первый же регистр посмотрел - и у меня несходится с вами. Но я уже не знаю что к чему относится. Может вы условия задачи поменяли.
Давайте сначала. Подробно словами пишете что именно вы хотите сделать на данном этапе. Старое зачёркиваем. И после этого спокойно сами это пишите. И выкладываете. Я смотрю. А то раньше вы три канала мерили, теперь я вообще не понимаю что к чему
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
26.04.2013, 18:00
|
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ADC+DMA stm32f4
Сообщение от SasaVitebsk
|
Не обижайтесь, но много бесполезной суеты. Вы один раз определитесь что именно вы хотите сделать и внятно прочитайте мануал. Я, например, беру устройство, и каждый регистр ... каждый бит определяю. А то вы как тот тракторист с магнитолой - не работает - я и так полярность подавал и так.
Понимаете - это не тот случай, чтобы методом тыка делать и сразу 10 параметров менять. Я за вами неуспеваю.
Я первый же регистр посмотрел - и у меня несходится с вами. Но я уже не знаю что к чему относится. Может вы условия задачи поменяли.
Давайте сначала. Подробно словами пишете что именно вы хотите сделать на данном этапе. Старое зачёркиваем. И после этого спокойно сами это пишите. И выкладываете. Я смотрю. А то раньше вы три канала мерили, теперь я вообще не понимаю что к чему
|
Да, от основной задачи я давно отошел и для начала я хочу сделать простейший проект в котором будет задействован только АЦП и ДМА!!!
Главные условия которого: первое это работать от таймера, ну и что бы ДМА формировал буфер измеряемых данных!Я уже все регистры наизусть выучил, видимо я что-то не так понял(
У вас нет примеров подобной настройки?Я весь интернет облазил, то ДМА с АЦП но в непрерывном режиме то АЦП по таймеру но бед ДМА эти варианты настройки и у меня отлично работают.
|
|
|
|
29.04.2013, 11:54
|
|
Частый гость
Регистрация: 25.03.2010
Адрес: Voronezh
Сообщений: 35
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: ADC+DMA stm32f4
Сообщение от STM32F4
|
У вас нет примеров подобной настройки?
|
для stm32f100 http://www.radiokot.ru/forum/download/file.php?id=99199
Пометка
Set up ADC, TIM1, DMA for conversion
Последний раз редактировалось Oleg Galizin; 29.04.2013 в 12:53.
|
|
|
Сказали "Спасибо" Oleg Galizin
|
|
|
29.04.2013, 13:58
|
|
Прописка
Регистрация: 31.03.2010
Сообщений: 200
Сказал спасибо: 3
Сказали Спасибо 48 раз(а) в 41 сообщении(ях)
|
Re: ADC+DMA stm32f4
Добрый день,
У меня в наличии есть плата STM32F4-Discovery, могу сделать пример под неё.
Я правильно понял вам нужно: преобразования АЦП стартуют от таймера, по окончанию преобразования контроллер ПДП забирает данные.
Это один из часто используемых режимов, думаю проблем не будет.
__________________
ziblog.ru
Последний раз редактировалось zheleznjakov; 29.04.2013 в 14:00.
Причина: примечание
|
|
|
Сказали "Спасибо" zheleznjakov
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:48.
|
|