STM32开发中printf利用重定向方法输出到串口(CubeMX 基于HAL库方法,带实际项目应用技巧 巧用goto语句)

这篇具有很好参考价值的文章主要介绍了STM32开发中printf利用重定向方法输出到串口(CubeMX 基于HAL库方法,带实际项目应用技巧 巧用goto语句)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在stdio.h中的printf 原本输出到控制台, 在单片机应用中一般将其改到串口, 并利用串口输出信息来调试程序,非常方便。(本文以USART1为例)

此外CubeMX及CubeIDE 由于自动生成基础代码,因此每当更改硬件配置的时候, 都会被重置生成的基础代码。 这里使用goto语句来避免部分修改过的基础代码被替换掉。

方法如下:

  1. 配置CubeMX ,选择芯片: 选择芯片后勾选右上角蓝色图标:"StartProject"

单片机printf输出到串口,ARM,arm,Powered by 金山文档
  1. 在系统内核中,配置系统时钟。在mode中, 选择使用外部晶振。

单片机printf输出到串口,ARM,arm,Powered by 金山文档
  1. 进入 Clock Configuration 进行时钟树的配置(根据外接晶振的实际情况配置)

单片机printf输出到串口,ARM,arm,Powered by 金山文档
  1. 进入Connectivity选项卡配置 串口, 这里使用USART1, Mode选择为A,,, 即异步通讯。

单片机printf输出到串口,ARM,arm,Powered by 金山文档

5.在该页的Configuration中,依次配置ParameterSettings, NVIC及GPIO

根据串口的情况, 配置波特率,数据长度,停止位,及校验位,如下图绿框

单片机printf输出到串口,ARM,arm,Powered by 金山文档

接着配置NVIC, 勾选打开 global Interrupt

单片机printf输出到串口,ARM,arm,Powered by 金山文档

最后配置GPIO选项, 引脚以及由系统自动生成了, 这里需要将引脚改为上拉模式,如下图

单片机printf输出到串口,ARM,arm,Powered by 金山文档
  1. 在projectManager中,选择编译环境,准备自动生成代码

单片机printf输出到串口,ARM,arm,Powered by 金山文档
  1. 最后一步, 生成代码

单片机printf输出到串口,ARM,arm,Powered by 金山文档

在生成的代码中,我们可以看到,基本外设的初始化等基础函数及框架都已经由CubeMX自己生成完毕,并能够直接使用了。

其中关于USART外设部分 主要由结构体UART_HandleTypeDef, 和相关外设初始化函数:

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_USART1_UART_Init(void);组成

这里为了方便维护,将printf重新定向做了一个.c文件和.h头文件。 并命名为uart_printf.c和uart_printf.h. 保存在UserSrc的文件夹中。打开选项卡, 对刚做的头文件路径进行添加。(否则即使在代码中添加了#include“uart_printf.h”也会找不到, 头文件必须添加搜索路径。)

单片机printf输出到串口,ARM,arm,Powered by 金山文档

同时在选项卡中勾选使用微库。 (否则, 无法使用微库, 也就是说, 你添加了stdio或者string这样的C语言标准库,也无法使用。)

单片机printf输出到串口,ARM,arm,Powered by 金山文档

接着在生成的代码中 添加头文件。 注意, 用户代码必须严格的写在USER CODE BEGIN和END之间, 否则容易被重置掉。

单片机printf输出到串口,ARM,arm,Powered by 金山文档

代码自动生成的相关外设,不用管。 如果printf使用的是USART1, 就将huart1的结构体删除, 因为我们把这个结构体的声明放在了uart_printf.h中

单片机printf输出到串口,ARM,arm,Powered by 金山文档

在main函数中使用goto语句跳过初始化, (其实也不是跳过初始化, 而是跳过系统自动生成的部分,使用用户代码部分中的初始化, 来避免更改配置后被重置的一些问题。 )

单片机printf输出到串口,ARM,arm,Powered by 金山文档

在下面USART初始化函数的位置添加 空闲中断函数

单片机printf输出到串口,ARM,arm,Powered by 金山文档

接着创建两个文件, uart_printf.h和uart_printf.c

/*************uart_printf.h*********************/

#ifndef _UART_PRINT_H
#define _UART_PRINT_H

#include "main.h"
#include "stdio.h"


#ifndef _UART_PRINT_C
//放置需要被外部调用的uart.c文件中的全局变量\函数

#endif
extern UART_HandleTypeDef huart1;

void Usart_SendString(uint8_t *str);
int fputc(int ch, FILE *f);
int fgetc(FILE *f);


#endif

uart_printf.c文件如下:

/*************Printf重定向UART**************/
/*用途:
*使用printf将打印内容通过串口发送。 
*原理:
*将C语言库函数中的fputc 和fgetc函数重新定向到UART串口
*使用方法及注意事项:
*使用前,需要在main.c中添加头文件 "stdio.h""uart_printf.h" 如果是keil编译器,同时需要在选项卡中勾选“使用微库”
*
*默认使用USART1串口, 当需要使用其他串口的时候, 修改huart1 为目标串口, 
*建议使用CubeMX生成的代码,这样直接修改huart1后面的标号即可直接使用
******************************************/
#define _UART_PRINTF_C


#include "uart_printf.h"



/*****************  发送字符串(重新定向) **********************/
void Usart_SendString(uint8_t *str)
{
    unsigned int k=0;
  do 
  {
      HAL_UART_Transmit(&huart1,(uint8_t *)(str + k) ,1,1000);
      k++;
  } while(*(str + k)!='\0');
  
}
///重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
    /* 发送一个字节数据到串口DEBUG_USART */
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);    
    
    return (ch);
}

