当前位置:首页 > 单片机 > 单片机
[导读]中断这个问题从学习stm32一开始就困扰着我,我想估计很多初学者都会有这样的问题。曾经问过隔壁实验室的职工,人家没告诉我,让我自己回去理解。同行是冤家,这句话很在理。首先提出我对几个中断的理解不了的问题:1

中断这个问题从学习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)中断服务函数主要包括两部分,一部分是就是具体执行中断的函数,就好比是撒尿的步骤和接电话的步骤都是在中断服务函数里执行的,另一部分是消除中断标志,这个中断事件都干完了,自然要消除中断,撒尿完了,自然要解除尿急的中断标志。

以上就是初学中断过程中容易困扰的问题。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