STM32的USART注意

2023-05-16

在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送结束

XE--写寄存器DR清零

RXNE--读寄存器DR清零,也可软件手动清零

 TC--  读/写寄存器DR清零,也可软件手动清零

先说TC。即Transmission Complete。发送一个字节后才进入中断,这里称为“发送后中断”。

    再说判断TXE。即Tx DR Empty,发送寄存器空。当使能TXEIE后,只要Tx DR空了,就会产生中断,所以,发送完字符串后必须关掉,否则会导致重复进入中断。

    我的失败经历是在串口初始化是 USART_ITConfig(USART1, USART_IT_TXE, ENABLE);结果在串口中断中没有关闭txe,所以你上电后什么也不做,系统就会一直进中断,也就是发送为空,但是也进中断。所以串口初始化函数中就不用打开TXE的中断了。

1,用串口连续发送一串数字时, 第一个数总是发不出去

这个问题的根本原因是复位后,TC和TXE标志位默认都是1,很多人喜欢这样写: 
    USART_SendData(USART1, (u8) ch);  while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)  
    while在发送第一个字节时没有起到应有作用,直接跳出,接着写第二个字节,这时第一个字节还未发出,数据被破坏了.

看看datasheet,果然复位以后, SR=0x00c0;TC=TXE=1;

有人是在串口中断处理函数void USARTx_IRQHandler(void)最后加上下面的来解决第一个字节发布出去的问题。

if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)                   /
 { 
   USART_ITConfig(USART2, USART_IT_TXE, DISABLE);    
 }

其中TC判断的是一帧数据,而TXE是当TDR数据传到移位寄存器就被置位了,所以TC的时间比较长,很容易被下一次数据覆盖~~~所以一般喜欢判断TXE,数据写到DR就可以了 ,剩下的工作就交给硬件了,一般的用TXE就可以了, TC一般用于需要延时的场合,比如说是232/485转换器,需要得到TC后,才能将发送改变成接收,否则 最后一个字节发送不完全。

2.其实可以不用TC,也不用初始化使能USART_ITConfig(USART1, USART_IT_TXE, ENABLE);发送函数这样写:

发送函数可以这样写

 void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,uint16_t Len)

  uint16_t i;
  for(i=0; i<Len; i++)
  {
    USART_SendData(USARTx, Data[i]);
    //while(tx_flag==0)
    //{}
    //tx_flag=0;
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE)==RESET);                   //判断是否发送完成。 USART_FLAG_TC
  }

中断处理函数这样写:

