- Главная
- Форум
- Микроконтроллеры и Системы на Модуле (SOM)
- Микроконтроллеры
- STM32 режим захвата таймера с использованием DMA
- Форум
- Микроконтроллеры и Системы на Модуле (SOM)
- Микроконтроллеры
- STM32 режим захвата таймера с использованием DMA
STM32 режим захвата таймера с использованием DMA
- Vitdn
- Автор темы
- Посетитель
10 года 2 мес. назад - 10 года 2 мес. назад #5641
от Vitdn
Vitdn создал тему: STM32 режим захвата таймера с использованием DMA
Добрый день Столкнулся с проблемой передачи значений регистра захвата таймера счетчика с использованием 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 каналу
то при обработке прерывания в регистре захвата защелкиваются верные значения.
настройка 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 каналу
то при обработке прерывания в регистре захвата защелкиваются верные значения.
Последнее редактирование: 10 года 2 мес. назад пользователем .
- Vitdn
- Автор темы
- Посетитель
10 года 2 мес. назад #5654
от Vitdn
Vitdn ответил в теме Re: STM32 режим захвата таймера с использованием DMA
Неужели ни у кого нет мыслей на этот счет?
- Kerensky
- Посетитель
10 года 2 мес. назад #5657
от Kerensky
Kerensky ответил в теме Re: STM32 режим захвата таймера с использованием DMA
У вас не указано по какому событию ДМА должен снимать показания, поэтому при включении он сразу подряд снимает 10 показаний. Эти "подряд" происходят очень быстро поэтому показания одинаковые.
Можно например настроить еще один таймер который при заполнении будет говорить ДМА что нужно снять еще один байт.
Можно например настроить еще один таймер который при заполнении будет говорить ДМА что нужно снять еще один байт.
- Vitdn
- Автор темы
- Посетитель
10 года 2 мес. назад - 10 года 2 мес. назад #5659
от Vitdn
Vitdn ответил в теме Re: STM32 режим захвата таймера с использованием DMA
как раз событие указано - по захвату канала IC1
TIM3->DIER =0x00000200 ; // запрос DMA по IC1 каналу.
Проблему решил вчера, убрал цикличность в настройках DMA.
Как мне кажется проблема состоит в следующем, что при обработки прерывания по окончанию записи DMA я выключал таймер счетчик, но тактирование модуля DMA не останавливал, из-за цикличности в DMA перезаписывался счетчик - количество передаваемых данных, при этом на вход таймера-счетчика поступали импульсы, которые нужно измерить, а как следствие условие захвата возникало на входе IC1 , DMA и перезаписывал одно и тоже значение в массив данных.
Так что думайте глобально, когда пишите код
Проблему решил вчера, убрал цикличность в настройках DMA.
Как мне кажется проблема состоит в следующем, что при обработки прерывания по окончанию записи DMA я выключал таймер счетчик, но тактирование модуля DMA не останавливал, из-за цикличности в DMA перезаписывался счетчик - количество передаваемых данных, при этом на вход таймера-счетчика поступали импульсы, которые нужно измерить, а как следствие условие захвата возникало на входе IC1 , DMA и перезаписывал одно и тоже значение в массив данных.
Так что думайте глобально, когда пишите код
Последнее редактирование: 10 года 2 мес. назад пользователем .
- Форум
- Микроконтроллеры и Системы на Модуле (SOM)
- Микроконтроллеры
- STM32 режим захвата таймера с использованием DMA
Время создания страницы: 0.047 секунд