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

标签 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;

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

最佳答案

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

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

当您尝试更改计时器运行的时间段时,您需要确保在安全的时刻完成,以防止出现故障。最安全的时刻就是UG事件发生。

您有两种方法可以实现它:

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

  2. 使用定时器 DMA 突发更多。配置更复杂 - 但硬件负责所选事件的寄存器更新。更改是即时的,寄存器屏蔽不会影响它。更多详细信息请阅读 RM 章节中关于定时器 DMA 突发模式的内容。

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

关于运行应用程序 STM32F4 时更改定时器周期 [C],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52666451/

相关文章:

debugging - 通过openocd和gdb调试stm32f407时,Rust调试不会在断点处停止

c - STM32人工智能

web-services - 如何发现 RESTful Web 服务?

web-services - 是否有任何可用的公共(public) UDDI 注册中心?

c - 如何在 C 语言中的 STM32 QEMU 调试器 eclipse 上从 RAM 内存执行函数?

c++ - 了解 C/C++ 中的指针

c 函数指针返回值

c - 接近初始化结构警告

python - 在运行时发现 Java .jar 中的 Jython 模块?

c - 如果我想清空目录,是否有任何理由不应该删除它并重新创建它?