• STM32应用开发教程进阶--UART串口重定向(printf)


    实现目标

    1、掌握STM32 HAL库的串口重定向

    2、具体目标:1、实现printf  “打印”各种常用的类型的数据变量


    一、串口“打印”

            UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是异步串行通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。

            UART 在开发中应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个UART 通信接口连接至电脑,用于在调试程序时可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错,具体在哪里出错等等。

    二、原理图设计

    三、STM32CubeMX 配置

    1.USART配置

    四、串口重定向程序设计

    1.方式一:使用微库(Use MicroLIB)

    ①:需要在 main.c 文件中添加如下代码

    1. /* USER CODE BEGIN Includes */
    2. #include
    3. /* USER CODE END Includes */
    1. /* USER CODE BEGIN 4 */
    2. /*********************************************************
    3. *
    4. *重定义 fputc 函数
    5. *
    6. *********************************************************/
    7. int fputc(int ch,FILE *f)
    8. {
    9. HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
    10. return ch;
    11. }
    12. /* USER CODE END 4 */

    ②:在Keil5中勾选如下选项

    2.方式二:不勾选 MicroLIB

    ①:需要在 main.c 文件中添加如下代码

    1. /* USER CODE BEGIN Includes */
    2. #include
    3. /* USER CODE END Includes */
    1. #pragma import(__use_no_semihosting)
    2. //标准库需要的支持函数
    3. struct __FILE
    4. {
    5. int handle;
    6. };
    7. FILE __stdout;
    8. //定义_sys_exit()以避免使用半主机模式
    9. void _sys_exit(int x)
    10. {
    11. x = x;
    12. }
    13. //重定义fputc函数
    14. int fputc(int ch, FILE *f)
    15. {
    16. //二选一,功能一样
    17. HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
    18. return ch;
    19. // while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
    20. // USART1->DR = (uint8_t) ch;
    21. // return ch;
    22. }

    说明:上面两种方法二选一即可

    五、“打印”测试程序设计

    1、定义各类型变量

    1. /* USER CODE BEGIN PV */
    2. int i = 0;
    3. float m = 3.14;
    4. char c = 'A';
    5. char *str = "Hello 李银河!";
    6. /* USER CODE END PV */

    2、在while (1) 里 打印各变量的值

    1. i++;
    2. printf("i = %d\r\n",i);
    3. printf("m = %.2f\r\n",m);
    4. printf("c = %c\r\n",c);
    5. printf("str = %s\r\n",str);
    6. HAL_Delay(200);

    六、实验效果

    七、仿真实现

    说明:proteus不能使用printf发送浮点型数据,一旦发送就会卡死。仿真时将小数打印代码屏蔽。


    总结

    1、串口打印在开发中非常重要,它就像是工程师的眼睛一样。尤其是在调试代码时,工程师可以利用串口打印出想要知道的变量等的值,以利于查找问题所在。

  • 相关阅读:
    R-CNN,Fast R-CNN详解
    如何使用Python和PaddleOCR轻松识别图片中的文字
    数据挖掘与分析课程笔记(Chapter 20)
    20个实用Python自动化脚本技巧
    ROCBOSS开源微社区轻论坛类源码
    Redis 学习笔记(五)高可用之主从模式
    Java进程退出
    Android Fragment 基本概念和基本使用
    给表弟写的Python制作GUI学生管理系统毕设,老师直接给出满分,毕业稳了
    5、Kafka海量日志收集系统架构设计
  • 原文地址:https://blog.csdn.net/luojuan198780/article/details/138044075