我想在运行程序时更改计时器时间
我采取不同的措施需要不同的计时器时间。 初始化后:
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;
但是计时器时间段不会改变。我该怎么做?
答案 0 :(得分:0)
这是HAL库的问题。使用它们的人不知道背后是什么。
计时器周期是多少? 它是PCS(预分频器)和ARR(自动重载寄存器)的组合。周期计算为(ARR +1)*(PSC +1)/ TimerClockFreq。
当您尝试更改计时器的运行时间时,您需要确保在安全的时间内完成操作以防止毛刺。然后最安全的时刻是UG事件发生。
您必须将其归档:
UG中断。在中断例程中,如果ARR或PSC已更改-您应该更新寄存器。请记住,如果寄存器被遮挡,则更改可能在下一个周期发生。
更多地使用计时器DMA突发。配置起来更加复杂-但是硬件负责在选定事件上更新寄存器。更改是即时的,寄存器阴影不会影响它。有关更多详细信息,请阅读RM章节中有关计时器DMA突发模式的信息。
如果要使用更高级的硬件功能,请忽略HAL,并使用具有完全控制权的裸寄存器对其进行编程。