萌新的STM32学习-18 中断的基本概念3
EXTI和IO映射的关系
AFIO简介(F1)
Alternate Function IO 复用功能IO 主要用于重映射和外部中断映射配置
1.调试IO配置
来自AFIO_MAPR[26:24] , 配置JTAG/SWD的开关状态 (这个我们并不用太过深刻的关注)
2.重映射配置
AFIO_MAPR , 部分外设IO重映射配置
(这也不算是本节课的重点 自行去查阅)
3. 外部中断配置
AFIO_EXTICR1~4 配置EXTI中断线0~15对应到哪个具体的IO口
特别注意: 配置AFIO寄存器之前要使能AFIO时钟
__HAL_RCC_AFIO_CLK_ENABLE(); 对应RCC_APB2ENR寄存器 位0
EXTI0与引脚号为0 相对应
比如他控制着一整组的PA0 PB0 PC0 PD0 直到PK0 等等
AFIO_EXTICR1 的 EXTI0[3:0] 位正好是4位控制着 (F1)
AFIO 所做的工作就是告诉我们EXTI究竟会和GPIO的哪一个端口对应
外部中断配置寄存器1 AFIO_EXTICR1
这个寄存器的高16位保留
低十六位分割为每四位一组
那么一个AFIO_EXTICR1 就可以控制4条EXTI线
这样的AFIO一共有4个 那么一共能够控制实现16个这样的地址线
我们是这样来说明的EXTIx[3:0] 举个例子在配置EXTI3上 那就是指用以选择EXTI3外部中断的输入源
0000 PA[3]引脚
0001 PB[3] 引脚
0010 PC[3] 引脚
0011 PD[3] 引脚
0110 PG[3] 引脚
如何使用中断
GPIO外部中断
设置输入模式 : GPIO
上拉 下拉 浮空
经过GPIO 来到AFIO 用来设置 EXTI和IO的映射关系
接下来就来到了EXTI
EXTI 即是外部中断和事件控制器,它是由 20 个产生事件/中断请求的边沿检测器组成。每一条输入线都可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。
再接下来来到了NVIC就是中断管家
NVIC可以设置中断分组,优先级,使能
GPIO外部中断对应着EXTI0-EXTI 15 一共16根线
那么剩下的EXTI16 17等等 它会从其他外设进入EXTI
既然信号是外部进来的,那么首先遇到的外设肯定是GPIO (上拉 下拉 浮空输入) 接下来会来到 AFIO(F1) 然后到EXTI (外部中断事件控制器, 屏蔽 上升沿 下降沿) 然后传入了 NVIC (中断总管家 管理了使能 优先级控制) 最后传入进CPU 去处理中断
EXTI 即是外部中断和事件控制器,它是由 20 个产生事件/中断请求的边沿检测器组成。每一条输入线都可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。
STM32 EXTI 的配置步骤
1.使能GPIO时钟 (目的是使能GPIO时钟)
2.设置GPIO输入模式 (设置上拉,下拉,浮空)
AFIO就是设置IO与EXTI映射关系
3.使能AFIO/SYSCFG时钟
(设置AFIO的时钟开启寄存器)
4. 设置EXTI和IO对应关系
(选择PA~PK到底哪组IO对应EXTI输入先,AFIO)
5.设置EXTI屏蔽,上/下沿
(设置EXTI对应通道的屏蔽和上升沿/下降沿触发)
6.设置NVIC
(分3步,设置优先级分组,设置优先级,使能中断)
7.设置中断服务函数
(编写对应中断的中断服务函数!清中断标志!)
因为我们现在用的是HAL库
所以的2到5步可以通过HAL_GPIO_Init一步到位
下面是STM32 EXTI的HAL库设置步骤(GPIO外部中断)
就是把上面的2-5步合成用HAL库的形式
1.使能GPIO时钟
(使用__HAL_RCC_GPIOx_CLK_ENABLE)
2.GPIO/AFIO/EXTI
(使用HAL_GPIO_Init,一步到位)
3.设置中断分组
(使用HAL_NVIC_SetPriorityGrouping 此函数仅需设置一次即可)
4.设置中断优先级
(使用HAL_NVIC_SetPriority)
5.使能中断
(使用HAL_NVIC_EnableIRQ)
6.设计中断服务函数
(编写:EXTIx_IRQHandler,中断服务函数,清中断标志)
说起GPIO那么我们会想到适用于EXTI0到15
那么是否这些都有Handler
其实我们说并没有
STM32平台仅有EXTI0-4 各有一个
EXTI5 6 7 8 9 共用一个
EXTI10 11 12 13 14 15共用一个
总共有7个外部中断服务函数
通用外设驱动模型(四步法)
1.初始化 : 时钟设置,参数设置,IO设置,中断设置(开中断,设NVIC)
2.读函数(可选)
(从外设读取数据)
3.写函数 (可选)
(往外设写入数据)
4.中断服务函数 (可选)
(根据中断标志,处理外设各种终端事务)
HAL库中断回调处理机制介绍
凡是用到中断 都会有一个中断服务函数
在.s文件里面 也叫硬件中断服务函数
(在处理中断程序之后会有一个清标志这是正常的)
但是在我们的HAL库里是怎么操作的 调用一个HAL库中断处理公用函数 (这里的作用是异常处理,清中断标志,调各种回调函数)
下一步到了HAL库数据处理回调函数
(包括多个各种的回调函数)