历史上的今天
今天是:2024年12月23日(星期一)
2021年12月23日 | STM32基本定时器 HAL库
2021-12-23 来源:eefocus
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++;
}
史海拾趣
|
各位大虾好, 我最近需要编程让系统进入UserIdle,SystemIdle和Suspend状态。 我的做法是: 1, 分别设置useridle, systemidle, suspend 的timeout时间 2, 将获取到的时间(以秒为单位)写到注册表HKEY_LOCAL_MACHINE\\\\System\\\\CurrentC ...… 查看全部问答> |
|
求助:Local ROM 和 NOR Flash 是什么意思啊?谢谢! 请教: 我在书上看到 Local ROM NOR Flash 问题1: Local ROM 是不是相当于电脑的 内存条? NOR Flash 是不是相当于电脑的 硬盘? 问题1: Local ROM 是什么? 还有别的 ROM 吗? ROM 的主要作用是什么? 问题2: NOR Flash 是什么 ...… 查看全部问答> |
|
ubuntu不能使用sudo apt-get install安装软件,该怎么办? apt-get install安装的软件的位置在哪?… 查看全部问答> |
|
1,开关电源的占空比 初学者总是不明白占空比跟输入电压输出电压的关系。以buck型为例,因为Vout=D*Vin,所以会有人考虑怎么根据输入电压和输出电压改变占空比。这个问题让我很难回答。 占空比是变化的,但不是根据 ...… 查看全部问答> |




