![](https://i-blog.csdnimg.cn/blog_migrate/c51c28edddb18b5f94bfdcc58cdc8a6d.png)
NVIC结构体定义在core_cm3.c之中
typedef struct{__IO uint32_t ISER[8]; //中断使能寄存器uint32_t RESERVED0[24];__IO uint32_t ICER[8]; //中断清除寄存器uint32_t RSERVED1[24];__IO uint32_t ISPR[8]; //中断使能悬起寄存器uint32_t RESERVED2[24];__IO uint32_t ICPR[8]; //中断清除悬起寄存器uint32_t RESERVED3[24];__IO uint32_t IABR[8]; // 中断有效位寄存器uint32_t RESERVED4[56];__IO uint8_t IP[240]; //中断优先级寄存器(8位)uint32_t RESERVED5[644];__O uint32_t STIR; //软件触发中断寄存器} NVIC_Type;
优先级定义
1)主优先级(抢占优先级)>子优先级
注:当多个中断同时到来,首先比较主优先级(抢占优先级),主优先级(抢占优先级)越小越先执行,当主优先级(抢占优先级)相同时,比较子优先级,子优先级越小,越先执行,
若主优先级(抢占优先级)和子优先级都相同时,则比较硬件中断编号(查看中文参考手册9.1.2,如下图,当子优先级和主优先级相同时,EXT1线0中断此时优先级最高)
![](https://i-blog.csdnimg.cn/blog_migrate/5a2abb4f9f23adc9b2df89a4a17d15a1.png)
2)优先级分组
![](https://i-blog.csdnimg.cn/blog_migrate/9e0e71bb423234d5d4265a52f035b3de.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bff32aae604615287496ca4f16230c66.png)
3)中断优先级库函数Preemption_Priority_Group()
NVIC_PriorityGroup_0 /*!< 0 bits for抢占优先级4 bits for 子优先级 */NVIC_PriorityGroup_1 /*!< 1 bits for抢占优先级3 bits for 子优先级*/NVIC_PriorityGroup_2 /*!< 2 bits for抢占优先级2 bits for 子优先级 */NVIC_PriorityGroup_3 /*!< 3 bits for 抢占优先级1 bits for 子优先级*/NVIC_PriorityGroup_4 /*!< 4 bits for抢占优先级0 bits for 子优先级 *///设置优先级分组void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup){SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;}
中断编程
1)使能中断请求(每个外设的相关中断使能位控制)
2)配置中断优先级分组
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) // NVIC_PriorityGroup_0 1 //2 3 4
3)配置NVIC寄存器,初始化NVIC_InitTypedef
NVIC_IRQChannel //中断源(取值从stm32f10x.h中寻找)NVIC_IRQChannelPreemptionPriority //主优先级 (根据分组配置)NVIC_IRQChannelSubPriority //子优先级NVIC_IRQChannelCmd //使能或者失能
NVIC_Init();
4)编写中断服务函数
中断服务函数名称:必须与启动文件startup_stm32f10x_hd.s中预先设置的一样,如果写错,系统就在中断向量表中找不到中断函数的入口,会直接跳到启动文件中预先写好的空函数中无限循环,实现不了中断.
名称格式如下表:
![](https://i-blog.csdnimg.cn/blog_migrate/8cddf1a9f070ba748e85ba629868cbd7.png)