stm32-中断
stm32-中断
中断在arm这个架构下分了三层。所谓中断,就是cpu感知外部事件变化的一种方式。除了中断,还有轮询,还有DMA,但是中断是我们用的最多的一种方式。
中断和轮询相比,不需要cpu不断的去检测或者探测外设的状态。所谓中断就是指的是当外设或者系统定时器,产生了一个中断信号将来要上报给Cpu,但是cpu不会去直接接收中断信号,cpu让中断控制器去接收。
之前在玩STM32的过程中发现不是说所有的这些外设都是直接的连接到中断控制器上的,有一部分是通过外部中断连接到了中断控制器上,比如说我们的gpio的管脚是连接到了外部中断上,将来外部中断是不是再连接到中断控制器上。也就是说将来我的串口、i2C的那些设备可以直接给中断控制器发送中断信号,但是我gpio类的接口我得通过外部中断去上报这终端信号。再有我中断控制器可以进行中断屏蔽。我可以屏蔽你的这些外部中断,也可以不屏蔽,如果不屏蔽中断,中断信号就可以往上报了,往上报就报给中断控制器。
中断控制器完成两个事,第一:为所有连接到这上面的中断源分配一个中断号,而且这个中断号跟异常向量表里边的顺序是息息相关的,不能轻易更改,要想改的话,也得在最后边改。如果我一改,那个顺序乱了就接收不了中断。这是中断控制器要干的。为所有连接上来的中断源分配一个中断信号。
第二:还要处理中断优先级的问题。arm在提供解决方案的时候,给咱们规定了一个8位的寄存器,也就是256个优先级,256个可设置的优先级,还有三个固定的NMI,Reset还有一个硬件失效,stm32只支持16个中断优先级。
中断优先级又分一个组优先和子优先,所以我就需要到时候去配组优先和子优先的配比问题,要设置配比。到这儿,中断控制器就搞定了中断信号,比如说按键按下了以后,这个中断信号就进入了中断控制器,报给了Cpu核。至于说cpu核心怎么去处理,那是不是就cpu核的事了。
中断
中断是cpu感知外部事件变化的三种方式之一,除了中断还有dma和轮询。在cpu在计算机体系结构里边,cpu这种资源非常的宝贵,所以我们不可能让cpu一直不断的轮询各种硬件状态的变化,所以我们就引入了中断这种方式。当某一个硬件有需求,有变化了,需要让cpu知道并处理,那么中断这种方式,是非常好的,几乎我们所有的嵌入式设备的硬件,都采用了这种方式中断的方式。
那么一提到中断,因为它太大了,所以我们就给它做了一个分级,分了三级,首先是分了一个中断源级,所谓的中断源级指的就是,我们可以把所有的外设设备都看成一个一个的中断源。换句话说,中断源一定是硬件,真正的中断一定是硬件产生的。比如说我们的按键,当我按下按键以后,要给cpu报一个中断信号。再比如说我们的串口,我们可以用轮询的方式去串口里边接收数据,当然也可以用中断的方式去接收数据。再或者我们的usb的接口的设备,比如说u盘,当插上u盘到pc机上以后,那么u盘的接口,这个u口它也会上报一个中断信号给我们的cpu。
所以说,所有的硬件都可以看成一个中断源。然后中断源产生了中断信号以后,它不能直接交给cpu进行处理,如果所有的中断源产生的中断信号都直接交给cpu进行处理,那cpu太累了。所以cpu委托了一个控制器去处理所有中断源报上来的中断信号,这个控制器就叫中断控制器。
我们常用的中断控制器无非就两种,一种叫通用的中断控制器gic,另外一种就叫nvic。nvic是可嵌套的带向量的中断控制器。那么什么叫可嵌套呢?就是在arm这个体系结构里边,中断是允许嵌套的,也就是中断分了一个优先级,有高优先级的中断到来的时候,可以打断cpu正在执行的低优先级的中断,有些工程师把这个中断称之为一个任务。也就是可以层层的去嵌套,高优先级的打断低优先级的,这种就叫嵌套。那么什么叫带向量的?就是把我有的中断源都给它对应一个中断处理函数,也就是做了一张异常向量表,异常向量表里边保存的就是这些异常处理函数的函数名,也就是函数的入口地址。当某一个中断发生的时候,cpu会自动的跳转到某一个异常向量的入口地址去执行。
那么中断控制器它要干两件事,第一个就是为每一个连接到中断控制器上的中断源分配一个中断号。第二个就是如果是在单片机里边,中断控制器会把中断源进行一个分组,这里边分成两组,一个是子优先级,一个是组优先级。将来我们可以通过配比去配置比例。
arm公司开放出来一个256bit的寄存器去解决配比的问题,但是下边的厂商,比如st这个厂商,它只用了4bit去解决配比问题。那么中断控制器接收到中断信号以后,它有两种方式去处理,可以把中断源上的中断信号给屏蔽掉,不往上面报,它也可以往上面报中断信号。但是只要它往上面报中断信号,那么就有两种方式,一种叫irq,一种叫fiq。在arm里边,这两种方式分别称之为快速中断(fiq)和中断(irq)。那么快速中断和中断有什么区别呢?无非就是优先级的高低不同罢了。高优先级的这种中断叫以fiq的形式进行上报,低优先级的中断以irq的形式进行上报,上报给中断里边的最后一级,也是最重要的一级叫arm core级。
在接收到了来自中断控制器的中断信号之后,硬件上会自动干四件事儿。首先我要把程序状态寄存器里边的值给保存到状态寄存器spsr里边去,因为现在要切换状态了,从正常的管理模式切换到异常模式的irq或fiq这两种中断模式里边去。所以首先要备份程序状态寄存器里边的值,因为马上要切换个状态了,所以还要把cpsr程序状态寄存器里边的值设制成合适的值,设置nzcv位和设置模式位。[bit0:bit4]是模式位,设置完了之后要干的第三件事,硬件上要把现场保护起来。所谓的保护现场,指的就是要去处理异常向量、处理异常、处理中断。处理完了之后还要回来。为了确保能回来,要把pc值保存到lr寄存器里边去。一旦干完了这三件事,就可以放心大胆的让pc跳转到中断处理函数里边去执行了,那么这就是所谓的硬件上要自动干的这四件事。
当然了,做完中断处理以后,cpu和还要回到之前正在执行的指令的位置去执行,那么这个过程就叫恢复线程。恢复现场的话,首先我要切换回正常的模式,所以就要将sppsr里边值恢复给cpsr,然后再把我之前lr寄存器里边保存的那个pc值恢复给pc,这就是整个的中断。当然了,中断调用的也比较多,这里边我曾经调过uart,用中断的方式去实现接收字符串的功能,用这个中断去调过按键中断。比如说咱们的键盘按下之后,就会给我上报一个键值,上报一个中断信号,我将来拿到这个键值,拿到这个中断信号以后,我去可以做一些处理,比如说把它在让它在屏幕接收到终端以后,在屏幕oled显示屏上显示一个图片,显示一个用户界面,这是我做的一些关于中断的一些工作,也是我对中断的一个理解。