void USARTx_IRQHandler(void)
{
  if(USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)  
  {
    uartx_recv(); //接受处理函数
  }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32的USART注意 的相关文章

  • 单片机串口分析起始位停止位奇偶校验位

    串口解析 串口配置 1 波特率 2 停止位 3 数据位 4 奇偶校验位 比特率 xff1a 通讯的频率停止位 xff1a 可以选择1 1 5 2三个选择数据位 xff1a 可以选择5 6 7 8四个选择奇偶校验位 xff1a 可以选择奇校验

随机推荐

  • 在算法研究过程中如何进行算法创新

    FPGA教程目录 MATLAB教程目录 创新一直是一个令人纠结的话题 xff0c 研究生毕业设计多数需要算法的创新 xff0c 而博士生毕业更需要大量的创新才行 另外一方面 xff0c 一些前沿的课题 xff0c 更是对算法的创新有着较高的
  • GPIO口相关配置寄存器

    STM32的每个Px端口都有四种7个寄存器来控制 xff0c 分别是 xff1a 2个32位的端口输入输出模式寄存器CRL CRH 2个32位的数据寄存器IDR ODR 1个32位的置位 复位寄存器BSRR 1个16位的复位寄存器BRR 1
  • STM32串口接收以及发送大全

    串口接收 xff1a 一 一帧数据以 r n结束 协议理解 xff1a 协议嘛 xff0c 就是我们人为创造一条规则 xff0c 按这条规则规规矩矩地来章程执行能够减少错误 xff0c 效率更高 xff0c 都执行一个规则也能大一统 下面我
  • 51单片机串口奇偶校验

    有的单片机串口奇偶校验都是硬件自动完成的 xff0c 但是就我目前用到的很多51核的单片机 xff0c 需要软件做一些简单的处理来完成奇偶校验 可以自己写一个简单的小程序来实现 xff1a 一位一位的判断1的个数 xff0c 这个当然好实现
  • C语言printf()输出格式大全

    这里写自定义目录标题 1 xff0e 转换说明符 a A 浮点数 十六进制数字和p P 记数法 C99 c 字符 d 有符号十进制整数 f 浮点数 包括float和doulbe e E 浮点数指数输出 e E 记数法 g G 浮点数不显无意
  • 2019年 电赛C题 全国大学生电子设计竞赛试题解析与总结

    2019年全国大学生电子设计竞赛试题 电赛C题 分析与总结 线路负载及故障检测装置 本科组 一 题目任务 设计并制作线路负载及故障检测装置 xff0c 示意图如图1所示 检测装置只通过两个连接端子与两根导线连接 导线上A B两点距离各自连接
  • 用moment获取一年内指定周的起始时间和结束时间、用户所选时间和前端传参时间不一致问题

    问题1 xff1a 原代码 xff1a 所选周 selectedWeek handler let selectedWeek 61 parseInt this selectedWeek substring 1 计算所选周的周开始时间和周结束时
  • HTML知识(一)

    1 HTML元素 HTML元素指的是从开始标签 start tag 到结束标签 xff08 end tag xff09 的所有代码 元素内容是开始标签与结束标签之间的内容 某些HTML元素具有空内容 xff0c 空元素在开始标签中进行关闭
  • CSS隐藏元素、BFC、元素居中、布局

    1 css中有哪些方式可以隐藏页面元素 xff1f 区别是什么 xff1f 1 1 display none 元素在页面上将彻底消失 xff0c 元素本身占有的空间会被其他元素占有 xff0c 导致浏览器的重排和重绘 特点 xff1a 元素
  • 响应式设计和CSS提高性能的方法

    一 响应式设计 1 是什么 xff1f 是一种网络页面设计布局 xff0c 页面的设计与开发应当根据用户行为以及设备环境 xff08 系统平台 屏幕尺寸 屏幕定向等 xff09 进行相应的响应和调整 2 常见特点 xff08 1 xff09
  • js事件循环机制

    一 同步任务与异步任务 JavaScript是一门单线程 语言 xff0c 但是单线程并不意味着阻塞 实现单线程非阻塞的方式就是事件循环机制 在JavaScript中 xff0c 所有的事件都可以分为同步任务和异步任务 同步任务 xff1a
  • 简易MIMO-OFDM系统的设计

    0 完整源码获得方式 订阅MATLAB FPGA教程 xff0c 免得获得教程案例以及任意2份完整源码 MIMO OFDM系统的接收信号是多个发射天线发送信号的衰落与加性噪声的线性叠加 xff0c 若采用通常SISO OFDM系统或MIMO
  • 栈的定义和操作

    一 栈的定义 栈是一种操作受限制的线性表 xff0c 将允许进行插入 删除的一端称为栈顶 xff0c 另一端称为栈底 二 栈的分类 栈主要分为静态栈和动态栈 xff0c 静态栈类似于数组 xff0c 而动态栈类似于链表 xff0c 但只能对
  • 用C语言和前序遍历创建一棵二叉树

    一 二叉树的介绍 二叉树的特点是二叉树的每个结点的度都不大于2 xff0c 可以视为每个结点都有左孩子和右孩子 故二叉树结点的数据结构为 typedef int BDataType typedef struct BTNode BDataTy
  • 超市购物程序设计

    一 任务介绍 1 任务描述 去超市购物说人们日常生活的重要事情之一 在超市中有很多日常生活的用法 xff0c 如水果 蔬菜 洗衣机 电冰箱等 人们只能买到超市中的已有商品 xff0c 如果所需要的商品在超市中没有或已经卖完了 xff0c 那
  • 如何在IDEA中配置XML、添加XML文件样板以及设置项目编码方式

    一 如何在IDEA中配置XML 1 首先保证本地电脑上有apache maven包 xff0c 打开IDEA 2 点击File下拉菜单中的Settings xff0c 弹出Settings菜单框 3 在弹出的菜单框中选择Build Exec
  • Java之String类与StringBuffer类

    一 String类 1 实例化方式 1 xff09 直接赋值法 String str 61 34 abc 34 String类的设计采用了共享设计模式 在JVM底层实际上会自动维护一个对象池 xff08 字符串对象池 xff09 xff0c
  • 人脸识别项目的测试用例

  • 球机和枪机的区别

    球机 和 枪机 的区别最明显的应该就是外形的区别 xff0c 那么 xff0c 球机和枪机还有什么深层次的区别呢 xff1f 枪机即 枪式摄像机 xff0c 其监控位置固定 xff0c 只能正对某监控位置 xff0c 所以监控方位有限 枪机
  • STM32的USART注意

    在USART的发送端有2个寄存器 xff0c 一个是程序可以看到的USART DR寄存器 另一个是程序看不到的移位寄存器 对应USART数据发送有两个标志 xff0c 一个是TXE 61 发送数据寄存器空 xff0c 另一个是TC 61 发