我想在运行程序时更改计时器周期
我采取不同的措施,需要不同的计时器周期。 初始化后:
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;
但是计时器周期不会改变。我该怎么做?
最佳答案
这是 HAL 库的问题。使用它们的人不知道其背后是什么。
定时器周期是多少? 它是PCS(预调用器)和ARR(自动重载寄存器)的组合。周期的计算公式为 (ARR + 1) * (PSC + 1)/TimerClockFreq。
当您尝试更改计时器运行的时间段时,您需要确保在安全的时刻完成,以防止出现故障。最安全的时刻就是UG事件发生。
您有两种方法可以实现它:
UG 中断。在中断例程中,如果 ARR 或 PSC 已更改 - 您应该更新寄存器。请记住,如果寄存器被屏蔽,则更改可能会在下一个周期发生。
使用定时器 DMA 突发更多。配置更复杂 - 但硬件负责所选事件的寄存器更新。更改是即时的,寄存器屏蔽不会影响它。更多详细信息请阅读 RM 章节中关于定时器 DMA 突发模式的内容。
如果您想使用更高级的硬件功能,请忘记 HAL,并使用具有完全控制权的裸寄存器对其进行编程。
关于运行应用程序 STM32F4 时更改定时器周期 [C],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52666451/