我希望在运行程序时更改计时器周期
我进行不同的测量需要不同的计时器周期。初始化后:
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);
在主功能I中设置:周期= 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;
但是计时器的周期不会改变。我该怎么做呢?
2条答案
按热度按时间3zwtqj6y1#
这就是HAL库的问题所在。使用它们的人不知道它背后是什么。
定时器周期是什么?它是PCS(预调用器)和ARR(自动重载寄存器)的组合。周期的计算公式为(ARR + 1)*(PSC + 1)/ TimerClockFreq。
当你试图改变计时器运行的周期时,你需要确保它是在安全的时刻完成的,以防止故障。最安全的时刻是UG事件发生时。
有两种方法可以实现:
1.更多地使用定时器DMA猝发。配置更复杂-但硬件负责所选事件的寄存器更新。更改是即时的,寄存器阴影不会对其产生影响。有关定时器DMA猝发模式的更多详细信息,请参阅RM章节。
如果您想使用更高级的硬件特性,请忘记HAL,并使用具有完全控制权的裸寄存器对其进行编程。
wgxvkvu92#
在运行时,通过更新自动重新加载寄存器,我们可以改变计时器的值。我实际上已经这样做了。
TIM 5-〉ARR =数值;//这是用于计时器5