STM32 定时器中断学习笔记

在stm32中,定时器相关的库函数主要集中在固件库文件 stm32f10x_tim.h 和 stm32f10x_tim.c 文件中,所以在进行定时器方面的处理时,需要加载这两个文件进来。

在进行定时器操作时,一般按如下步骤来进行:

 1、打开相关外设的时钟。

    以定时器TIM3为例,由stm32的时钟树可以看到,TIM3时钟挂接在APB1上面,所以打开TIM3时钟时使用RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE),如果其中还使用到了其他外设,如GPIO等,再打开相关的外设时钟就可以了。

 2、清除中断挂起位。

    由于各种不可知的因素作用,在程序运行前要操作的定时器的中断挂起位有可能会被置位,这样就会导致在程序一开始就会进入定时器中断的中断服务程序。为了消除这种影响,我们在程序的一开始就将中断挂起位清除。

在固件库中使用:

void TIM_ClearITPendingBit(TIM_TypeDef*TIMx, u16 TIM_IT)

来清除中断挂起位,该函数的具体使用参考固件库手册。

3、定时器基本配置初始化。

    在这一步骤中主要确定定时器的预分频和设置自动重装载寄存器周期的值,并确定计数模式,这主要使用固件库中的 TIM_TimeBaseInit()函数进行操作,该函数的原型为:

void TIM_TimeBaseInit(TIM_TypeDef* TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)

第一个输入参数没啥说的,就是使用的哪个定时器。

typedef struct  
{  
<span style="white-space:pre;"> </span>u16 TIM_Period;// 自动重装载寄存器周期的值  
<span style="white-space:pre;"> </span>u16 TIM_Prescaler;//预分频值  
<span style="white-space:pre;"> </span>u8 TIM_ClockDivision;//分割系数,一般设置为0,不去分割  
<span style="white-space:pre;"> </span>u16 TIM_CounterMode;//计数模式  
} TIM_TimeBaseInitTypeDef; 

4、使能定时器TIMx。

    这个简单,直接函数TIM_Cmd()函数就可以了,比如使能定时器TIM3外设,则可用TIM_Cmd(TIM3,ENABLE)。

5、使能TIMx中断。 

    调用函数即可。因为我们要使用 TIM3 的更新中断, 寄存器的相应位便可使能更新中断。 在库函数里面定时器中断使能是通过 TIM_ITConfig 函数来实现的:

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

第一个参数是选择定时器号,这个容易理解,取值为 TIM1~TIM17。

第二个参数非常关键,是用来指明我们使能的定时器中断的类型,定时器中断的。

类型有很多种,包括更新中断 TIM_IT_Update,触发中断 TIM_IT_Trigger,以及输入捕获中断等等。

第三个参数就很简单了, 就是失能还是使能。

例如我们要使能 TIM3 的更新中断,格式为:TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );

6、配置中断优先级。

    也就是配置嵌套向量终端控制器NVIC。进行本步骤首先需要配置优先级的分组,可以使用库函数NVIC_PriorityGroupConfig()进行,分组的编号就是抢占优先级的位数,然后再配置NVIC初始化,使用函数NVIC_Init()进行,这个函数的原型为void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct),其中输入参数的结构体的定义如下:

typedef struct  
{  
<span style="white-space:pre;"> </span>u8 NVIC_IRQChannel; //中断通道  
<span style="white-space:pre;"> </span>u8 NVIC_IRQChannelPreemptionPriority;//抢占优先级  
<span style="white-space:pre;"> </span>u8 NVIC_IRQChannelSubPriority;//响应优先级  
<span style="white-space:pre;"> </span>FunctionalState NVIC_IRQChannelCmd;// 指定在成员 NVIC_IRQChannel 中定义的 IRQ 通道被使能还是失能  
} NVIC_InitTypeDef;  

7、编写中断服务程序。在这里,我们首先要清除中断挂起位,该函数同第2步中,自不必赘述,接着再编写中断处理内容即可。

完整的定时器中断初始化程序如下,该程序为普中科技所配的光盘中的定时器中断中的内容。

void timeInit()  
{  
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //声明一个结构体变量,用来初始化 GPIO  
NVIC_InitTypeDef NVIC_InitStructure;  
/* 开启定时器 3 时钟 */  
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除 TIMx 的中断待处理位:TIM 中断源  
TIM_TimeBaseInitStructure.TIM_Period = 2000;//设置自动重装载寄存器周期的值  
TIM_TimeBaseInitStructure.TIM_Prescaler = 35999;//设置用来作为 TIMx时钟频率预分频值,100Khz 计数频率  
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim  
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;//TIM 向上计数模式  
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);  
TIM_Cmd(TIM3,ENABLE); //使能或者失能 TIMx 外设  
/
/* 设置中断参数,并打开中断 */  
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE ); //使能或者失能指定的TIM 中断  
/* 设置 NVIC 参数 */  
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //打开 TIM3_IRQn 的全局中断  
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级为 0  
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为 1  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能  
NVIC_Init(&NVIC_InitStructure);  
}  










  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值