Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32 ADC по таймеру
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Nikitoc
Всем привет. Пытаюсь настроить работу АЦП в stm32l152VB по таймеру 2.
При этом DMA должен складывать результаты преобразования в мой буфер. От него же прерывание, когда буфер заполниться полностью.

Собственно неясные вопросы:
1. Что такое events TIM2_CC2, TIM2_CC3, TIM2_TRGO ? В референс-мануале не нашел внятных пояснений, только замечание, что по этим ивентам может запускаться преобразование.
2. В каком режиме должен работать АЦП? Continuous or Single?
AHTOXA
Цитата(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.
Nikitoc
Цитата(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);


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

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

что то же самое:
Код
/* Enable the selected ADC DMA request */
ADC1->CR2 |= 0x00000100;
AHTOXA
А, точно, проглядел...
Попробуйте пораньше его включить, до включения собственно DMA.
Nikitoc
Не помогло. В статусном регистре в момент останова значение 0х00000072.
Т.е. установлены биты OVR, STRT, EOC и ADONS.

P.S.: АНТОХА, спасибо большое за участие, я разобрался. Не переопределен был дефайн ADC1_DR_Address. Я-то использовал примерчик для stm32f103, а на stm32l152 адрес немного отличается :-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.