30.4. 定时器初始化结构体详解¶
标准库函数对定时器外设建立了四个初始化结构体,基本定时器只用到其中一个即TIM_TimeBaseInitTypeDef,该结构体成员用于设置定时器基本工作参数,
并由定时器基本初始化配置函数TIM_TimeBaseInit调用,这些设定参数将会设置定时器相应的寄存器,达到配置定时器工作环境的目的。
这一章我们只介绍TIM_TimeBaseInitTypeDef结构体,其他结构体将在相关章节介绍。
初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如了。
初始化结构体定义在stm32h7xx_hal_tim.h文件中,初始化库函数定义在stm32h7xx_hal_tim.c文件中,编程时我们可以结合这两个文件内注释使用。
TIM外设管理结构体TIM_HandleTypeDef用于管理TIM外设的资源。
代码清单:基本定时器-1 定时器外设管理结构体(stm32h7xx_hal_tim.h文件)¶
1
2
3
4
5
6
7
8typedef struct {
TIM_TypeDef *Instance; /*!< 外设寄存器基地址 */
TIM_Base_InitTypeDef Init; /*!< 定时器时基单元初始化结构体 */
HAL_TIM_ActiveChannel Channel; /*!< TIM通道x */
DMA_HandleTypeDef *hdma[7]; /*!< DMA外设管理结构体 */
HAL_LockTypeDef Lock; /*!< 锁资源 */
__IO HAL_TIM_StateTypeDef State; /*!< TIM工作状态 */
} TIM_HandleTypeDef;
(1)
Instance:TIM寄存器基地址指针,所有参数都是指定基地址后才能正确写入寄存器。
(2)
Init:TIM时基单元初始化结构体,下面会详细讲解每一个成员。
(3)
Channel:TIMx的通道,可以选择HAL_TIM_ACTIVE_CHANNEL_1~HAL_TIM_ACTIVE_CHANNEL_6。
(4)
DMA_Handle:DMA外设管理结构体,用来配置TIM的DMA请求。
(5)
Lock:ADC锁资源。
(6)
State:TIM的工作状态。有HAL_TIM_STATE_READY,HAL_TIM_STATE_BUSY,HAL_TIM_STATE_TIMEOUT和HAL_TIM_STATE_ERROR等工作状态,方便用户排除错误。
代码清单:基本定时器-2 定时器基本初始化结构体¶
1
2
3
4
5
6
7
8typedef struct {
uint32_t Prescaler; /*!< 预分频器 */
uint32_t CounterMode; /*!< 计数模式 */
uint32_t Period; /*!< 定时器周期*/
uint32_t ClockDivision; /*!< 时钟分频 */
uint32_t RepetitionCounter; /*!< 重复计数器 */
uint32_t AutoReloadPreload; /*!< 自动重装载寄存器的值 */
} TIM_Base_InitTypeDef;
(1)
Prescaler:定时器预分频器设置,时钟源经该预分频器才是定时器时钟,它设定TIMx_PSC寄存器的值。可设置范围为0至65535,实现1至65536分频。
(2)
CounterMode:定时器计数方式,可是在为向上计数、向下计数以及三种中心对齐模式。基本定时器只能是向上计数,即TIMx_CNT只能从0开始递增,并且无需初始化。
(3)
Period:定时器周期,实际就是设定自动重载寄存器的值,在事件生成时更新到影子寄存器。可设置范围为0至65535。
(4)
ClockDivision:时钟分频,设置定时器时钟CK_INT频率与数字滤波器采样时钟频率分频比,基本定时器没有此功能,不用设置。
(5)
RepetitionCounter:重复计数器,属于高级控制寄存器专用寄存器位,利用它可以非常容易控制输出PWM的个数。这里不用设置。
(6)
AutoReloadPreload:自动重装载计数器的值。当ARPE位置0时,自动重装载计算器的值会立刻生效。
虽然定时器基本初始化结构体有6个成员,但对于基本定时器只需设置其中两个(时钟分频以及定时器周期)就可以,想想使用基本定时器就是简单。