STM32基本定时器 HAL库
程序员文章站
2022-03-13 17:32:00
...
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
- 基本定时器初始化
void BASIC_TIMx_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig;
htimx.Instance = BASIC_TIMx;
htimx.Init.Prescaler = BASIC_TIMx_PRESCALER;
htimx.Init.Period = BASIC_TIMx_PERIOD;
HAL_TIM_Base_Init(&htimx);
// 主/从和输出触发选择
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htimx, &sMasterConfig);
}
- 优先级配置
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++;
}
推荐阅读
-
STM32裸机开发基础篇01-开发环境搭建(HAL库)
-
STM32 HAL库中串口空闲中断+DMA 实现串口数据的不定长接收
-
【STM32】(F207)_HAL库开发教程(四)—串口FIFO使用
-
STM32基础教程 —— 使用HAL库(CubeMX)
-
STM32正点原子HAL库移植RT-Thread
-
《嵌入式-STM32开发指南》第二部分 基础篇 - 第4章 定时器(HAL库)
-
《嵌入式-STM32开发指南》第二部分 基础篇 - 第2章 Systick系统定时器(HAL)
-
【STM32F4】利用定时器实现最基本的定时功能(HAL)
-
【STM32F4】HAL库 CubeMX(九)--------定时器输入捕获实验
-
STM32 定时器的几种基本使用