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


    一、基础知识
    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_

  • 相关阅读:
    Spring Cloud Alibaba【授权规则、系统自适应限流、SentinelResource注解配置详解之只配 置fallback】(八)
    ARM汇编之乘法指令
    安卓毕业设计app项目成品在线投票app毕业设计作品
    为什么你觉得FPGA难学?如何入门?
    机器学习(三):多项式回归
    java开源商城免费搭建 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城
    【MATLAB】【函数介绍】cp2tform函数从控制点对推断空间变换
    Linux环境sed工具的使用及工作原理
    【Godot】项目结构设计
    IP数据包分片理解
  • 原文地址:https://blog.csdn.net/qq_53826699/article/details/128002316