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

时间:2018-10-05 13:14:08

标签: c stm32 discovery

我想在运行程序时更改计时器时间

我采取不同的措施需要不同的计时器时间。 初始化后:

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 :(得分:0)

这是HAL库的问题。使用它们的人不知道背后是什么。

计时器周期是多少? 它是PCS(预分频器)和ARR(自动重载寄存器)的组合。周期计算为(ARR +1)*(PSC +1)/ TimerClockFreq。

当您尝试更改计时器的运行时间时,您需要确保在安全的时间内完成操作以防止毛刺。然后最安全的时刻是UG事件发生。

您必须将其归档:

  1. UG中断。在中断例程中,如果ARR或PSC已更改-您应该更新寄存器。请记住,如果寄存器被遮挡,则更改可能在下一个周期发生。

  2. 更多地使用计时器DMA突发。配置起来更加复杂-但是硬件负责在选定事件上更新寄存器。更改是即时的,寄存器阴影不会影响它。有关更多详细信息,请阅读RM章节中有关计时器DMA突发模式的信息。

如果要使用更高级的硬件功能,请忽略HAL,并使用具有完全控制权的裸寄存器对其进行编程。