【STM32】基本定时器

基于stm32f103
基于《零死角玩转STM32—F103指南者》进行学习

定时器

分类

基本定时器,通用定时器,高级定时器
在这里插入图片描述

功能框图

简单来说就是来自APB或者AHB的时钟,经过PSC(1到65535分频),形成时基,每经过一个时基,TIM的cnt计数有一次,根据寄存器的配置,发生更新事件,比较事件等。
在这里插入图片描述

时钟源(预分频不为1时,需要乘2)

1.基本定时器时钟挂载在 APB1 总线,所以它的时钟来自于 APB1 总线
2.不直接由 APB1 总线直接提供,而是先经过一个倍频器
  APB1 的预分频器系数为 1 时,这个倍频器系数为 1。
  当 APB1 的预分频器系数≥2 分频时,这个倍频器系数就为 2 , 即定时器的时钟频率等于 APB1总线时钟频率的两倍 。
  这里的预分频器指的是APB1的分频,而不是上图的PSC预分频器
3.对APB1进行预分频的步骤一般在systeminit函数中,也就是启动文件中,reset_handle()函数中启动的。一般来说由库函数自动给我们设置,库函数中 APB1 预分频的系数是 2,即PCLK1=36M,所以定时器时钟 TIMxCLK=36*2=72M。

TIM的预分频器 运行时可写,更新事件发生后启用

1.预分频可以以系数介于1至65536之间的任意数值对计数器时钟分频。
2.可以在运行中改变这个PSC,但是它的生效会在CNT计数器记到下一个更新事件。
预分频系数从1变到2的计数器时序图
在这里插入图片描述

计数器 CNT

1.根据分频,开始计数
2.从0累加计数到自动重装载数值(TIMx_ARR寄存器),然后再重新开始计数并产生一个计数器溢出事件。
3.每次计数器溢出时可以产生更新事件;(通过软件或使用从模式控制器)设置TIMx_EGR寄存器的UG位也可以产生更新事件。

自动重装载寄存器

自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。

范例

基本定时器配置

 void BASIC_TIM_Config(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

	// 开启定时器时钟,即内部时钟 CK_INT=72M
	BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);

	// 自动重装载寄存器周的值(计数值)
	TIM_TimeBaseStructure.TIM_Period=1000;
 
	 // 累计 TIM_Period 个频率后产生一个更新或者中断
	 // 时钟预分频数为 71,则驱动计数器的时钟 CK_CNT = CK_INT / (71+1)=1M
	 TIM_TimeBaseStructure.TIM_Prescaler= 71;
	 // 时钟分频因子 ,基本定时器没有,不用管
	 //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

	 // 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
	 //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

	 // 重复计数器的值,基本定时器没有,不用管
	 //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

	 // 初始化定时器
	 TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);

	 // 清除计数器中断标志位
	 TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);

	 // 开启计数器中断
	 TIM_ITConfig(BASIC_TIM, TIM_IT_Update, ENABLE);

	 // 使能计数器
	 TIM_Cmd(BASIC_TIM, ENABLE);

	 // 暂时关闭定时器的时钟,等待使用
	 BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, DISABLE);
 }

中断优先级配置

void BASIC_TIM_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// 设置中断组为 0
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
// 设置中断来源
NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;
// 设置主优先级为 0
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 // 设置抢占优先级为 3
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);
}
### STM32 基本定时器使用方法与原理 STM32基本定时器(Basic Timer),也称为 TIM6 和 TIM7,在内部结构上较为简单,主要用于时间测量和产生延时功能。这类定时器不具备输入捕获、输出比较等功能。 #### 定时器工作模式 基本定时器通过计数预装载寄存器中的数值来实现定时操作。当计数器达到自动重装载寄存器中设定的最大值时,会产生更新事件并重新从0开始计数[^1]。 ```c // 初始化TIM6作为基本定时器 void MX_TIM6_Init(void) { __HAL_RCC_TIM6_CLK_ENABLE(); // 使能TIM6时钟 TIM_HandleTypeDef htim6; htim6.Instance = TIM6; htim6.Init.Period = 999; // 自动重装载值设置为999 htim6.Init.Prescaler = 8399; // 预分频系数设为8399, 即APB1频率除以8400 htim6.Init.ClockDivision = 0; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_Base_Init(&htim6); // 初始化定时器基类成员函数 } ``` 上述代码配置了一个基于向上计数模式的定时器实例 `htim6` ,其中 Period 参数决定了定时周期长度;Prescaler 则用于调整实际的工作频率。 #### 中断处理机制 为了响应定时溢出中断请求,需编写相应的回调服务程序: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM6){ /* 用户自定义的功能 */ } } /* 在启动文件内声明弱函数覆盖默认版本 */ __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){} ``` 每当发生一次满量程溢出后就会触发该ISR入口点执行特定任务逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值