STM32定时中断配置详解:以1秒触发中断为例(待更新)

        这里介绍一下STM32定时中断。

        有时候我们需要用到定时或者计数功能,这时候就需要用到定时器了,通俗地讲就是我们可以通过调节它的本身主频率来得到我们需要的频率大小,进而设定时间,也可以配置外部计数的模式使用外部计数。

        这里以STM32F103C8T6为例,该单片机拥有四个定时器,其中包括一个高级定时器TIM1,通用定时器TIM2,TIM3,TIM4,我们用TIM2进行代码编写。

        首先进行定时器的初始化配置,具体配置见下面所附代码,讲解一下部分比较难懂的地方,这里说明一下TIM2是APB1总线外设,所以开启APB1,其余定时器的总线查看以下数据手册。

        配置基本按照如下代码就行,其中TIM_Period为计数周期ARR的值,TIM_Prescaler即预分频PSC的值,这里用到一个计算公式算得自己想要的时间,公式为(TIM_Prescaler+1)/72MHz=计数时钟周期再乘以计数周期TIM_Period,假设需要一个1s的定时,则设定TIM_Prescaler为7200+1,公式得到为0.1ms,再乘以一个10000的计数周期则为1s的定时了。

        TIM_ClearFlag清除定时器更新标志位,以防代码开始运行的初始值不为0。后面通过TIM_ITConfig开启更新时钟中断,后面就需要配置NVIC了,其中主要是涉及到抢占优先级和中断优先级分组,其余配置仿制就行,由于代码较为简单,所以优先级分组多少无所谓,最后别忘了TIM_Cmd使能开始运行。

#include "stm32f10x.h"                  // Device header

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//tim2是APB1外设总线的
	
	TIM_InternalClockConfig(TIM2);//YIM2的时基单元由内部时钟控制
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=10000-1;//周期值定时1秒
	TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;//预分频值
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;//重装寄存器值
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
	
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);//避免初始化就进入中断
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启更新中断到NVIC的通路
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM2,ENABLE);
	
}

        向上面这样,定时1s的中断就已经弄好了,接下来我们在主函数里调用就行。

        这里我们定义一个无符号的数uint16_t Num,记得初始化时钟,定义一个函数void TIM2_IRQHandler(void),在里面我们需要用到TIM_GetITStatus这个函数,获取判断是否是更新事件触发的中断,如果是,那么进入if,执行num++,即每过1s,num加1,最后别忘了用TIM_ClearITPendingBit清除TIM2更新事件的中断标志位,否则会导致程序卡死。这样就配置好了整个的定时器定时1s触发中断执行num数值加1的操作,如果想形象的展示num值加1的操作可以配置OLED显示屏的相关代码,本文就不再说明了。

#include "stm32f10x.h"                  // Device header
#include "Timer.h"
uint16_t Num;

int main (void)
{
	Timer_Init();

	while(1)
	{
	}
	
}
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除标志位
	}
}

物联沃分享整理
物联沃-IOTWORD物联网 » STM32定时中断配置详解:以1秒触发中断为例(待更新)

发表评论