3

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 在真实硬件上进行调试,没有进行代码优化。

4

1 回答 1

4

我猜你的芯片有 16 位定时器寄存器。也就是说,它可能仍然是一个 32 位的寄存器,但其中只有 16 个有用的位。

就像是:

 31                16 15               0
+--------------------+------------------+
|      RESERVED      | Auto-reload value|
+--------------------+------------------+

即将进行的事实检查(如果您有可以帮助我的特定零件号)。

编辑:通过查看一些文档 [ PDF 链接],我的猜测似乎得到了证实:

在此处输入图像描述

编辑 2:既然您提到了您使用的芯片,我也发现了该文档 [ PDF 链接],其中包含这个方便的图表:

在此处输入图像描述

如您所见,有些定时器具有 32 位自动重载功能,而有些则没有。您选择的计时器会影响您看到的行为。

于 2013-07-31T17:14:31.097 回答