///重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
        
    int ch;
    HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);    
    return (ch);
}

编译一下,就可以使用printf函数输出串口了

例如在需要的地方 加上printf输出:

单片机printf输出到串口,ARM,arm,Powered by 金山文档

当程序运行到这里的时候, 就会利用串口1输出调试打印信息文章来源地址https://www.toymoban.com/news/detail-764901.html

单片机printf输出到串口,ARM,arm,Powered by 金山文档

到了这里,关于STM32开发中printf利用重定向方法输出到串口(CubeMX 基于HAL库方法,带实际项目应用技巧 巧用goto语句)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32---在keil 5中使用printf函数输出到串口USART(printf函数的移植方法)以及补充窗口printf函数输出汉字

    在串口函数初始化的c文件中加上#include stdio.h 重写fputc函数 (fputc是printf函数的底层,printf就是不断调用fputc函数一个个打印,把fputc函数重定向到串口,这样子printf自然就输出到串口) 在主函数main.c编写如下代码后直接运行. 引入#include stdarg.h  对sprintf进行可变参数的函数封装 在主

    2024年02月05日
    浏览(49)
  • stm32 ->HAL库重定向printf,实现串口打印

    在CubeMX中初始化uart引脚 包含printf函数的头文件 stdio.h 重定义printf函数 勾选 Use MicroLIB 编译烧录

    2024年02月16日
    浏览(42)
  • STM32使用printf重定向到USART(串口)并打印数据到串口助手

    我们知道我们在进行编程的时候,遇到问题,经常通过打印信息进行调试,在java中使用的是System.out.println打印到输出窗口。在C语言中使用的是printf打印到输出窗口。而我们用keil进行编程的时候也是使用的C语言所以也可以使用printf,但是我们知道,keil中没有输出窗口。那我

    2024年02月15日
    浏览(48)
  • STM32串口printf调试输出(SSCOM V5.13.1)

    PC与CPU相互通信就是通过USB Type_C接口和USB电平转换实现的。 我们可以看到,CPU通过管脚USART1连接CH340C芯片将USB转串口,实现PC与CPU之间的通信。 当然,这里用的是CH340的芯片,我们就需要安装ch340串口。 按住Ctrl+s生成代码。 在usart.h中添加头文件stdio.h 标准库的 printf函数 能方

    2024年02月12日
    浏览(50)
  • printf和scanf的串口重定向,格式化输入输出

    通过重定向C标准库的printf和scanf函数,实现串口的格式化输出; 调用MDK微库(MicroLib)的方法和调用标准库的方法。 我们使用的正点原子STM32F103RB NANO开发板上将USART1(引脚为PA9,PA10)接出 USART1并没有在PCB上连接在一起,需要通过跳线帽来连接一下。这里我们把 P5 的 RXD 和 TXD 用

    2024年02月04日
    浏览(55)
  • STM32使用串口printf乱码问题解决方法

    使用stm32系列单片机串口打印问题,在使用HAL库重新定义printf为串口输出后,输出的内容全都是乱码,试了网上的方法后还是乱码。  像这样的    最后发现是串口调试助手和keil的文字编码方式不同, keil中是GB 2312,串口调试助手是UFT_8,所以打印出来才会乱码  将串口调试助

    2024年02月11日
    浏览(37)
  • STM32CubeMx+MATLAB Simulink串口输出实验,UART/USART串口测试实验

    STM32CubeMx+MATLAB Simulink串口输出实验

    2024年02月21日
    浏览(44)
  • printf串口重定向标准方法

    在程序调试的过程中,需要用到串口打印信息来判断单片机程序运行是否正确。需要使用串口对printf进行重定向,本文就介绍一下ARM官方推荐的一种重定向的方法,供参考使用。 主要分为两步: 1,将retarget文件复制到工程; 2,重新实现sendchar和getkey函数; 在keil的安装目录

    2024年02月05日
    浏览(38)
  • 【STM32】CUBEMX之串口:串口三种模式(轮询模式、中断模式、DMA模式)的配置与使用示例 + 串口重定向 + 使用HAL扩展函数实现不定长数据接收

    目录   总览 使用CUBEMX创建工程的基本配置 CUBEMX中的配置 Keil中的配置 实物连接 串口轮询模式 轮询模式HAL库函数 特点 实验一:发送数据给单片机并让其返回相同值 串口重定向 串口中断模式 在CUBEMX中打开串口中断 中断模式HAL库函数 特点 实验二:使用中断回调完成实验一

    2024年04月10日
    浏览(74)
  • stm32串口通信(PC--stm32;中断接收方式;附proteus电路图;开发方式:cubeMX)

     单片机型号STM32F103R6: 最后实现的效果是,开机后PC内要求输入1或0,输入1则打开灯泡,输入0则关闭灯泡,输入其他内容则显示错误,值得注意的是这个模拟的东西只能输入英文 之所以用2个LED灯是因为LED电阻粗略一算就是100欧姆,所以懒得再去画其他的东西,真是天助我也

    2024年02月11日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包