×

Внимание

Форум находится в режиме только для чтения.

STM32 режим захвата таймера с использованием DMA

9 года 7 мес. назад - 9 года 7 мес. назад #5641 от Vitdn
Добрый день Столкнулся с проблемой передачи значений регистра захвата таймера счетчика с использованием DMA. Захват работает в случае использования прерывания, однако не работает в режиме DMA. Вот текст программы, укажите ошибку.

настройка  DMA:

  DMA1_Channel6->CPAR = (uint32_t) & (TIM3->CCR1); // источник данных
  DMA1_Channel6->CMAR = (uint32_t) & TU[0] ;  // приемник данных
  DMA1_Channel6->CNDTR = 10 ; // количество передаваемых байт
  DMA1_Channel6->CCR=0x000025a3 ; // режим работы канала
 NVIC_EnableIRQ (DMA1_Channel6_IRQn) ; // разрешения прерывания по окончании записи данных


настройка таймера-счетчика:
 TIM3->CCMR1=0x00000011 ; // настраиваем вход IC1  TI3
 TIM3->CCER =0x00000001 ; // настройка условия захвата счетчика
 TIM3->DIER =0x00000200 ; // запрос DMA по IC1 каналу
 TIM3->CR1  =0x01 ; // запуск таймера-счетчика



в результате в массив TU записываются одинаковые числа.

Если указать:
TIM3->DIER =0x0000002 ; // запрос прерывания по захвату  IC1 каналу
то при обработке прерывания в регистре захвата защелкиваются верные значения.
9 года 7 мес. назад #5654 от Vitdn
Неужели ни у кого нет мыслей на этот счет?
9 года 7 мес. назад #5657 от Kerensky
У вас не указано по какому событию ДМА должен снимать показания, поэтому при включении он сразу подряд снимает 10 показаний. Эти "подряд" происходят очень быстро поэтому показания одинаковые.
Можно например настроить еще один таймер который при заполнении будет говорить ДМА что нужно снять еще один байт.
9 года 7 мес. назад - 9 года 7 мес. назад #5659 от Vitdn
как раз событие указано  - по захвату канала IC1 TIM3->DIER =0x00000200 ; // запрос DMA по IC1 каналу.


Проблему решил вчера, убрал цикличность  в настройках DMA.
Как мне кажется проблема состоит в следующем, что при обработки прерывания по окончанию записи DMA я выключал таймер счетчик, но тактирование модуля DMA не останавливал, из-за цикличности в  DMA перезаписывался счетчик - количество передаваемых данных, при этом на  вход таймера-счетчика поступали импульсы, которые нужно измерить, а как следствие условие захвата возникало на входе IC1 , DMA  и перезаписывал одно и тоже значение в массив данных.

Так что думайте глобально, когда пишите код  :);););)
Время создания страницы: 0.074 секунд
Работает на Kunena форум