运行应用程序STM32F4 [C]时更改定时器周期

iyfjxgzm  于 2022-12-11  发布在  其他
关注(0)|答案(2)|浏览(395)

我希望在运行程序时更改计时器周期
我进行不同的测量需要不同的计时器周期。初始化后:

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;

但是计时器的周期不会改变。我该怎么做呢?

3zwtqj6y

3zwtqj6y1#

这就是HAL库的问题所在。使用它们的人不知道它背后是什么。
定时器周期是什么?它是PCS(预调用器)和ARR(自动重载寄存器)的组合。周期的计算公式为(ARR + 1)*(PSC + 1)/ TimerClockFreq。
当你试图改变计时器运行的周期时,你需要确保它是在安全的时刻完成的,以防止故障。最安全的时刻是UG事件发生时。
有两种方法可以实现:

  1. UG中断。在中断程序中,如果ARR或PSC发生了变化,你应该更新寄存器。要记住,如果寄存器被屏蔽,变化可能会在下一个周期发生。
    1.更多地使用定时器DMA猝发。配置更复杂-但硬件负责所选事件的寄存器更新。更改是即时的,寄存器阴影不会对其产生影响。有关定时器DMA猝发模式的更多详细信息,请参阅RM章节。
    如果您想使用更高级的硬件特性,请忘记HAL,并使用具有完全控制权的裸寄存器对其进行编程。
wgxvkvu9

wgxvkvu92#

在运行时,通过更新自动重新加载寄存器,我们可以改变计时器的值。我实际上已经这样做了。
TIM 5-〉ARR =数值;//这是用于计时器5

相关问题