STM32定时器详解(定时器中断实验)

STM32定时器分类

STM32的定时器分为很多类,按照功能的不同可以分为:

  • 高级定时器(TIM1和TIM8)
  • 通用定时器(TIM2-TIM5)
  • 基本定时器(TIM6和TIM7)
  • 看门狗定时器
  • SysTick定时器

本章主要讲解通用定时器。
STM32通用定时器主要是通过可编程预分频器(PSC)驱动的16位自动装载寄存器(CNT)构成。它的每个通用定时器都是完全独立的,没有互相共享任何资源。
通用TIMx(TIM2、TIM3、TIM4、TIM5)定时器功能包括:

  • 16位向上、向下、向上/向下自动装载计数器
  • 16位可编程(可实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间
  • 4个独立通道(TIMx_CH1~4),这些通道可以用来作为:输入捕获、输出比较、PWM生成(边缘或中间对齐模式)或单脉冲模式输出
  • 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用一个定时器控制另一个定时器)的同步电路
  • 产生相应事件的中断/DMA
    更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    触发事件:(计数器启动、停止、初始化或由内部/外部触发计数)
    输入捕获
    输出比较
  • 针对定位的增量(正交)编码器和霍尔传感器
  • 触发输入作为外部时钟或者按周期的电流管理

定时器中断实验

计数器时钟频率

通用定时器框图:
STM32通用定时器
通用定时器的时钟源可以通过TIMx_SMCR来进行配置。默认是000由内部时钟进行驱动。
TIMx_SMCR
这里通用定时器的时钟频率是由APB1的分频系数决定,如果APB1的预分频系数是1,则通用定时器的时钟频率等于APB1的时钟频率,否则为APB1时钟的2倍。
在这里插入图片描述
使用SystenInit函数初始化的时候,各时钟频率如下:
SYSCLK = 72M
AHB时钟 = 72M
APB1时钟=36M
所以APB1的分频系数=AHB/APB1=2
由此可得CK_INT的时钟频率为2*36M = 72M.

计数器的最终的频率还需要经过PSC预分频计算才能得到
在这里插入图片描述在这里插入图片描述
最终CK_CNT的时钟频率为
CK_CNT的时钟频率

计数器模式

向上计数模式

计数器时序图
这里设置TIMx_ARR计数器的值为0x36,当计数器从0计数到0x36的时候产生一个溢出事件。

库函数操作

设置通用定时器,并产生相应中断,主要分为以下几个步骤(以TIM3为例)

  1. TIM3时钟使能
  2. 设置TIM3_ARR和TIM3_PSC的值
  3. 设置TIM3_DIER允许更新中断
  4. 允许TIM3工作
  5. TIM3中断分组设置
  6. 编写中断服务函数

timer.c文件

#include "timer.h"

void TIM3_Int_Init(u16 arr,u16 psc)
{
  	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
	
	//定时器TIM3初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置采样频率分频比例
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
	TIM_Cmd(TIM3, ENABLE);  //使能TIMx					 
}
//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)  //检查TIM3更新中断发生与否
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx更新中断标志 
		LED1=!LED1;
	}
}

main.c文件

#include "timer.h"

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	
	TIM3_PWM_Init(40,0);
}

参考资料:

《ARM Cortex-M3体系结构与编程》
《原子哥教你玩STM32库函数版》
《STM32中文参考手册》

  • 27
    点赞
  • 215
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32定时器可以用于各种应用,比如延时、PWM、输入捕获、输出比较等。下面是STM32定时器的一些常用函数的详解: 1. 定时器时钟使能函数:`void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)` 该函数用于初始化指定的定时器时钟,并配置相应的GPIO口,以使能定时器。 2. 定时器初始化函数:`HAL_TIM_Base_Init(TIM_HandleTypeDef *htim)` 该函数用于初始化定时器,并配置定时器的基本参数,比如时钟源、预分频系数、计数模式等。 3. 定时器启动函数:`HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)` 该函数用于启动定时器,开始计数。 4. 定时器停止函数:`HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)` 该函数用于停止定时器计数。 5. 定时器计数值设置函数:`HAL_TIM_Base_SetCounter(TIM_HandleTypeDef *htim, uint32_t Counter)` 该函数用于设置定时器的计数值。 6. 定时器计数值读取函数:`uint32_t HAL_TIM_Base_GetCounter(TIM_HandleTypeDef *htim)` 该函数用于读取定时器的当前计数值。 7. 定时器中断使能函数:`HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)` 该函数用于使能定时器的中断功能,当定时器计数完成时,会自动触发中断。 8. 定时器中断回调函数:`void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)` 该函数为定时器中断回调函数,当定时器计数完成时,会自动调用该函数。在该函数中可以编写相应的中断处理程序。 以上是一些常用的STM32定时器函数的详解,可以根据需求选择相应的函数进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值