zoukankan      html  css  js  c++  java
  • STM32串口发送第一个字符丢失解决之道

    stm32用printf函数重定向到串口USART1发现第一个字符没打印出来具体如下:

    刚开始修改fputc函数如下:

    int fputc(int ch,FILE *f)
    {
    USART_SendData(USART1,(uint8_t)ch);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
    return(ch);
    }

    然后其他外设配置好之后直接使用printf(“abc");发现a打印不出来,具体原因为stm32的usart的sr寄存器的TC为初始为1,导致第一次while时的第一个数据被覆盖,所以打印不出;

    具体改进方法:

    1.直接修改while的等待条件,while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);把TC改为TXE,因为TXE只能硬件清零,在数据写进DR时就置0,数据移出时置1,可以保证数据不会在DR被覆盖;

    2.既然TC位初始为1导致的问题,那么我们在发送每一个字节前把TC置0也可以解决问题,

    写多一句USART_ClearFlag(UART4, USART_FLAG_TC);

    3.条件允许情况下,也可以委屈自己一下,在输出字符前面加一没用字符,也可以解决;

  • 相关阅读:
    static、final、this、super关键
    细节二:参数、引用类型、实例化
    枚举类型
    单例模式
    细节一:字符串、switch、默认值、数组
    类属性和类方法
    装饰器模式
    TreeSet
    可见参数和增强for以及自动拆装箱
    静态导入
  • 原文地址:https://www.cnblogs.com/god-of-death/p/6893555.html
Copyright © 2011-2022 走看看