STM32 CubeMX 串口printf重定向

CubeMX基础配置就不再赘述了,讲一下串口设置,如图:

波特率115200,1个停止位,8个数据位,无校验位。咱只讲printf重定向,所以就不开中断了。

printf重定向代码段如下:

#include <stdio.h>
int fputc(int ch, FILE *p)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

注意:

1、在调用printf()函数时记得包含<stdio.h>头文件

2、需要在keil5软件中勾选Target中的use MicroLIB选项,否则单片机会卡死

到此stm32 printf重定向便完成了,需要打印数据时,直接调用printf函数即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在使用STM32CubeMX时,可以通过重定向printf函数来将输出信息发送到串口或其他设备上。具体实现方法是在main函数中调用HAL_UART_MspInit函数,然后在该函数中设置串口的参数和初始化。接着,在main函数中调用printf函数时,将输出信息重定向串口上即可。需要注意的是,需要在编译器中开启printf重定向功能。 ### 回答2: STM32CubeMX是针对ST公司的MCU系列开发的一套可视化工具,能够帮助用户快速配置系统时钟、外设等资源。在STM32CubeMX提供的工程中,用户可以选择使用标准外设库或者CubeHAL来编写代码。 其中,使用CubeHAL时,printf输出需要进行重定向才能够在串口或者LCD等外设上显示。重定向的本质是将printf函数中的字符通过串口或者LCD等外设进行输出,这样就可以打印一些调试信息,方便用户调试程序。 在使用CubeHAL时,重定向printf输出有如下步骤: 1. 在main函数中,调用HAL_Init函数进行初始化。 2. 在调用HAL_Init函数之后,调用重定向函数void SystemClock_Config(void),该函数会配置系统时钟,初始化uart串口。 3. 在重定向函数中,使用HAL_UART_MspInit函数对UART进行初始化,并且使用HAL_UART_Transmit函数将printf输出的字符通过串口进行输出。 4. 在main函数中,使用如下代码重新定义printf函数: ``` int __io_putchar(int ch) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); return ch; } int _write(int file, char *ptr, int len) { int i = 0; for (i = 0; i < len; i++) { __io_putchar(*ptr++); } return len; } ``` 5. 在用户程序中使用printf进行输出时,printf函数的输出结果就会被重定向串口上显示。 需要注意的是,在使用CubeHAL时,由于使用了库函数,所以代码大小和RAM占用会比较大。因此,在开发时需要谨慎使用库函数,并合理地编写代码,以尽可能减小代码大小和RAM占用。 ### 回答3: 在使用STM32CubeMX开发STM32芯片时,printf是一个常用的调试工具,但默认情况下,printf输出的信息无法通过串口或其他外设进行传输或显示。这时就需要使用printf重定向重定向即是将printf的输出定向到指定的外设上,比如串口、LCD显示屏等。重定向的实现需要用户编写一些特定的函数和配置一些寄存器。下面以重定向串口为例进行说明。 首先需要在STM32CubeMX中配置串口。在Pinout&Configuration下,选中对应的串口,设置波特率、数据位、停止位等参数。 接着,在代码中打开中断,并实现重定向函数。重定向函数的目的是将输出数据写入串口的数据缓冲区,并触发发送中断。这里需要定义一个全局变量,记录重定向的默认输出设备,如下所示: ```c #define UARTout USART1 //默认输出设备 int __io_putchar(int ch) { HAL_UART_Transmit_IT(&UARTout, (uint8_t *)&ch, 1); //写入数据,触发发送中断 return ch; } ``` 在main函数中打开中断,如下所示: ```c int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); HAL_UART_Transmit_IT(&UARTout, (uint8_t *)"start....\n", 10); //重定向输出测试 HAL_NVIC_EnableIRQ(USART1_IRQn); //开启串口1中断 while (1) { } } ``` 最后,在串口发送完成中断服务函数USART1_IRQHandler()中,判断数据是否发送完成,完成时关闭发送中断,如下所示: ```c void USART1_IRQHandler(void) { if (__HAL_UART_GET_FLAG(&UARTout, UART_FLAG_TC) != RESET) { __HAL_UART_CLEAR_FLAG(&UARTout, UART_FLAG_TC); __HAL_UART_DISABLE_IT(&UARTout, UART_IT_TC); //数据发送后,关闭中断 } } ``` 以上就是printf重定向串口的实现过程。在实际应用中,可以将重定向函数进行修改,实现重定向到其他外设的输出方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值