zoukankan      html  css  js  c++  java
  • STM32使用printf丢失第一个字母的问题


    STM32使用printf函数给串口打印信息的执行步骤为:

    1.重定向printf函数

    给uart.c文件中增加如下函数:

    //重定向c库函数printf到USART1
    int fputc(int ch, FILE *f)
    {
     /* 清SR寄存器中的TC标志 */
     USART_ClearFlag(USART1,USART_FLAG_TC);
     
     /* 发送一个字节数据到USART1 */
     USART_SendData(USART1, (uint8_t) ch);
     
     /* 等待发送完毕 */
     while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
     return (ch);
    }

    2.增加头文件stdio

    #include <stdio.h>

    3.勾选Use MircoLIB

    勾选miro-lib

    以上3条,缺一不可,如果你只做了第一步,编译的时候,就会报错,如下所示:

    CFGuart.c(52): error:  #20: identifier "FILE" is undefined

    如果只做了前两步,而没有勾选Use MicorLIB,编译器虽然不会报错,但是串口不会输出数据。

    很多人做了重定向函数以后,输出一串字符的第一个字符会丢失,根本原因是因为SR寄存器中的TC标志默认是置1的。

    解决方法1:和我上面的重定向函数一样,在开始先用USART_ClearFlag(USART1,USART_FLAG_TC);函数把TC标志清0。

    解决方法2:写字符串的时候,前面留一个空格。

    两种方法选一个即可。

    给出一个使用printf函数在STM32串口1输出数据的完成工程源代码:

    点击下载:【例程2.6】printf函数(MDK5工程)


    转自:http://www.rationmcu.com/stm32/1517.html


  • 相关阅读:
    使用jQuery实现伪分页
    使用jQuery实现option的上移和下移
    理解Flux架构
    React 入门学习笔记1
    ES6新特性6:模块Module
    ES6新特性5:类(Class)和继承(Extends)
    ES6新特性4:字符串的扩展
    ES6新特性3:函数的扩展
    ES6新特性2:变量的解构赋值
    ES6新特性1:let和const
  • 原文地址:https://www.cnblogs.com/alan666/p/8311931.html
Copyright © 2011-2022 走看看