快捷搜索: 王者荣耀 脱发

stm32入门——定时器中断和中断优先级简介

stm32入门——定时器中断

产生定时中断是定时器的用法之一,与定时器用来进行PWM输出和输入捕获相比,定时器中断更容易理解、掌握。 原理简介 使用通用定时器进行中断的原理,其实和开发板Systick定时器进行中断延时很相似(),即:用psc(预分频系数)设置好定时器时钟后,arr(预装载值)在每个时钟周期内减1,当arr减为0时触发中断然后进入中断处理程序进行中断处理。 以下代码为例:

void TIM3_Int_Init(u16 arr,u16 psc)
{
	RCC->APB1ENR|=1<<1;	//TIM3时钟使能    
 	TIM3->ARR=arr;  	//设定计数器自动重装值 
	TIM3->PSC=psc;  	//预分频器设置
	TIM3->DIER|=1<<0;   //允许更新中断				
	TIM3->CR1|=0x01;    //使能定时器3
  	MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2									 
}

RCC->APB1ENR|=1<<1 由于定时器3(TIM3)是挂在APB1上的外设,所以要打开APB1(若对时钟部分不理解,可以参考),这里的预分频器值psc是来设置TIM3的时钟频率的,如果系统时钟(SYSTICK)频率为72MHz、psc为7199,则TIM3的时钟频率就为 72MHz/(7199+1)Hz = 10KHz,这里的“+1”是手册中规定的。 10KHz是什 么意思呢?就是一秒钟会产生10K个周期,那么一个周期的时间长度就是1/10KHz,如果你想将定时器中断的时间间隔设置为0.5秒,那么你将arr设置为5000即可,因为arr每减1就需要一个周期的时间,减5000次就经过了5000*(1/10KHz)=0.5秒。 TIM3->DIER|=1<<0; 这一行设置允许更新中断,即arr减到0以后可以触发更新中断(还有其他类型的中断) MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2 中断优先级有抢占优先级和响应(即子优先级)优先级两种,抢占优先级即:若程序1正在使用CPU,这时如果程序2要求使用CPU,并且程序2的抢占优先级高,则CPU被程序2抢占;若两者抢占优先级相同,则就算程序2的响应优先级高于程序1,CPU也不能被抢占;若程序1正在使用CPU,程序2和程序3的抢占优先级等于或低于程序1,且程序2的响应优先级高于程序三,则待CPU空出后,程序2先运行,程序3最后运行。 TIM3_IRQn是指定将要运行的中断处理程序号。“组2”是设置中断优先级分组的,这是因为寄存器提供了四位来设置优先级,组2代表的是前两位给抢占优先级,后两位给响应优先级。如图,还有其他的分组。 小结:其实从功能应用的角度来讲,定时器中断 = 延时+处理程序,因为定时器中断就是固定地每隔一段时间去执行一段程序,那你直接用延时不就OK了吗?

经验分享 程序员 微信小程序 职场和发展