异常:一切打断了程序运行的异常,可能是由于程序错误或者硬件错误导致程序中断或者跑飞都是异常。
中断:中断是CPU运行的正常行为,系统停止当前正在运行的程序而转向其他服务
CM3中一共有240个中断,15个异常,其中异常编号为1~15,编号为0的没有异常。一般芯片中的中断数量也是有限的,STM32有84个中断其中,内核有16个,
外部中断68个,F103中只有60个。
中断通道:每个可中断的外设对应一个钟段通道,因此内核外部的中断通道共有68个,每个通道设置对应的优先级控制字,就可以关联到不同的中断优先级,产生中断嵌套。
抢占优先级与响应(子)优先级:不同的抢占优先级之间可以发生嵌套,如果两个中断的抢占优先级相同而子优先级不同,它们之间不能发生嵌套。子优先级产生作用
的时候是在:当抢占优先级相同而响应优先级不同时,如果两个各中断同时到来,系统将会首先响应响应优先级高的那个中断。在CM3中中断编号越小对应的优先级越
高。
优先级设置:
1. 设置中断优先级的分组,在“应用程序中断及复位控制寄存器(AIRCR)”中[10:8] PRIGROUP段设置分组特征,如下表:
可见尽管有68个通道但是系统中的抢占优先级只能设置最多16级。
2.设置外设本身的寄存器,允许相应的中断,如允许 UIE(TIME2_DIER 的第[0]位)
3.设置 TIME2 中断通道的抢先优先级和子优先级(IP[28] ,在 NVIC 寄存器组中)
3.设置 TIME2 中断通道的抢先优先级和子优先级(IP[28] ,在 NVIC 寄存器组中)
这里用库函数对NVIC进行初始化,先定义NVIC_InitTypeDef类型的结构体,来传递参数,包括4个参数:
typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
}NVIC_InitTypeDef;
分别要设置中断通道的选择,在使stm32f10x.h中有对应的中断通道宏定义,然后设置抢占优先级子优先级,在后使能中断。
4.中断处理函数
按照库函数工程模板一般将,中断服务函数写在stm32f10x_it.c中,但是也可以也在对应外设的初始化中只要最终包含到main.c中就行了。在中断向量表中,库函数文件已经定义了各个外部中断对应的服务函数的名字,不管写在哪里应该保证名字一样,这样编译的时候才能通过,在启动文件startup_stm32f10x_hd.s中就有对应的中断向量表可以查看服务函数应该写的名称。
在服务函数中,如果中段以后硬件不会自动清除标志位,就应该软件清除标志位。否则永远退不出中断。