关于STM32中断的部分理解
扫描二维码
随时随地手机看文章
中断这个问题从学习stm32一开始就困扰着我,我想估计很多初学者都会有这样的问题。曾经问过隔壁实验室的职工,人家没告诉我,让我自己回去理解。同行是冤家,这句话很在理。
首先提出我对几个中断的理解不了的问题:
1、中断是干嘛的?
2、中断是如何从函数进入的?
3、中断相关设置是如何设置的?
第一个问题:关于中断可以有一个很形象的解释:你正在吃饭,突然尿急了,准备去尿尿,中断了吃饭的这一过程。从程序上解释就是吃饭可以分解为一系列的动作,称为主程序,每个动作相当于函数,组成了这个主程序。这时候你尿急了,产生了一个信号,相当于中断信号,告诉大脑CPU,现在尿急比较重要,不然会尿裤子。这时候大脑会停下吃饭这一主程序,去执行撒尿这程序,相当于中断服务程序。撒尿这个过程也是有一系列动作组成的,每个动作也相当于函数。这就是中断的产生。
第二个问题:中断是如何从函数进入的?这个问题困扰了我有一段时间,每个函数都有入口函数。那中断函数的入口是什么呢?我在查找手册和资料的时候,所有答案都告诉我是中断服务函数:
void XXX_IRQHandler(void)
{
}
可是回到主函数中怎么也找不到这个XXX_IRQHandler(void)这个函数作为入口,很难理解。其实中断函数的入口确实就是终端服务函数,但是主程序中不需要单独的函数入口。中断的进入是其实是靠检测中断标志位进入的。以这段代码为例:
void USART3_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
res =USART_ReceiveData(USART3);
if((USART3_RX_STA&(1<<15))==0);
{
if(USART3_RX_STA
{
TIM_SetCounter(TIM7,0);
if(USART3_RX_STA==0)
{
TIM_Cmd(TIM7,ENABLE);
}
USART3_RX_BUF[USART3_RX_STA++]=res;
}else
{
USART3_RX_STA|=1<<15;
}
}
}
}
这段程序主要是想如果串口三的数据是满的if((USART3_RX_STA&(1<<15))==0);则不接受其他数据,如果是没有超过接收数据,但接收时间超过定时器里面的时间,则强制接收完成。
这里的中断其实就是通过 if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)这句代码来进入的,这是stm32内部进行的,这里的USART_IT_RXNE是接收中断标志位,只要串口USART3接收到数据,就会自觉的进入中断,而不需要在主函数中提供中断函数的入口。还是拿人尿急比喻,大脑CPU接收到尿急的中断标志之后,自觉的进入尿尿的各个动作(各个函数),而不需要在吃饭这个主程序中刻意地加入尿尿这一步骤。总结起来就:中断不要入口,只要系统检测到了一个中断标志,系统就会干中断服务函数要求干的事情。
第三个问题:中断的设置。中断设置主要分为三个部分:1)中断开启,2)中断优先级设置,3)中断服务函数设置。1)中断开启很好理解,开启要说明开启的资源,和中断标志。这里的资源是指是串口、定时器等等,中断标志就是一种资源往往有很多种中断标志比如串口的中断就有:USART_IT_PE(奇偶错误中断)、USART_IT_TXE(发送中断)、USART_IT_TC(传输完成中断)、USART_IT_RXNE(接收中断)、USART_IT_IDLE(空闲总线中断)、USART_IT_LBD(LIN中断检测中断)、USART_IT_CTS(CTS中断)、USART_IT_ERR(错误中断)这些中断标志。2)中断优先级主要是通过NVIC(嵌套中断向量器)来设置的,这个寄存器主要是用来确定各个中断的优先级的,决定不同中断的执行顺序。仍然以吃饭举例,吃饭期间尿急了,同时手机来个电话,也就是执行吃饭这个主程序的时候来了两个中断标志,这时候先执行哪一个是由设置NVIC来决定先接电话还是先撒尿。3)中断服务函数主要包括两部分,一部分是就是具体执行中断的函数,就好比是撒尿的步骤和接电话的步骤都是在中断服务函数里执行的,另一部分是消除中断标志,这个中断事件都干完了,自然要消除中断,撒尿完了,自然要解除尿急的中断标志。
以上就是初学中断过程中容易困扰的问题。