接着上一篇,分析下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中进行继续的探讨。