基于STM32G431嵌入式学习笔记——五、NVIC中断(以串口UART中断为例)

本文介绍STM32G4系列微控制器的串口配置方法,包括NVIC中断控制、USART基本参数设置及中断优先级配置等内容。通过CubeMX工具进行引脚和串口属性设置,实现串口的异步通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基础知识
1.专业术语

在这里插入图片描述

2.NVIC简介

在这里插入图片描述

①在这里要注意,中断控制是分级处理
是否请求中断中断源控制的。
是否响应中断响应方控制的。
④以外部中断为例,外部中断请求顺序就是首先从请求的外部设备中选出优先级最高的一个设备待中断,之后再由NVIC控制中断
⑤发生中断时,程序会直接跳转到中断处理子程序执行,也叫中断例程

3.中断和异常子程序调用的区别

在这里插入图片描述

4.NVIC支持的中断数量

支持102个可屏蔽的中断(外部中断)和16个内部中断。

请参考“赛点资源数据包(比赛能看的资料)–>芯片资料–>STM32G4系列微控制器参考手册

在这里插入图片描述

5.中断向量表

这里仅仅节选16个内部中断和部分外部中断,详细内容请查阅微控制器参考手册
在这里插入图片描述

在这里插入图片描述中断向量表占用1024字节,即1k空间

6.关于中断的更多参考

更多详细内容,请参考“赛点资源数据包(比赛能看的资料)–>芯片资料–>STM32G4系列微控制器参考手册
NVIC中断位于第14章,p441-445
在这里插入图片描述
在这里插入图片描述

7.通用同步/异步收发器接口USART

在这里插入图片描述加以时钟控制的为同步串行接口;无时钟则为异步串行接口
在命名中,区别就是有没有’S’

同步传输以同步时钟为代价。
在这里插入图片描述

二、串口配置
1.参考内容

查阅产品手册,“7.1 调试器与目标MCU”。
在这里插入图片描述

串口通信中有两条线——实现单工和半双工
串口通信中有三条线——实现全双工

在这里插入图片描述
关于USART的中断,查询中断向量表即可得知其相关配置信息:
在这里插入图片描述

2.CubeMX中对USART的配置

大致步骤:

①配置引脚属性
②配置串口基本数据(波特率、字节长度、校正等)
③配置中断接收(触发中断)
④设置中断优先级


复制上次第12届蓝桥杯节选题的文件夹,作为我们的初始环境(若想要从0开始实现配置可以参考前4节的相关内容)打开对应的CubeMX,找到USART1
在这里插入图片描述
①配置引脚属性
我们回到串口的电路图,可以发现串口的通信用到了PA9和PA10

在这里插入图片描述因此点击这两个引脚,分别进行如图所示的配置:
在这里插入图片描述
由于USART要作为异步通信,模式应选为异步
在这里插入图片描述②配置串口基本数据(波特率、字节长度、校正等)
设置波特率为9600,字长8位,无奇偶校验位,停止位1位
(实际上波特率也可以设为其他值,只是需要保证通讯双方的参数一致)
在这里插入图片描述如何去检验通讯双方的参数一致?
赛事资源包中有对应的串口调试助手,双击.exe文件并打开
在这里插入图片描述在这里插入图片描述
③配置中断接收(触发中断)

在这里插入图片描述
配置完中断后,我们知道程序一旦中断,就会跳到中断子程序中,而若此时发生多处中断,则我们就需要去将这几个中断按照优先级进行排序。

NVIC全称为嵌套的矢量中断,嵌套即说明中断可以被中断优先级高的所打断。

④配置中断优先级
如图所示,优先级共16个等级,用二进制表示则需要四位去表示0000(0)~ 1111(15)
在这里插入图片描述下一步则需找到CubeMX中的对应配置位置
在这里插入图片描述
在这里插入图片描述设置其优先级为3。

主优先级(高占先式):高占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套。
副优先级(非抢占式):在占先式优先级相同的情况下,高副优先级的中断优先被响应。
示例:
中断 3(RTC_WKUP 中断)的抢占优先级为 2,响应优先级为 1。
中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。
中断 7(外部中断 1)的抢占优先级为 2,响应优先级为 0。
则有 中断 7>中断 3>中断 6。
注意!!!!优先级值越小,则优先级越高

其他的配置因和上一节内容一致,如果是直接复制来的环境则不需要额外配置
在这里插入图片描述

3.Keil中对USART的配置

