【stm32】关于__HAL_TIM_SetAutoreload函数的bug

该函数本质上是对arr寄存器进行写操作,本人试验了无数方法,快要崩溃了最终得出结论,要么是mdk编译器优化有问题,要么是芯片寄存器有点毛病。 本人如果只用以下函数

__HAL_TIM_SetAutoreload(&htim3,R_Frq*T_Count);

烧录了差不多几十次才成功对arr写操作一次,在lcd上显示。

而如果我这样

__HAL_TIM_SetAutoreload(&htim3,R_Frq*T_Count-1);

那么将会完全成功。此处Frq等于4,T_Count也就是50~1500左右,两个数都是常数(uint32_t和uint8_t)。本人也魔怔了,进行了很多次强行转换各种操作,依然没用,不减一个数或者加一个数之后应该是完全没有对arr寄存器写进去,这点本人在lcd上测试有了验证。本人也是百思不得其解。

### 如何使用 `__HAL_TIM_SET_AUTORELOAD` 函数 `__HAL_TIM_SET_AUTORELOAD` 是 STM32 HAL 库中的一个宏定义,用于动态修改定时器的自动重载寄存器 (ARR) 值。此功能允许开发者在不重新初始化整个定时器的情况下调整其行为。 以下是有关该函数的具体说明: #### 宏定义解析 ```c #define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ do{ \ (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ } while(0) ``` - **参数解释** - `__HANDLE__`: 表示 TIM 的句柄结构体指针,通常是一个全局变量(如 `TIM_HandleTypeDef htimX`),其中 X 是具体的定时器编号。 - `__AUTORELOAD__`: 新的自动重载值,即计数器到达的最大值[^1]。 - **内部实现** - 将新的自动重载值写入到硬件寄存器 ARR 中。 - 同时更新句柄中保存的周期值 (`Init.Period`),以便后续可能再次调用 Init 或其他相关函数时保持一致性。 --- #### 使用场景与注意事项 当需要动态更改 PWM 频率或占空比时,可以分别通过以下两个函数来完成: - 设置自动重载值:`__HAL_TIM_SET_AUTORELOAD(htim, arr)`; - 设置比较值:`__HAL_TIM_SET_COMPARE(htim, Channel, cmp)`[^2]。 然而,在实际应用过程中需要注意一些潜在问题: 1. **影子寄存器的影响** 如果未启用影子寄存器,则新设置的自动重载值可能会立即生效。这种情况下,如果当前计数器值位于旧值和新值之间(即满足条件 `New_Autoreload < Count < Old_Autoreload`),可能导致异常行为,比如计数器无法正常工作直至溢出[^4]。 2. **编译器优化或硬件缺陷** 在某些特定条件下,可能出现即使正确设置了自动重载值却未能成功更新的现象。这可能是由于 MDK 编译器优化或者芯片本身的寄存器特性引起的[^3]。 因此建议始终遵循最佳实践并仔细验证结果。 --- #### 示例代码 假设我们正在配置 TIM3 来生成具有不同频率的 PWM 波形,可以通过如下方式调用上述 API: ```c // 动态调整PWM频率 uint32_t newFrequencyValue = CalculateDesiredFrequency(); // 自定义计算逻辑 __HAL_TIM_SET_AUTORELOAD(&htim3, newFrequencyValue); // 更新对应通道的比较值以改变占空比 uint32_t desiredDutyCycle = ComputeDutyCycle(newFrequencyValue); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, desiredDutyCycle); ``` 以上片段展示了如何联合运用这两个宏命令达成目标需求。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值