涉及的参考来自:野火的《【野火®】零死角玩转STM32—F103霸道》、网上大神、野火例程
1. EXTI0 至 EXTI15 用于 GPIO
2. 编程要点
(1)开启对应GPIO口时钟和GPIO_AF时钟,因为用到中断寄存器了,必须打开AF时钟。
(2)设置外部中断的优先级属性
我的理解:
我觉得给它起个名字叫“中断的优先级属性”—— 包含2个部分——软件可设的主优先级和子优先级、硬件不可设的中断向量号。
调用NVIC_PriorityGroupConfig函数实现
用NVIC进行配置,也就是先进行NVIC分组,把优先级分配下:几个bit的主优先级、几个bit的子优先级,
我的理解就是一个中断具有主优先级(抢占式优先级)和子优先级,为啥要具有这两个优先级呢?是用来判断多个中断同时进来时,如何对中断进行排序,也就是谁先处理。这就看这个中断的主优先级和子优先级了。如果主优先级一样那就判断子优先级,如果子优先级一样,那就判断硬件中断号的排序谁越靠前值越低的谁的优先级就越高就先执行谁。
主优先级和子优先级以及硬件中断表号(或者说中断向量表)是用来仲裁多个中断同时进来如何执行的问题而赋给每个中断的属性。
把中断优先级进行分组后,就是决定每个中断可设的主优先级值和子优先级值。STM32的优先级分配空间只有4bit,那么主优先级和子优先级各占几位,就相当于抢地盘,地盘就那么大,你占得多我就占的少,所以有4种方法,其中一个全部霸占完这个地盘4bit,另一个只有就是0bit。一方霸占3bit,另一方就剩1bit可用……。如下图:
调用NVIC_PriorityGroupConfig函数实现这个分配,这就决定了接下来所有中断可设的主优先级和子优先级的值(它们各自的地盘就固定了,所以就决定其各自地盘可用的资源)。
如果优先级分组为 0,则抢占优先级就不存在,优先级就全部由子优先级控制。
疑问:这个分组配置是针对所有中断的优先级属性配置的么?如果再次配置中断优先级分组了,那么之前设置的各中断及其优先级是不是就无效了,必须重新设?
大神答:是的,针对所有中断的,在中间运行如果再次配置肯定需要重新设了。一般是不会的。
配置中断优先级分组是不是决定各中断的主优先级和子优先级的值,另外主优先级和子优先级是不是可以这样理解:主优先级和子优先级相当于各中断的属性,以用来仲裁多个中断的同时发生?
大神答:是的
(3)引脚输入配置
/* 选择按键用到的GPIO */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
/* 配置为浮空输入 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
(4)使能EXTI相应中断线
要产生中断,必须先配置好并使能中断线,调用GPIO_EXTILineConfig完成
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
(5)中断线、边沿触发等中断模式配置
调用EXTI_Init完成
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
/* EXTI为中断模式 */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 上升沿中断 */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
/* 使能中断 */
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);