4、TIMER实验

本文详细介绍了如何在STM32中使用通用定时器GPIO-TIMER,特别是TIMER2,包括初始化步骤、中断服务函数的编写及主要函数解析。通过设置计数值和分频值实现不同时间精度的定时,同时提供了两种中断处理方式。文中还展示了简化和完整框架的初始化流程,帮助理解定时器工作原理。
摘要由CSDN通过智能技术生成

GPIO-TIMER​(​通用定时器)⚡️

使用TIMER流程(例中使用TIMER2)⚡️

1️⃣:在最上方包含Timer的头文件

  • #include “Timer.h”

2️⃣:在TIMER头文件选择需要的定时器初始化函数,拷贝到main.c中,并设置 计数值和分频值

  • Timer2_init(addr,PSC);

  • 设置方法:定时单位时间 = 计数值(addr) *分频值(PSC+1) /时钟(72MHz)

  • 定时单位时间1s : Timer2_init(9999,7199); //1s =( 9999+1) x (7199+1)÷72MHz

  • 定时单位时间1ms : Timer2_init(999,71); //1ms =( 999+1) x (71+1)÷72MHz

3️⃣:编写中断函数,中断所需要的执行的内容😄

方法一 :

  • 中断函数计数,main.c判断计数值然后再main.c中执行

void TIM2_IRQHandler(void)
{
	static u8 cnt=0;
    if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
		{
			cnt++;
      		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
		}
}

方法二:

  • 直接在中断函数中执行

void TIM2_IRQHandler(void)
{
	static u8 cnt=0;
    if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
		{
			cnt++;
      		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
		}
	if(cnt==cnt_end)
	{
		//用户执行代码
		...
	}
}
1

<font color = "blue"o.>中断标志函数: TIM_GetITStatus(TIM2,TIM_IT_Update);

清除中断标志函数: TIM_ClearITPendingBit(TIM2,TIM_IT_Update);——中断后一定要手动复位中断标志(添加该函数).

编写TIMER流程 ⚡️

框架总览

* 简化框架

void Timer2_init(u16 CNT, u16 PSC)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//打开对应的时钟使能
    Timer_init(CNT, PSC);							   //初始化定时器
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);		   //选择定时器,选择中断方式,使能中断
    NVIC_init();									   //设置抢占优先级
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	   //选择抢占优先组
    TIM_Cmd(TIM2,ENABLE);							   //使能TIMER2
}

* 整体框架

void Timer2_init(u16 CNT, u16 PSC)
{
	//-------------定义结构体----------------------
    NVIC_InitTypeDef NVIC_InitStruct;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
	//-------打开定时器所在时钟树的时钟-------------
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//打开对应的时钟使能
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择抢占优先组
	
    TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;//不影响时钟频率,可以不用管
    TIM_TimeBaseStruct.TIM_CounterMode   = TIM_CounterMode_Down;//向下计数
    TIM_TimeBaseStruct.TIM_Period        = CNT;//Period-周期  即周期计数值
    TIM_TimeBaseStruct.TIM_Prescaler     = PSC; //Prescaler-分频器  
    TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;//没用不用管
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStruct);//初始化定时器2
	
    NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;//选择要设计中断请求的通道
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能通道
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;//主优先级
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;//子优先级
    NVIC_Init(&NVIC_InitStruct);//设置抢占优先级

    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//选择定时器,选择中断方式,使能中断
    TIM_Cmd(TIM2,ENABLE);//使能TIMER2
}
  

主要函数解析🙂

❀接下来开始解析框架总览的函数
  • 初始化TIMER流程

1️⃣ :RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

打开对应定时器的时钟。

2️⃣ :TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStruct);

初始化对应的定时器。

3️⃣ :NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

选择抢占优先级组,为后续优先级选择提供选择空间。

4️⃣ :NVIC_Init(&NVIC_InitStruct);

初始化中断抢占优先级参数

5️⃣ :TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

选择定时器,选择中断方式,选择中断(ENABLE-中断/DISABLE-事件)

6️⃣ :TIM_Cmd(TIM2,ENABLE);

使能中断


  • TIMER中断服务函数

1️⃣ :TIM2_IRQHandler();

本质上函数名称不能改,但可以宏定义映射。

2️⃣ :TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)

读取中断标志位,以此来判断中断是否发生。

3️⃣ :TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)

将拉高的中断标志位手动拉低(复位)

呜呜~结束啦😃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值