stm32f103串口发送接收学习笔记2----中断设置(学习参考:正点原子的代码)

接着上一篇,分析下stm32f103的中断知识和设置。因为之前主要是学习51的单片机,因此对stm32的中断还是不甚了解,平时都是copypaste中断的代码。趁此机会,巩固下知识。
首先,要探讨下NVIC中断分组管理这个知识。还是根据正点原子的教材。再次感谢。具体如果有问题,再详细探寻下datasheet指南等资料。
stm32f103系列单片机只有60个可屏蔽中断。60个数量有点多,因此如果做更加复杂的控制的时候,尤其需要做好中断的规划,这个时候,你就是一个伟大工艺品的女蜗,需要懂得工程的每个细节。后续如果有bug,可以修修补补。
中断的寄存器结构体和具体的作用不做详述。可以参考下网上的资料。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
抢占优先级高的,中断优先响应。同一个抢占优先级,不同子优先级的,那个先发生中断,响应那个,不能互相打断。数字越小,优先级越高。
因此,假设优先级分组为组2,有两位抢占优先级,两位响应优先级。
可以设置
串口接收中断优先级为,抢占优先级为0,最高优先级,响应优先级为0.
定时器1中断为,抢占优先级为1,响应优先级为1.
定时器3和定时器4,抢占优先级为2,响应优先级为1和1。两个中断的抢占优先级和响应优先级都是一样,看那个先发生。因为没设置多线程,因此这个会导致测量的结果有误差。比如电机1和电机2都在运动,假设20ms到,需要对数据进行测量,那么读取两个定时器的计数值,假设计数到指定的最大值,产生溢出,那个先溢出,那个就先执行中断,溢出次数+1。
代码为:
在主函数中,进行中断优先级分组设置

	MY_NVIC_PriorityGroupConfig(2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先

在串口代码中中断设置代码**************************************

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		//子优先级0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断

定时器1中断设置代码*************************************************

void Timer1_Init(u16 arr,u16 psc)  
{  
	 NVIC_InitTypeDef NVIC_InitStructure;
	RCC->APB2ENR|=1<<11;//TIM1时钟使能    
 	TIM1->ARR=arr;      //设定计数器自动重装值   
	TIM1->PSC=psc;      //预分频器7200,得到10Khz的计数时钟
	
	TIM1->DIER|=1<<0;   //允许更新中断				
	TIM1->DIER|=1<<6;   //允许触发中断	   
	TIM1->CR1|=0x01;    //使能定时器
	 TIM_Cmd(TIM1, ENABLE); 
	//抢占优先级为1,响应优先级为1,分组为2
  MY_NVIC_Init(1,1,TIM1_UP_IRQn,2);
}  

定时器3中断设置代码****************************************************

//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM4中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;  //抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;  //响应优先级为1
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
	 	// 允许溢出中断--------------------------------------------------------------  
	TIM_ClearFlag(TIM3, TIM_FLAG_Update);//??TIM3??????
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//??????

定时器4代码****************************************************

//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM4中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;  //抢占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;  //响应优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
// 允许溢出中断--------------------------------------------------------------  
TIM_ClearFlag(TIM4, TIM_FLAG_Update);//??TIM3??????
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//??????
///////////////////////////////////////////////////////////////////////

至此,串口中断和定时器中断设置完毕。

下一步工作是写串口接收函数,接收指定的格式。
下面在笔记3中进行继续的探讨。

猜你喜欢

转载自blog.csdn.net/lmf666/article/details/100035707