GPIO->AFIO->EXTI->NVIC
进入NVIC是中断 不进入NVIC是事件
AFIO复用重映射
IP[59]~IP[0]分别对应中断 59~0。而每个可屏蔽中断占用的 8bit 并没有 全部使用,而是只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子(响应)优先级在后。
NVIC优先级分组:抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队
还有一种情况就是当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循 自然优先级,看中断向量表的中断排序,数值越小,优先级越高。
硬件优先级: 越小优先级越高
EXTI:外部中断 检测指定引脚的电平,如果发生变化立马执行中断
STM32F103ZET6 0-4每个中断线都有一个中断函数,5-9共用一个,10-15也共用一个中断服务函数,16个引脚只有7个中断服务函数
中断初始化步骤
1.使能时钟
2.设置GPIO Mode设置位it中断模式的上升/下降/双边沿
3.设置中断分组->可以不设,HAL_Init 里设置过(默认有为2,想改变的话重新设置分组 8-10位)
4.设置优先级--> HAL_NVIC_SetPriority(中断号,抢占优先级,响应优先级);
5.使能中断 HAL_NVIC_EnableIRQ(中断号);
-------------------------------
6.中断公共服务函数 //在启动文件中找
void EXTI0_IRQHandler(){
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_*);中断公共处理函数
_HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_*)}
----------------------------------
7.__weak重写弱函数回调函数
多个引脚需判断
------------------------------------------
中断服务函数调用公共中断服务函数处理(HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_*);)公共中断处理函数调用回调函数,而回调函数为__weak弱函数,自己需要对其重写,写入自己的逻辑代码
中断中的Mode需要选择上升沿/下降沿/双边沿
__weak 代表弱函数
*** 相同的pin不能同时触发中断 例如GPIOA_pin1 和GPIOB_pin1不能同时用 因为20条线不够80个GPIO口使用 所以GPIOA-E的相同端口使用一条,不能同时使用
AFIO主要完成两个任务:复用引脚重映射、中断引脚选择 //HAL库中不需要配置 在HAL_GPIO_Init中自动配置
中断建议:在中断函数里最好不要执行耗时过长的代码。
不要在中断函数和主函数调用相同的代码或者操作同一个硬件
内部时钟频率:72MHz