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++;
}
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++;
}
举报