STM32系列(HAL库) ——使用串口打印的3种方式

一、前期准备

1、硬件:

  • STM32C8T6最小系统板
  • USB-TTL串口模块
  • ST-Link下载器
  • 2、软件:

  • keil5-IDE
  • cubeMX
  • 二、cubeMX配置

    1、配置RCC——选择外部时钟源

    2、配置SYS—— Serial Wire模式 

     3、时钟树拉满72M 

            ……

     4、配置串口1    

     5.创建工程

            ……

    三、keil5代码

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

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

    #include <stdio.h>
    /*********************************************************
    *
    *重定义 fputc 函数
    *
    *********************************************************/
    int fputc(int ch,FILE *f)
    {
    	HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
    	return ch;
    }

     ②:在Keil5中勾选如下选项

     ③调用 printf 函数打印

        注意:在任意需要使用printf函数打印的C文件中,都需要引用#include <stdio.h>头文件

    2.方式二:

            从原子哥那边直接搬过来的,无需改动

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

    #include <stdio.h>
    #pragma import(__use_no_semihosting)             
    //标准库需要的支持函数                 
    struct __FILE 
    { 
    	int handle; 
    
    }; 
    
    FILE __stdout;       
    //定义_sys_exit()以避免使用半主机模式    
    void _sys_exit(int x) 
    { 
    	x = x; 
    } 
    //重定义fputc函数 
    int fputc(int ch, FILE *f)
    {      
        //二选一,功能一样
        HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
    	return ch;
        
    //	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    //    USART1->DR = (uint8_t) ch;      
    //	return ch;
    }

    ②调用 printf 函数打印

       注意:在任意需要使用printf函数打印的C文件中,都需要引用#include <stdio.h>头文件

    3.方式三

            适合多个串口打印,也是从原子哥那边搬过来的,但是在HAL需要修改,具体修改细节不赘述,下面是直接给出修改后的代码。

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

    #include <stdarg.h>
    #include <string.h>
    #include <stdio.h>
    void UsartPrintf(UART_HandleTypeDef USARTx, char *fmt,...)
    {
    
    	unsigned char UsartPrintfBuf[296];
    	va_list ap;
    	unsigned char *pStr = UsartPrintfBuf;
    	
    	va_start(ap, fmt);
    	vsnprintf((char *)UsartPrintfBuf, sizeof(UsartPrintfBuf), fmt, ap);							//格式化
    	va_end(ap);
    	
    	while(*pStr != NULL)
    	{
            HAL_UART_Transmit (&USARTx ,(uint8_t *)pStr++,1,HAL_MAX_DELAY );		
    	}
    
    }

    ②:需要在 usrat.h文件中添加如下代码

    #define USART_DEBUG		huart1
    
    void UsartPrintf(UART_HandleTypeDef USARTx, char *fmt,...);

    ③使用方法,直接调用函数,C文件无需引用#include <stdio.h>头文件

    UsartPrintf(USART_DEBUG, "The USART1 is OK!\r\n");

    注意:函数参数中 USART_DEBUG 参数为在 usrat.h 中重定义的 huart1 。

            如果您同时打开了USART1和USART2,那么在 usrat.h 中还会有一个 huart2 ,您可以像huart1 一样重定义 huart2 ,可以自定义成其它名字如 COM2 以和其它串口区分开来。

            显然,方法3适用与使用多个串口的情况,比如在使用esp01-s互联网模块时,一个串口用来调试,另外一个用于和模块通信。

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32系列(HAL库) ——使用串口打印的3种方式

    发表回复