当前位置: 首页 > news >正文

STM32F103_LL库+寄存器学习笔记07 - 串口接收缓冲区非空中断

导言


上一章节《STM32F103_LL库+寄存器学习笔记06 - 梳理串口与串行发送“Hello,World"》梳理完USART的基本设置与发送字符串“Hello,World",接着梳理接收缓冲区非空中断。

实用的串口接收程序都会使用中断方式,不会使用轮询方式。最主要的原因当波特率较高时,轮询极其容易错失数据,而中断方式能确保及时获取数据。另外,轮询方式需要不断查询USART_SR的RXNE位(接收数据寄存器非空),即使没有数据到达。这会导致CPU资源浪费,尤其在低速通讯或数据不频繁到达时。中断方式只有在数据到达时(RXNE = 1),才需要CPU介入处理,其他时间CPU可以专注处理其他任务,显著提高系统效率。

接收中断也有区分:

  1. 接收缓冲区非空中断(本章节目的)
  2. IDLE接收空闲中断(需配合DMA一起使用,后续再梳理)

效果如下:
在电脑上用串口助手往STM32开发板发送字符串"Send\r\n",STM32开发板收到字符串"Send"后,马上回传给电脑的串口助手。
在这里插入图片描述
如上图所示,往开发板发送字符串"Send\r\n"后,开发板会将内容原封不动回传。

项目地址:https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library07_usart_interrupt_receive

一、CubeMX


在这里插入图片描述
如上所示,开启USART1全局中断。
在这里插入图片描述
确认是LL库代码后,生成代码。

1.1、usart.c

在这里插入图片描述

1.2、stm32f1xx_it.c

在这里插入图片描述
如上所示,多了全局中断函数USART1_IRQHandler()
在这里插入图片描述
这个函数命名在启动文件的中断向量表里。
在这里插入图片描述
如上所示,启动文件里的中断向量表跟《STM32F1参考手册》章节9.1.2的表一样,USART1全局中断上面是SPI2全局中断。

二、代码(LL库)


开始使用LL,实现接收缓存区非空中断程序。

2.1、main.c

在这里插入图片描述
在这里插入图片描述

2.2、stm32f1xx_it.c

在这里插入图片描述

2.3、编译、下载

在这里插入图片描述
效果如下:
在这里插入图片描述

三、寄存器的梳理


3.1、在USART_CR1打开接收缓存区非空中断

在这里插入图片描述
在这里插入图片描述

如上所示,寄存器USART_CR1的位5-RXNEIE置1时,开启接收区非空中断。

USATT1->CR1 |= (1UL << 5UL); // // 设置 CR1 寄存器的 RXNEIE 位(位 5)为 1,启用 RXNE 中断

3.2、在USART_SR判断接收缓冲区非空中断

在这里插入图片描述
在这里插入图片描述

如上所示,从寄存器USART_SR的位5-RXNE判断,是不是读数据寄存器非空,表示是否有收到数据。

if (USART1->SR & (1UL << 5UL)) {
	// 读数据寄存器非空,USART->DR寄存器收到数据
}

四、代码(寄存器方式)


4.1、main.c

在这里插入图片描述
在这里插入图片描述

4.2、stm32f1xx_it.c

在这里插入图片描述
如上所示,从USART1->SR判断接收缓冲区非空中断的同时也要判断程序有没有开启接收缓冲区非空中断(USART1->CR的位5-RXNEIE),这样做的目的是程序更加健壮。
uint8_t received_data = (uint8_t)(USART1->DR & 0xFF)的写法为什么不能用uint8_t received_data = USART1->DR???

  1. received_data是8位变量 ,然而USART1->DR是32位变量。
    • USART1->DR 是一个 32 位寄存器,直接赋值时编译器会发出警告(如果开启了严格的警告选项,例如 -Wconversion),提示从 32 位到 8 位的隐式转换可能丢失数据。
    • 如果将来串口配置改为 9 位数据模式(LL_USART_DATAWIDTH_9B),直接赋值会丢失第 8 位的信息(因为 uint8_t 只能存储 8 位)。
  2. 避免编译器警告,代码更健壮。可移植性更好,即使将来数据位宽改变(例如 9 位),也能通过调整掩码(例如 0x1FF)轻松适配。例如:uint16_t received_data = (uint16_t)(USART1->DR & 0x1FF);

4.3、编译、下载

在这里插入图片描述
在这里插入图片描述
如上所示,代码的效果跟LL库一样。
在这里插入图片描述
如上所示,通过debug模式打断点,观察寄存器USART1->SR的位RXNE确实被置1了。

如果作者的文章帮助到你,可以请作者喝杯咖啡,感谢!
在这里插入图片描述

相关文章:

  • Microi吾码界面设计引擎之基础组件用法大全【内置组件篇·下】
  • Linux Shell(Bash) 快捷键整理
  • 2.2.2 Spark单机版环境
  • JAVA中栈内存溢出问题分析
  • REC一些操作解法
  • WPF 依赖项属性
  • Java8通过Stream对list对象某个属性去重
  • 【计科】从操作系统到虚拟化技术(进程调度,内存映射,设备IO,文件、网络管理)
  • 每日总结3.27
  • linux服务器配置jupyter或python上安装字体
  • 单片机时钟树中RTC和IWDG讲解
  • LeetCode hot 100—零钱兑换
  • Open WebUI自定义OpenWebUI图标
  • 基于springcloud微服务架构的巡游出租管理平台
  • SQL优化 | 精准区分 trace_id、sql_id、plan_id(二)
  • HarmonyOS-ArkUI Navigation (导航组件)-第一部分
  • 【网络丢包】原因排查及优化
  • PTA 7-16 一元多项式求导
  • leetcode1248. 统计「优美子数组」
  • JavaScript获取元素及事件5种方法
  • 网站怎么添加手机版/怎么查询搜索关键词
  • 网站美工费用/电子商务营销方法
  • 昆山网站建设/营销型高端网站建设
  • 怎么做网站分析/seo软件推荐
  • 天津南开做网站/北京seo顾问
  • 案例分析网站/网站设计用什么软件