stm32 库中有一段代码表现得很奇怪。这是从初始化结构到定时器自动重载寄存器的分配:
/* Set the Autoreload value */
TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
我有TIM_Period = 1999999
,但是在分配之后TIMx->ARR = 33919
。较小的数字通常表示溢出,所以我检查了:(1999999-33919) / 65536 = 30
。这意味着数字在 16 位数据类型上溢出 30 次,但两个变量都是 32 位无符号整数。从结构声明中提取:
对于 TIMx:
__IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */
对于 TIM_TimeBaseInitStruct:
uint32_t TIM_Period; /*!< Specifies the period value to be loaded into the active
Auto-Reload Register at the next update event.
This parameter must be a number between 0x0000 and 0xFFFF. */
其中__IO
定义为volatile
。
这是该作业的反汇编:
296 TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
0800c37c: ldr r3, [r7, #0]
0800c37e: ldr r2, [r3, #4]
0800c380: ldr r3, [r7, #4]
0800c382: str r2, [r3, #44] ; 0x2c
这里发生了什么..可能是外部原因导致值溢出吗?请注意,我正在通过 ST-Link 在真实硬件上进行调试,没有进行代码优化。