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

网站设计公司服务平台windows优化大师官方下载

网站设计公司服务平台,windows优化大师官方下载,政府网站建设存在问题,深圳外贸建站模版导言 上一章节《STM32F103_LL库寄存器学习笔记06 - 梳理串口与串行发送“Hello,World"》梳理完USART的基本设置与发送字符串“Hello,World",接着梳理接收缓冲区非空中断。 实用的串口接收程序都会使用中断方式,不会使用轮询方式。最主要的原因…

导言


上一章节《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了。

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

http://www.dtcms.com/wzjs/188673.html

相关文章:

  • 网站按钮设计成什么颜色原因杭州网络推广有限公司
  • 新手做网站做那个进一步优化落实
  • 比较好的网站开发推广神器app
  • 公安局松江分局网站市场推广计划方案模板
  • 淘宝客推广seo排名优化教学
  • 业务网站制作咨询公司
  • 怎么做旅店网站今日新闻联播
  • 在线下载免费软件的网站成都seo排名
  • python 网站开发实例百度指数在线查询前100
  • 哪个网站做logo赚钱2023年时政热点事件
  • 如何做网站长尾关键词布局深圳市昊客网络科技有限公司
  • 关于做网站的书推广普通话的宣传标语
  • 技术支持 东莞网站建设国内新闻大事20条
  • nodejs可以做网站么长沙哪家网络公司做网站好
  • 昆山营销型网站建设方法seo是什么工作
  • 做国外的营销的网站河南靠谱seo地址
  • 私人做医院的网站江西seo推广软件
  • 两台电脑一台做服务器 网站公司培训
  • 网站建设公司优惠中湖南网站推广公司
  • 域名可以同时做邮箱和网站么河南网站推广电话
  • 做的网站乱码怎么搞网站开发的步骤
  • 佛山免费自助建站模板游戏推广员一个月能赚多少
  • 平顶山市做网站极速一区二区三区精品
  • 石家庄建行网站百度风云榜小说榜排名
  • 重庆最新消息今天优化seo设置
  • 湖北省住房和建设厅网站首页软文广告经典案例300大全
  • web前端开发培训机构百度关键词优化多少钱
  • 超链接到网站怎么做视频文件下载如何做网站seo
  • 山东助企网站建设it培训机构出来能找到工作吗
  • 网站推广需求百度云网页版入口