• uart 问题点:


    使能UART串口中断之后,有接收到UART数据,进入中断,此时要清除RXNE接收标志位:

    1.通过软件向该RXNE标志位写入零来清零;

    2.通过对 USART_DR 寄存器执行读入操作将该位清零。

    这里可以查看对应《参考手册》,一般我们选择第2种,通过读取UART串口数据来清零。

    1.中断接收数据丢失

    在UART串口中断函数中,或者更高优先级中断函数中长时间执行,导致接收丢失,所以,请勿在中断函数中长时间执行。

    特别有些人,还在中断函数添加延时函数。实际应用中,只要不是特殊情况,比如测试某个功能可以添加延时函数,都不建议在中断函数添加延时函数。

    2.ORE上溢错误

    ORE上溢错误是什么意思呢? 可能很多人不了解,简单说就是:UART接收到有数据,没有去取,但又来了数据,此时就会产生ORE上溢错误。(请看“参考手册”)

    其实,上面这种长时间在占用中断,就会导致UART接收数据上溢。

    很多人没有在意这个,如果是使能了中断接收,标志位没有清除,又有ORE上溢错误的话,程序就会不停地进入UART中断。(大家不妨试一下,看一下是不是你代码一直在UART中断里面不停运行)。

    3.使能接收中断前,先清除接收标志位

    有时候,在程序初始化的时候,就会接收到数据,这个时候建议大家先清除接收标志位再使能接收中断。类似如下

    DMA接收串口数据
    使用DMA接收串口数据,相信很多朋友都知道。这个可以理解为使用队列,或者FIFO的形式,防止因高优先级中断而打断,导致接收数据丢失。

    但很多人都遇到过,接收不到数据,或者数据异常的情况。所以,这里同样有需要注意的地方。

    1.使能UART之前,先使能DMA相关配置

    这个和清除标志位一样的道理,使能UART之前,先使能DMA相关配置,防止在配置过程中有接收数据。
    ————————————————

    2.ORE上溢错误导致不能使用DMA接收数据

    导致不能DMA接收不到数据的根源,有一种可能就是有ORE上溢错误。

    若在串口初始化并使能后到 DMA 使能之前有数据来,MCU是不能接收的。如果此时数据寄存器 USART_DR 存在一个数据,再来一个数据,就会导致ORE上溢错误。

    一旦产生上溢错误后,就无法再触发 DAM 请求,及时之后再启动 DMA 也不行,无法触发 DMA 请求就无法将数据寄存器内的数据及时转移走,如此陷入死锁。这就是串口无法正常接收的原因。

    所以,最后提醒大家,配置时,请一定要注意这些细节。
    ————————————————
    版权声明:本文为CSDN博主「ybhuangfugui」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ybhuangfugui/article/details/99827037

    串口接收工具显示中文为乱码显现:

    排查常规配置正确后,说明编译后的文件错误,根据网上的教程,我们需要更改main.c文件的格式,由默认的编码格式UIF-8,另保存为ANSI 格式文件,重新编译下载程序,断点运行程序,即可解决问题。

  • 相关阅读:
    [网页基础]DIV+CSS学习笔记(一)CSS的引入及选择器基础
    [网页基础]CSS+DIV布局,简单布局例子
    [C#]结构体和类的区别
    [网页基础]DIV+CSS学习笔记(二)深入理解盒子模型
    [数据库]mysql存储过程的建立及使用
    [网页基础]DIV+CSS学习笔记(三)盒子的定位与浮动
    [C#]List的Sort()、Find()、FindAll()、Exist()的使用方法举例
    Java实现断点续传和原理
    Minio的Docker部署dockercompose启动流程
    ShardingJDBC
  • 原文地址:https://www.cnblogs.com/LVNG2018/p/13026398.html
Copyright © 2020-2023  润新知