STM32
直播中

jsqueh

8年用户 1195经验值
私信 关注
[问答]

STM32f1单片机的HAL库是如何去定义定时器相关的初始化结构体的

STM32F1定时器可分为哪几类呢?
STM32f1单片机的HAL库是如何去定义定时器相关的初始化结构体的?


回帖(1)

陈亮

2021-11-23 14:30:10
  1.定时器分类
  STM32F1系列中,除了互联型的产品,共有8个定时器,分为基本定时器、通用定时器和高级定时器。
  基本定时器是一个16位只能向上计数的定时器,只能定时,没有外部IO。
  通用定时器是一个16位可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部IO。
  高级定时器是一个16位可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有8个外部IO。
  
  2.基本定时器功能框图
  
  时钟源:定时器时钟TIMxCLK(内部时钟CK_INT),是经APB1预分频器后分频提供,APB1预分频系数为1,则频率不变,否则*2;
  计数器时钟:定时器时钟经过PSC预分频器后,得到CK_CNT用来驱动计数器计数,PSC是一个16位的预分频器,所以CK_CNT=TIMxCLK/(PSC+1);
  计数器:计数器CNT是一个16位的计数器,只能向上计数,最大计数值65535,。CNT计数达到自动重装载寄存器的时候产生更新时间,并清零从头计数;
  自动重装载寄存器(ARR):ARR是一个16位的寄存器,定义着CNT能够计数的最大值
  3.定时器初始化结构体
  STM32f1系列单片机的HAL库,定义了4个定时器相关的初始化结构体,基本定时器只用到其中的TIM_TimeBaseInitTypeDef
  typedef struct {
  uint32_t Prescaler; // 预分频器
  uint32_t CounterMode; // 计数模式
  uint32_t Period; // 定时器周期
  uint32_t ClockDivision; // 时钟分频
  uint32_t RepetitionCounter; // 重复计算器
  } TIM_TimeBaseInitTypeDef;
  Prescaler:设置TIMx_PSC寄存器的值,设置范围0~65535;
  CounterMode:定时器计数方式,可设置为向上计数、向下计数以及三种中心对其模式。基本定时器只能向上计数,所以该参数无需设置;
  Period:定时器周期,设置ARR的值;
  ClockDivision:时钟分频,设置定时器时钟CK_INT频率与数字滤波器采样时钟频率比,基本定时器无此功能;
  RepetitionCounter:重复计数器,属于高级控制寄存器专用寄存器位,可以控制输出PWM个数;
  4.编程要点
  宏定义
  // 定义定时器预分频,定时器实际时钟频率为:72MHz/(BASIC_TIMx_PRESCALER+1)
  #define BASIC_TIMx_PRESCALER 71
  // 定义定时器周期,当定时器开始计数到BASIC_TIMx_PERIOD值是更新定时器并生成对应事件和中断
  #define BASIC_TIMx_PERIOD 1000
  #define BASIC_TIMx TIM6
  #define BASIC_TIM_RCC_CLK_ENABLE() __HAL_RCC_TIM6_CLK_ENABLE()
  #define BASIC_TIM_RCC_CLK_DISABLE() __HAL_RCC_TIM6_CLK_DISABLE()
  #define BASIC_TIM_IRQ TIM6_IRQn
  #define BASIC_TIM_INT_FUN TIM6_IRQHandler
  基本定时器初始化
  // 定义定时器预分频,定时器实际时钟频率为:72MHz/(BASIC_TIMx_PRESCALER+1)
  #define BASIC_TIMx_PRESCALER 71
  // 定义定时器周期,当定时器开始计数到BASIC_TIMx_PERIOD值是更新定时器并生成对应事件和中断
  #define BASIC_TIMx_PERIOD 1000
  #define BASIC_TIMx TIM6
  #define BASIC_TIM_RCC_CLK_ENABLE() __HAL_RCC_TIM6_CLK_ENABLE()
  #define BASIC_TIM_RCC_CLK_DISABLE() __HAL_RCC_TIM6_CLK_DISABLE()
  #define BASIC_TIM_IRQ TIM6_IRQn
  #define BASIC_TIM_INT_FUN TIM6_IRQHandler
  优先级配置
  void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
  {
  /* 基本定时器外设时钟使能 */
  BASIC_TIM_RCC_CLK_ENABLE();
  /* 外设中断配置 */
  HAL_NVIC_SetPriority(BASIC_TIM_IRQ, 1, 0);
  HAL_NVIC_EnableIRQ(BASIC_TIM_IRQ);
  }
  中断服务函数
  extern TIM_HandleTypeDef htimx;
  /**
  * @brief This function handles TIM6 global interrupt.
  */
  void BASIC_TIM_INT_FUN(void)
  {
  HAL_TIM_IRQHandler(&htimx);
  }
  void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  {
  time++;
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分