Изменить период таймера при запуске приложения STM32F4 [C] - PullRequest
0 голосов
/ 05 октября 2018

Я хочу изменить период таймера во время работы программы

Я принимаю разные меры, требующие разных периодов таймера.После инициализации:

TIM_TimeBaseInitStructure.TIM_Period = period - 1; 
TIM_TimeBaseInitStructure.TIM_Prescaler = 8399+1;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);

В основной функции я установил: period = 10000;

Затем я получаю новое значение через UART и пытаюсь установить другое значение:

arr3[0] = received_str[11];
arr3[1] = received_str[12];
arr3[2] = received_str[13];
arr3[3] = received_str[14];
arr3[4] = received_str[15];
arr3[5] = '\0';
per = atoi(arr3);
period = per;

Но период таймера не меняется.Как мне это сделать?

1 Ответ

0 голосов
/ 05 октября 2018

Это проблема с библиотеками HAL.Люди, которые их используют, понятия не имеют, что за этим стоит.

Что такое период таймера?Это комбинация PCS (prescaller) и ARR (регистр автоматической перезагрузки).Период рассчитывается как (ARR + 1) * (PSC + 1) / TimerClockFreq.

Когда вы пытаетесь изменить период, когда работает таймер, вы должны убедиться, что это сделано в безопасный момент.чтобы предотвратить глюки.Самый безопасный момент - событие UG.

У вас есть способы архивации:

  1. Прерывание UG.В процедуре прерывания, если ARR или PSC изменились - вы должны обновить регистр.Имейте в виду, что изменение может произойти в следующем цикле, если регистры будут затенены.

  2. При использовании таймеров DMA лопнет больше.Конфигурировать его сложнее, но аппаратное обеспечение заботится об обновлении регистров выбранного события.Изменение происходит мгновенно, и затенение регистра не влияет на него.Подробнее читайте в главе RM о режиме пакетной обработки DMA таймеров.

Если вы хотите использовать более продвинутые аппаратные функции, забудьте о HAL и запрограммируйте его, используя пустые регистры с полным контролем.

...