|
STM32F4 ADC DMA ? |
|
|
|
Jul 22 2012, 14:14
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Помогите пожалуйста. Хочу запустить АЦД непрерывно на оцифровку последовательно 12 каналов, чтобы складывало с массив. Вот код. Не могу понять - после инициализации DMA, в его регисторах все нули. Пробовал заускать программу - в массиве тоже все нули. Код //volatile u16 ADCConvertedValue[12]; <- the results are here void adc_init(void){ ADC_InitTypeDef ADC_InitStruct; ADC_CommonInitTypeDef ADC_CommonInitStruct; DMA_InitTypeDef DMA_InitStructure; // ports are already configured RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); // enable clocking of ADC1 RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2,ENABLE); // enable clocking of DMA2 //==Configure DMA2 - Channel0 Stream 4== DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) &ADCConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = 12; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream4, &DMA_InitStructure); DMA_Cmd( DMA2_Stream4, ENABLE); // ADC: ADC_DeInit(); // turn ADC off ADC_CommonInitStruct.ADC_Mode =ADC_Mode_Independent; ADC_CommonInitStruct.ADC_Prescaler =ADC_Prescaler_Div4; ADC_CommonInitStruct.ADC_DMAAccessMode =ADC_DMAAccessMode_Disabled; ADC_CommonInitStruct.ADC_TwoSamplingDelay =ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStruct); ADC_StructInit(&ADC_InitStruct); ADC_InitStruct.ADC_Resolution =ADC_Resolution_12b; ADC_InitStruct.ADC_ScanConvMode =ENABLE; ADC_InitStruct.ADC_ContinuousConvMode =ENABLE; ADC_InitStruct.ADC_DataAlign =ADC_DataAlign_Right;//Left; ADC_InitStruct.ADC_NbrOfConversion =12; ADC_Init(ADC1,&ADC_InitStruct); //----channels order ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1,ADC_SampleTime_480Cycles);// PC0 ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2,ADC_SampleTime_480Cycles);// PC1 ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3,ADC_SampleTime_480Cycles);// PC2 ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4,ADC_SampleTime_480Cycles);// PC3 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 5,ADC_SampleTime_480Cycles);// PA0 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 6,ADC_SampleTime_480Cycles);// PA1 ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 7,ADC_SampleTime_480Cycles);// PA2 ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 8,ADC_SampleTime_480Cycles);// PA3 ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 9,ADC_SampleTime_480Cycles);// PA6 ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 10,ADC_SampleTime_480Cycles);// PA7 ADC_RegularChannelConfig(ADC1, ADC_Channel_14,11,ADC_SampleTime_480Cycles);// PC4 ADC_RegularChannelConfig(ADC1, ADC_Channel_15,12,ADC_SampleTime_480Cycles);// PC5 // enable ADC and DMA: ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE); //Enable ADC1 DMA ADC_Cmd(ADC1, ENABLE); //Enable ADC1 ADC_SoftwareStartConv(ADC1); // start ADC conversions } //----------------------------- Проц stm32f407, J-Link, Keil 4.23
|
|
|
|
|
 |
