реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> stm32 ADC по таймеру, как настроить?
Nikitoc
сообщение Jan 6 2012, 00:27
Сообщение #1


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Всем привет. Пытаюсь настроить работу АЦП в stm32l152VB по таймеру 2.
При этом DMA должен складывать результаты преобразования в мой буфер. От него же прерывание, когда буфер заполниться полностью.

Собственно неясные вопросы:
1. Что такое events TIM2_CC2, TIM2_CC3, TIM2_TRGO ? В референс-мануале не нашел внятных пояснений, только замечание, что по этим ивентам может запускаться преобразование.
2. В каком режиме должен работать АЦП? Continuous or Single?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 6 2012, 12:57
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Nikitoc @ Jan 6 2012, 06:27) *
1. Что такое events TIM2_CC2, TIM2_CC3, TIM2_TRGO ?

Это события таймера 2 - от модулей захвата-сравнения 2 и 3 (обычно оспользуется модуль сравнения (output compare)), и по переполнению (update event).
Цитата(Nikitoc @ Jan 6 2012, 06:27) *
2. В каком режиме должен работать АЦП? Continuous or Single?

Single.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jan 6 2012, 22:35
Сообщение #3


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(AHTOXA @ Jan 6 2012, 15:57) *
Это события таймера 2 - от модулей захвата-сравнения 2 и 3 (обычно оспользуется модуль сравнения (output compare)), и по переполнению (update event).

Спасибо. Уже разобрался с горем пополам.
Пытался полдня прикрутить примерчик для stm32f103 - вроде бы все настроил, а бит ADONS в статусном регистре никак не устанавливается. Оказалось, что в stm32l152 АЦП тактируется и от APB2 (цифровая часть) и от HSI (аналоговая часть), который я "забыл" включить. Сейчас мучаюсь с настройками DMA. Преобразование заканчивается, а данные из регистра результата никуда не переносятся.
Вот такой код настройки DMA:
Код
  
       RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
       /* DMA1 Channel1 Configuration ----------------------------------------------*/
       DMA_DeInit(DMA1_Channel1);
       DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
       DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)my_buffer;
       DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
       DMA_InitStructure.DMA_BufferSize = 1024;
       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_M2M = DMA_M2M_Disable;
        
       DMA_Init(DMA1_Channel1, &DMA_InitStructure);
        /* Enable the End of Transfer Interrupt after each oversampling factor samples */
       DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
          
       /* Enable DMA channel1 IRQ Channel -----------------------------------------*/
       NVIC_SetPriority(DMA1_Channel1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0));
       NVIC_EnableIRQ(DMA1_Channel1_IRQn);  
    
       /* Enable DMA1 channel1 */
       DMA_Cmd(DMA1_Channel1, ENABLE);
      
       /* Enable ADC1 DMA */
       ADC_DMACmd(ADC1, ENABLE);


Может я чего забыл или неправильно сделал?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 6 2012, 22:40
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



В настройках АЦП не забыли включить DMA?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jan 6 2012, 22:54
Сообщение #5


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(AHTOXA @ Jan 7 2012, 01:40) *
В настройках АЦП не забыли включить DMA?

А разве последняя строка, в приведенном мной кусочке кода, не то что нужно?
Код
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);

что то же самое:
Код
/* Enable the selected ADC DMA request */
ADC1->CR2 |= 0x00000100;
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 6 2012, 22:59
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А, точно, проглядел...
Попробуйте пораньше его включить, до включения собственно DMA.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jan 6 2012, 23:15
Сообщение #7


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Не помогло. В статусном регистре в момент останова значение 0х00000072.
Т.е. установлены биты OVR, STRT, EOC и ADONS.

P.S.: АНТОХА, спасибо большое за участие, я разобрался. Не переопределен был дефайн ADC1_DR_Address. Я-то использовал примерчик для stm32f103, а на stm32l152 адрес немного отличается :-)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016