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

UART编程

Q:为什么使用串口前要先在电脑上安装CH340驱动?

中断的作用?

环形buffer的作用?

static和valitate的作用

三种编程方式简介

 

也可以通过DMA方式减小CPU资源的消耗

直接把数据在SRAM内存和UART模块进行传输 ,流程:

  • 把数据在DMA中配置好
  • 数据传输
  • 产生中断,CPU介入

编程方式改进 

1、查询方式对应的读写会存在时间延迟

比如接收:没来得及保存RDR寄存器中接受到的数据时,RDR寄存器的值就已经被覆盖;

2、中断方式:事先在发送buffer中存好数据,使能发送空中断;把接受的数据存入buffer

发送

  • char tx_buf[100];存数据
  • enable TXE
  • TXE_ISR:中断来取出数据发给TDR

接收

  • 使能RXNE(接收非空)
  • RXNE_ISR:利用中断从RDR中取数据到缓冲区

3、用环形缓冲区改进中断

4、用DMA方式减小CPU资源的消耗

一、查询方式进行编程 

核心:判断TDR和RDR寄存器的状态

缺点:当接收时,若没有来得及读取数据,RDR中的值容易被覆盖,进而丢失数据

实现:

  • 发送:先判断发送寄存器是否为空(借助状态寄存器中的TXE),若为空,往里面(DR)写入数据,自己的存储器地址++(pdata16bits++)
  • 接收:判断RXNE是否收到数据(非空RXNE),若非空,读取DR,存进自己的存储器

 

二、官方中断方式进行编程 

while(1){

调用HAL_UART_Transmit_IT使能中断(中断处理进行接收)14

等待中断处理(接收)完毕

打印1(23)

}

核心:通过使能中断,有字节就会

缺点:必须有函数及时调用HAL_UART_Transmit_IT,若未及时调用,数据也会丢失,实际场景中不会使用。。。。。所以HAL_UART_Transmit_IT没有什么作用

步骤:cubeMX,选择UART1串口,使能中断

代码逻辑:初始化串口时,同样使能了中断和设置了中断的优先级;在中断文档中,增加了串口1 的中断处理函数。(但只是使能串口1的中断总开关,没使能发送或接收中断,中断的管理还需要自己实现)

代码实现:

  • 调用HAL_UART_Transmit_IT函数,使能中断UART_IT_TXE,使能后就返回,并不处理数据(中断UART_IT_TXE,把数据发给寄存器)
  • 在中断处理函数中,若发送1000字节,则启动999次TXE中断和1次TC中断(调用HAL_UART_TxCpltCallback)

在接收时,因打印比较耗时,若每及时的调用HAL_UART_Transmit_IT函数使能中断,数据仍然会丢失

要发送数据时,使能“TXE”中断(发送寄存器空中断)。在 TXE 中断处理函数里,从程序的发送 buffer 里取出一个数据,写入 TDR;(TDR为空时:buffer---TDR---移位寄存器

对于接收数据,在一开始就使能“RXNE”中断(接收寄存器非空)。这样,UART 接收到一个数据就会触发中断,在中断程序里读取 RDR 得到数据,存入程序的接收 buffer。(RDR非空时:移位寄存器---RDR---buffer

和查询相比:多了对事件的实时相应

TXE中断:TDR中的数据放入移位寄存器

TC中断:移位寄存器中的数据全部发送出去

二、中断方式改造

使能接收中断

初始化缓冲区

while(1){

HAL_UART_Transmit_IT;

circle_buf_read(&g_uart1_rx_bufs, pVal);

等待数据传输完毕;

}

不太懂!!!!

① 一开始就使能接收中断
② 接收中断处理函数里,把数据存入环形 buffer,并再次使能接收中断

三、DMA方式进行编程 

优点:在数据传输的过程中不使用CPU的资源 

配置DMA,进而实现在UART串口的TDR,RDR寄存器芯片内存SRAM之间的直接数据传输。

当指定目标数量的数据传输完成后才会产生中断,进而让CPU介入。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于复旦微JFMQL100TAI的全国产化FPGA+AI人工智能异构计算平台,兼容XC7Z045-2FFG900I
  • 全面揭秘:ChatGPT-4o带来的下一代AI能力
  • 环境管理开发实战
  • 卸载docker
  • Python input NameError: name ‘xxx‘ is not defined.
  • 智充科技营收增速放缓:经营成本飙升,应收账款大幅增长
  • Halcon机器视觉15种缺陷检测案例_4产品毛剌检测
  • 【2024年全国青少信息素养大赛c++初中复赛集训第一天编程题分享】
  • 3、Chronos
  • 数学建模·模糊评价法
  • ffmpeg新旧函数对比
  • 微信视频号的视频怎么下载到本地?快速教你下载视频号视频
  • 算法训练营day11 栈与队列(栈的应用,单调队列,优先队列)
  • SSRF漏洞深入利用与防御方案绕过技巧
  • 多表联合的查询(实例)、对于前端返回数据有很多表,可以分开操作、debug调试教程
  • [deviceone开发]-do_Webview的基本示例
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 345-反转字符串中的元音字母
  • EOS是什么
  • fetch 从初识到应用
  • HTTP请求重发
  • java中具有继承关系的类及其对象初始化顺序
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Map集合、散列表、红黑树介绍
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Redis学习笔记 - pipline(流水线、管道)
  • RxJS: 简单入门
  • 工作手记之html2canvas使用概述
  • 聊聊redis的数据结构的应用
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端代码风格自动化系列(二)之Commitlint
  • 由插件封装引出的一丢丢思考
  • 转载:[译] 内容加速黑科技趣谈
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • %check_box% in rails :coditions={:has_many , :through}
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (day18) leetcode 204.计数质数
  • (libusb) usb口自动刷新
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (理论篇)httpmoudle和httphandler一览
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (生成器)yield与(迭代器)generator
  • (转)大型网站架构演变和知识体系
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .net 流——流的类型体系简单介绍
  • .net 使用ajax控件后如何调用前端脚本
  • .NET 中的轻量级线程安全
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .net项目IIS、VS 附加进程调试
  • /*在DataTable中更新、删除数据*/
  • @Import注解详解