(1)编译一遍
拿到一个新环境,第一步就是要进行编译:
在这里插入图片描述
或许有人会像图中一样发生大量的warning和error,实质上是因为当我们通过CubeMX生成新环境时,会将原有的main.c进行重写,而我们是基于上一节的代码进行使用,则需要我们根据error提示去参考原代码去将其缺少部分进行补充。
在这里插入图片描述
例如我是缺少了一些头文件,还有的人可能有以下情况:
①定义的函数没有了
②几行函数声明没有了
③全局变量没有了
④主函数里的LCD_Init、LCD_Clear和control_led没有了
⑤while循环里调用的内容无了(一定会没有)
但是如果仔细发现,多了一个串口的Init
在这里插入图片描述
(2)定义并书写中断子程序
我们书写的中断子程序本质上是一个函数,应该放在uart.c的尾部
在这里插入图片描述
而我们要写的函数名位于stm32g4xx_hal_uart.c中,可以进入该文件进行查找
在这里插入图片描述
我习惯于记住函数名里有“__weak”和“Rx”,依靠前者进行查找
在这里插入图片描述__weak的含义是:此函数为弱函数,即我们可以去重写函数,当我们重写函数的名称与其相同时,程序会优先调用我们的强函数。【可以理解为C++函数重载的低级版本】
因此自定义函数命名此名,并书写到usart.c中
在这里插入图片描述
写一个简单的函数:
在这里插入图片描述这里可以先不去理解是什么意思,后续会进行讲解。

三、相关函数知识补充

*(1) HAL_UART_IRQHandler(UART_HandleTypeDef huart); //串口中断处理函数
功能:判断是发送中断还是接收中断,然后进行数据的发送和接收处理。
*(2) HAL_UART_TxCpltCallback(UART_HandleTypeDef huart); //串口发送中断回调函数
功能:发送中断完成之后,并不会直接退出,而是会进入中断回调函数中,用户可以在其中设置代码。
*(3) HAL_UART_RxCpltCallback(UART_HandleTypeDef huart); //串口接收中断回调函数
功能:接收中断完成之后,并不会直接退出,而是会进入中断回调函数中,用户可以在其中设置代码。
**(4) HAL_UART_Receive_IT(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size)
功能:设置接收数据存放的位置和接收数据的长度。串口接收到指定长度数据后,关闭中断(只触发
一次),进入中断接收回调函数。
**(5) HAL_UART_Transmit(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size, uint32_t Timeout)
功能:设置发送数据存放的位置和数据的长度。如果超时没发送完成,则不再发送,返回超时标志
(HAL_TIMEOUT)。

说明:Drivers/STM32G4xx_HAL_Driver\stm32g4xx_hal_uart.c 中函数开头:HAL_UART_

<think>好的,用户想了解STM32G431串口中断实现过程或教程。首先,我需要回忆STM32的USART中断配置的一般步骤,然后结合G4系列的特点来整理。首先,USART中断通常涉及几个关键步骤:初始化GPIO、配置USART参数、使能中断并设置优先级、编写中断服务函数,以及主程序中的处理逻辑。 对于STM32G431,需要确认它的USART外设支持的中断类型,比如接收完成、发送完成、空闲中断等。用户可能需要接收数据,所以RXNE(接收寄存器非空)中断是重点。同时,还要考虑NVIC的配置,确保中断通道正确,优先级设置合理。 接下来要考虑的是HAL库的使用,因为STM32通常用HAL或者LL库来开发。HAL库中,初始化USART后,需要调用HAL_UART_Receive_IT函数来启动接收中断。同时,中断服务函数需要调用HAL_UART_IRQHandler,然后用户可以在回调函数中处理数据。 可能需要注意的地方包括时钟配置是否正确,GPIO的Alternate Function设置是否正确对应USART的引脚,以及中断服务函数的名称是否正确。STM32G4系列可能有不同的中断处理函数名称,需要查看启动文件中的中断向量表确认。 用户可能需要具体的代码示,所以应该提供一个简单的接收中断子,包括初始化代码、中断服务函数和回调函数。另外,可能还需要提醒用户关于缓冲区管理和防止溢出等问题,比如使用DMA或者及时读取数据。 此外,参考资料中的README.md提到了micro-ROS的设置,但用户的问题是关于USART中断的,可能需要忽略不相关的部分,专注于USART配置的中断部分。不过,如果有相关配置在micro-ROS中涉及串口中断,可能需要提及,但用户的问题更偏向基础的中断实现,所以保持答案集中在标准HAL库的使用上。 最后,生成相关问题时要考虑用户可能的后续疑问,比如如何发送数据、如何处理错误中断、如何结合DMA使用等。确保问题覆盖常见的应用场景,帮助用户深入学习。</think>### STM32G431串口中断实现步骤 #### 1. 硬件配置 - 确认USART引脚对应关系(如USART1_TX/PA9,USART1_RX/PA10) - 在CubeMX中配置USART为异步模式,开启中断功能[^1] #### 2. 初始化流程 ```c // GPIO初始化 GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // USART参数配置 huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; HAL_UART_Init(&huart1); // 中断配置 HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); ``` #### 3. 中断服务函数 ```c void USART1_IRQHandler(void) { HAL_UART_IRQHandler(&huart1); // 自定义处理逻辑可在此添加 } ``` #### 4. 接收回调函数 ```c #define RX_BUFFER_SIZE 128 uint8_t rx_buffer[RX_BUFFER_SIZE]; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1){ // 处理接收数据 // 重新启动接收 HAL_UART_Receive_IT(&huart1, rx_buffer, 1); } } ``` #### 5. 主程序调用 ```c // 启动首次接收 HAL_UART_Receive_IT(&huart1, rx_buffer, 1); while(1) { // 主循环处理 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值