Ответов
|
Jul 24 2012, 09:48
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
А почему все зациклились на инициализации? Разве библиотека не навязывает использование ее же в обработчиках прерываний и вообще в любой точке кода, в которой нужно обращение к периферии? Интересно узнать от использующих библиотеку, во что выливается библиотечная функция чтения флага прерывания? Во что выливается сброс флага или двух флагов? Без библиотеки я знаю, чего мне это стоит: CODE 151:././../common/rf/transmitter.cpp **** DMA1->IFCR = DMA_IFCR_CHTIF3 | DMA_IFCR_CTCIF3; 1027 .loc 1 151 0 1028 003c 3C4B ldr r3, .L76+8 @ tmp165, 1029 003e 4FF4C062 mov r2, #1536 @ tmp166, 1030 0042 5A60 str r2, [r3, #4] @ tmp166, MEM[(struct DMA_TypeDef *)1073872896B].IFCR Могу ли я позволить себе тут полноценный вызов функции с подготовкой ее параметров и прочими накладными расходами? Наверное конкретно в этом случае могу, даже несмотря на то, что это обработчик прерывания. Но этот вызов будет лишь способствовать глобальному потеплению. А где-то эта лишняя задержка может уже существенно ударить по энергопотреблению или производительности конечного устройства. Полагаю, что все эти наши споры происходят лишь по одной причине - если бы обращения к библиотеке компилировались бы в такие же обращения к регистрам без лишних накладных расходов, то противников библиотеки практически не осталось бы. Я бы сам первый начал ее использовать. И чем больше людей бы ее использовали, тем быстрее в ней нашлись бы все (почти  ) ошибки. Но пока добавляемые библиотекой накладные расходы лично для меня неприемлемы. Кстати, будет интересно посмотреть, во что выливается DMA1->IFCR = DMA_IFCR_CHTIF3 | DMA_IFCR_CTCIF3; при использовании библиотеки. P.S. Вообще все эти войны С/Асм, С/С++, Регистры/библиотека очень напоминают замечательный мультик: http://www.youtube.com/watch?v=JMJXvsCLu6s...player_embedded
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 24 2012, 17:42
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Сергей Борщ @ Jul 24 2012, 11:48)  А почему все зациклились на инициализации? Разве библиотека не навязывает использование ее же в обработчиках прерываний и вообще в любой точке кода, в которой нужно обращение к периферии? Не знаю как другим, а мне - не навязывает. Я пользуюсь библиотеками, но там где time critical и надо шевелить ножками или флагами, пишу обычно типа: Код __INLINE void TestPinOn(void) { GPIOD->BSRRL = GPIO_Pin_15; } // 1=on, __INLINE void TestPinOff(void) { GPIOD->BSRRH = GPIO_Pin_15; } // 0=off __INLINE void TestPinToggle(void){ GPIOD->ODR ^= GPIO_Pin_15; }
|
|
|
|
|
Jul 24 2012, 19:57
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(demiurg_spb @ Jul 24 2012, 22:05)  Тот кто привык щи лаптем хлебать того уже более прогрессивным прибором не заманишь к столу. Без обид... Да какие обиды... Вопрос в их прогрессивности. Чем такой варинт хуже Код __INLINE void TestPinOn(void) { GPIOD->BSRRL = GPIO_Pin_15; } ? Тем более при усложнившейся структуре портов. Не усложнятся ли макросы до полной непонятности? Получится тоже что "писать в регистры" vs "использовать библиотеку". Цитата(demiurg_spb @ Jul 24 2012, 22:05)  Вы внимательнее ознакомьтесь с этими макросами и возможно осознаете всю их прелесть. Всё возможно... Цитата(demiurg_spb @ Jul 24 2012, 22:05)  Конечно их можно и нужно заменить на шаблоны при переходе на с++ Теоритически можно, и наверное нужно. Но как-то руки не доходят.
|
|
|
|
|
Jul 25 2012, 05:47
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(_Артём_ @ Jul 24 2012, 23:57)  Чем такой варинт хуже Код __INLINE void TestPinOn(void) { GPIOD->BSRRL = GPIO_Pin_15; } ? этот теоретически ничем, а вот с инверсией INLINE процедура содержит реальную багу (не обеспечивает атомарного доступа) и при условии что в прерываниях происходит запись в тот же порт будут танцы с бубном. Чтобы пофиксить это нужно работать через bitband или переписать как Код if (pin==1) pin=0; else pin=1; Поищите по форуму, это уже обсуждалось не один раз. Цитата Тем более при усложнившейся структуре портов. Не усложнятся ли макросы до полной непонятности? Получится тоже что "писать в регистры" vs "использовать библиотеку". Нет ничего не усложнится. Суть этих макросов в повторном использовании кода с целью сделать проект прозрачным, переносимым и легко модифицируемым. В случае не использования макросов вам придётся писать для каждого пина снова и снова по 3-4 инлайн процедуры, потом при переразводке платы снова править в 3-4 местах и не дай Бог где-то что-то упустить. Неужели это радостная и продуктивная работа? Цитата(Allregia @ Jul 25 2012, 09:24)  В общем виде порт и пин задаются дефайнами а не в явном виде. А потом вдруг требуется инвертировать один из сигналов по какой-либо причине. И? Сели в лужу?
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jul 25 2012, 07:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(demiurg_spb @ Jul 25 2012, 07:47)  А потом вдруг требуется инвертировать один из сигналов по какой-либо причине. И? Сели в лужу? Ну так я потрачу 5 минут своего драгоценного времени, на то чтобы поменять в одном месте местами BSRRL и BSRRH, только и всего. Все равно 99.999% времени занимает основная задача, а не настройка портов и т.п. Я даже на PIC16 таким не заморачивался, хотя понятное дело что сложность решаемых задач там пониже. Помнить все флаги и биты регистров это конечно хорошо, но я предпочитаю их посмотреть в букваре когда пишу настройки и работу с периферией, а после этого сразу поскорее забыть
|
|
|
|
|
Jul 25 2012, 11:48
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(ViKo @ Jul 25 2012, 09:30)  Но, видимо, на регистры и биты ADC, DMA у вас аллергия? Такой стиль называется "эклектика". У меня не аллергия, но делая прибор на процессорах типа Кортексов, я хочу сосредатачиваться на основной задаче, а не на побочных, типа настойки периферии. Т.е. если у меня идет прием ЭКГ (электрокардиограммы) с АЦП, обработка и выдача результатов на дисплей и в УАРТ, то 99.99% времени я предпочитаю тратить не на настройку АЦП, дисплея и УАРТа, и копание в их битах, а на прикладные вопросы, связанные с ЭКГ и ее обработкой и отображением. Что поверьте мне, гораздо более трудоемко и наукоемко. (тем более, что кроме программы я еще и все железо делаю).
|
|
|
|
|
Jul 25 2012, 11:57
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(Allregia @ Jul 25 2012, 14:48)  99.99% времени я предпочитаю тратить не на настройку АЦП, дисплея и УАРТа, и копание в их битах, а на прикладные вопросы, связанные с ЭКГ и ее обработкой и отображением. Что поверьте мне, гораздо более трудоемко и наукоемко. Верю. Достойное дело. Но если использовать библиотечные функции для работы (не инициализации) с периферией, то можно понапрасну растерять производительность микроконтроллера, так, что на фильтрацию и отображение уже и не хватит.
|
|
|
|
Сообщений в этой теме
Allregia STM32F4 ADC DMA ? Jul 22 2012, 14:14 Allregia Ошибка была чисто механическая:
RCC_AHB1PeriphRe... Jul 23 2012, 07:27 ViKo Цитата(Allregia @ Jul 23 2012, 10:27) Оши... Jul 23 2012, 07:44  kan35 Цитата(ViKo @ Jul 23 2012, 11:44) А не на... Jul 23 2012, 08:02   ViKo Цитата(kan35 @ Jul 23 2012, 11:02) Вы про... Jul 23 2012, 08:11  Allregia Цитата(ViKo @ Jul 23 2012, 09:44) А не на... Jul 23 2012, 10:32 kan35 Allregia,
абсолютно правильный подход. Еще добавлю... Jul 23 2012, 10:42 ViKo Цитата(kan35 @ Jul 23 2012, 13:42) Allreg... Jul 23 2012, 11:15  Allregia Цитата(ViKo @ Jul 23 2012, 13:15) Так-так... Jul 23 2012, 11:51   ViKo Цитата(Allregia @ Jul 23 2012, 14:51) Мож... Jul 23 2012, 12:10    Allregia Цитата(ViKo @ Jul 23 2012, 14:10) А на эт... Jul 23 2012, 12:46     ViKo Цитата(Allregia @ Jul 23 2012, 15:46) Кон... Jul 23 2012, 12:58 kan35 Не преувеличивайте. Инициализация периферии занима... Jul 23 2012, 11:47 ViKo Цитата(kan35 @ Jul 23 2012, 14:47) за иде... Jul 23 2012, 11:49  Allregia Цитата(ViKo @ Jul 23 2012, 13:49) За нее.... Jul 23 2012, 12:34   ViKo Цитата(Allregia @ Jul 23 2012, 15:34) Сра... Jul 23 2012, 12:37 kan35 ViKo,
Оптимизация ради оптимизации приносит только... Jul 23 2012, 12:48 kan35 Это плюс несомненно.
А вообще, вы задавались вопро... Jul 23 2012, 13:30 ViKo Цитата(kan35 @ Jul 23 2012, 16:30) Это ко... Jul 23 2012, 19:38 AlexandrY Цитата(kan35 @ Jul 23 2012, 16:30) Это пл... Jul 23 2012, 20:04  VslavX Цитата(AlexandrY @ Jul 23 2012, 23:04) А ... Jul 24 2012, 03:50  kan35 Цитата(AlexandrY @ Jul 24 2012, 00:04) Дл... Jul 24 2012, 04:10   demiurg_spb Я использую библиотеки и могу сказать, что они сле... Jul 24 2012, 06:51 demiurg_spb Цитата(Сергей Борщ @ Jul 24 2012, 13:48) ... Jul 24 2012, 16:16      Allregia Цитата(_Артём_ @ Jul 24 2012, 21:57) Да к... Jul 25 2012, 05:24           Allregia Цитата(ViKo @ Jul 25 2012, 13:57) Верю. Д... Jul 25 2012, 14:46   Allregia Цитата(demiurg_spb @ Jul 24 2012, 19:47) ... Jul 24 2012, 19:42 kan35 ViKo,
никто не отрицает, что работа через библиоте... Jul 25 2012, 12:26 ViKo Цитата(kan35 @ Jul 25 2012, 15:26) никто ... Jul 25 2012, 12:50  kan35 Цитата(ViKo @ Jul 25 2012, 16:50) Еще нед... Jul 26 2012, 05:52   ViKo Цитата(kan35 @ Jul 26 2012, 08:52) Viko, ... Jul 26 2012, 07:58 kan35 То, что по DMA работа (пусть даже внешняя память--... Jul 26 2012, 08:36 ViKo Цитата(kan35 @ Jul 26 2012, 11:36) То, чт... Jul 26 2012, 08:45 kan35 Действитеьлно, флаг ловить лучше в прерывании. DMA... Jul 26 2012, 08:58 ViKo Цитата(kan35 @ Jul 26 2012, 11:58) Действ... Jul 26 2012, 10:41 kan35 В основной программе ждать семафора, в прерывании ... Jul 26 2012, 12:00 Allregia Вопрос немного в сторону, про М4 и настройки Кейла... Jul 26 2012, 20:29 ViKo На все ваши вопросы здесь уже были ответы. Поищите... Jul 31 2012, 09:35 Allregia Цитата(ViKo @ Jul 31 2012, 11:35) На все ... Aug 2 2012, 14:03 сарматъ помогите пожалуйста, пытаюсь запустить ацп вот так... Nov 19 2012, 05:34 сарматъ конкретно не работает непрерывное преобразование п... Nov 19 2012, 09:03 сарматъ все равно надо каждый раз делать
ADC1->CR2... Nov 19 2012, 12:40 Flexz Перепишите на обычные (regular) каналы, injected н... Nov 19 2012, 15:28 сарматъ упс... а в f100 работали...
спасибо Nov 19 2012, 15:37 Haamu Необходимо измерить сигнал с нескольких каналов по... Jan 9 2014, 08:17
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|