摘要
【外设配置篇】中简要列举了外设配置的方法,旨在让读者快速回忆起MX配置的步骤和编写相关代码的合适位置。本文介绍了中断处理与NVIC的快速操作流程与要点。
软件安装及其他教程 点击打开可查看专栏【STM32Cube开发方式】
新建项目的操作可以点击链接跳转到我的文章:STM32-keil+CubeMX快速开发【外设配置篇】:新建项目
相关资料与查看方法
本文以STM32F407芯片为例做说明,其他系列芯片的相关文件名称类似。
- 嵌套向量中断控制器(Nested Vectored Interrupt Controller,NVIC)管理所有中断。如果要对某个中断进行响应和处理,就需要编写一个中断服务例程(InterruptServiceRoutine,ISR)。
- HAL驱动库已经定义了各个中断的ISR,在MCU的启动文件(项目中的一个汇编语言程序文件startup_stm32f407xx.s)中有这些ISR名称的定义。这个文件就在MDK工程的同目录下。

- 外部中断EXTI部分在名称为"Reference manual"的芯片参考手册的10.2小节有详细的列表,其他外设的中断列表在各外设的章节中。芯片参考手册下载方法如下。
- 从正点原子的网盘可以快速下载到中文文档。点击链接:正点原子网盘链接,选择对应系列芯片的网盘资料,下载"8,STM32参考资料"这个文件,文件名称类似于"STM32Xxxx参考手册.pdf"。
- 从CubeMX软件下载。直接打开软件最上面的"Help"栏下的"Docs & Resources"项,然后找到"Reference manual"文件,就是芯片参考手册了,过程如下所示。


- STM32F407的中断向量表在stm32f407xx.h文件中被定义。该文件的路径为"\Drivers\CMSIS\Device\ST\STM32F4xx\Include"。

外设配置步骤
简记
根据需求配置外设→在"NVIC"配置界面设置优先级分组策略→调整优先级大小→在对应位置改写中断处理函数。
图文详述
根据需求配置外设
配置外设的内容可参考本专栏的其他文章。
在"NVIC"配置界面设置优先级分组策略

调整优先级大小
- 开启的外设都会显示在"NVIC"配置界面,首先需要勾选来使能中断,比如下面使能了I2C1和EXTI15_10的中断。

- 双击对应的表格可以选择配置优先级。

在对应位置改写中断处理函数
- MX会自动生成中断处理函数的框架,每个处理函数都有两个代码沙箱,一个在通用中断处理函数前,一个在通用中断处理函数后。相关代码位于"stm32f4xx_it.c"文件的最后几行,这个文件和"main.c"在同一个路径下。

- 通用中断处理函数会在内部调用中断回调函数,而中断回调函数又是可以重新实现的弱函数,所以如果需要对某组中断处理做一些通用的操作可以通过重写中断回调函数来实现。

相关的常用HAL函数
HAL库中的NVIC函数
|------------------------------|---------------------|
| 函数名 | 功能 |
| HAL_NVIC_SetPriorityGrouping | 设置4位二进制数的优先级分组策略 |
| HAL_NVIC_SetPriority | 设置某个中断的抢占优先级和次优先级 |
| HAL_NVIC_EnableIRQ | 启用某个中断 |
| HAL_NVIC_DisableIRQ | 禁用某个中断 |
| HAL_NVIC_GetPriorityGrouping | 返回当前的优先级分组策略 |
| HAL_NVIC_GetPriority | 返回某个中断的抢占优先级、次优先级数值 |
| HAL_NVIC_GetPendingIRQ | 检查某个中断是否被挂起 |
| HAL_NVIC_SetPendingIRQ | 设置某个中断的挂起标志,表示发生了中断 |
| HAL_NVIC_ClearPendingIRQ | 清除某个中断的挂起标志 |
HAL库中的中断相关函数
下表中的"XXX"表示某外设
|-----------------------------------------|------------------------------------|
| 函数/宏函数 | 功能 |
| HAL_XXX_xxx_IRQHandler | 中断ISR中调用的通用处理函数 |
| HAL_XXX_xxx_Callback | 中断处理的回调函数,需要用户重新实现 |
| __HAL_XXX_ENABLE | 启用某个外设XXX |
| __HAL_XXX_DISABLE | 禁用某个外设XXX |
| __HAL_XXX_ENABLE_IT | 允许某个事件触发硬件中断 |
| __HAL_XXX_DISABLE_IT | 禁止某个事件触发硬件中断 |
| __HAL_XXX_GET_IT_SOURCE | 判断某个事件的中断是否开启,返回值为SET或RESET |
| __HAL_XXX_GET_FLAG | 判断某个事件的挂起标志位是否被置位,返回值为TRUE 或 FALSE |
| __HAL_XXX_CLEAR_FLAG __HAL_XXX_CLEAR_IT | 清除某个事件的挂起标志位 |