基于stm32cubemx生成的HAL代码配置usart1使用printf打印数据(重定向)

stm32cubemx生成的HAL代码配置usart1使用printf打印数据

MX生成的HAL库代码没有printf,如果需要使用的话需要把标准库里的回调函数移植过去,这里提供了两个方法。

方法一

1、在生成的usart.c中的/* Includes ------------------------------------------------------------------*/下添加
#include “stdio.h”

不添加stdio.h会报FILE错误
————————————————————————————————————————

在测试过程中MX重新生成代码会删除usart.c中的#include “stdio.h”

把#include "stdio.h"添加到/* USER CODE BEGIN 0 */保护区就行了

————————————————————————————————————————
然后在usart.c代码保护区/* USER CODE BEGIN 0 */添加,不在保护区添加MX生成代码时会被删除,也不能自己手动添加保护区

 /* USER CODE BEGIN 0 */
  #ifdef __GNUC__
  /* With GCC, small printf (option LD Linker->Libraries->Small printf
  set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  #else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  #endif /* __GNUC__ */
  
 
 PUTCHAR_PROTOTYPE
 {
 /* Place your implementation of fputc here */
 /* e.g. write a character to the USART2 and Loop until the end of transmission */
 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
 return ch;
 }
 /* USER CODE END 0 */

2、处理完usart.c以后我们回到mian.c中也在
————————————————————————————————————————

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */保护区中添加#include “stdio.h”
————————————————————————————————————————

不能添加在/* Includes ------------*/下,MX重新生成工程时会被删除

这里不添加会报printf错误

然后我们就可以在main中使用printf了
在main中定义一个参数

int count = 0;

在while中写个代码测试一下

   /* USER CODE BEGIN WHILE */
    while (1)
    {
      /* USER CODE END WHILE */
  
      /* USER CODE BEGIN 3 */
          HAL_Delay(1000);
          printf("count = %d\r\n",count++);
    }
   /* USER CODE END 3 */

在这里插入图片描述

将上代码复制进工程里面,打开串口调试助手,如果调试代码没有出现错误,烧录完成之后,串口却没有显示,这个时候可能就需要调试硬件,尤其是连接电脑的端口,可换用不同的端口进行调试,自己在调试的时候就是因为这个电脑端口连接的问题,导致串口一直不显示。

方法二

这里提供了一种和网上不一样的printf使用方法,咱也是学习来的这里记录一下

生成工程以后在mian.c的保护区

/* USER CODE BEGIN PD */

/* USER CODE END PD */

中间添加

 /* USER CODE BEGIN PD */
  
   #define printf1(...) HAL_UART_Transmit(&huart1,\
  
   (uint8_t *)u_buf,\
  
  sprintf((char*)u_buf,__VA_ARGS__),\
  
  0xffff)
 
 /* USER CODE END PD */

还要在

/* USER CODE BEGIN PV */

/* USER CODE END PV */

中间定义u_buf才可以使用

 /* USER CODE BEGIN PV */
 uint8_t u_buf[256];
 /* USER CODE END PV */

注意这里定义的和普通的printf多了一个1,是printf1
我们在下面的main函数的循环中调试一下printf1

   /* USER CODE BEGIN WHILE */
   while (1)
   {
     /* USER CODE END WHILE */
 
     /* USER CODE BEGIN 3 */
         HAL_Delay(2000);
         printf1("123456789");
   }
  /* USER CODE END 3 */

在调试串口处就可以显示数据了

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用STM32CubeMX生成的工程中,可以通过以下步骤进行串口定向: 1. 在工程中打开 `main.c` 文件,找到 `HAL_MspInit()` 函数。 2. 在 `HAL_MspInit()` 函数中添加以下代码: ```c void HAL_MspInit(void) { /* ...其他初始化代码... */ /* 定向串口输出 */ HAL_UART_MspInit(&huart1); } ``` 3. 在 `main.c` 文件的开头添加以下头文件: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/unistd.h> #include <sys/stat.h> #include <sys/times.h> #include <sys/errno.h> ``` 4. 在 `main.c` 文件中添加以下代码: ```c /* 定向 printf 函数 */ int _write(int file, char *ptr, int len) { HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, HAL_MAX_DELAY); return len; } /* 定向 scanf 函数 */ int _read(int file, char *ptr, int len) { HAL_UART_Receive(&huart1, (uint8_t *)ptr, len, HAL_MAX_DELAY); return len; } ``` 5. 打开 `usart.c` 文件,找到 `HAL_UART_MspInit()` 函数。 6. 在 `HAL_UART_MspInit()` 函数中添加以下代码: ```c void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { /* ...其他初始化代码... */ /* 串口定向 */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_10; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 7. 新编译工程并下载到开发板上即可。现在,你可以在代码使用 `printf()` 和 `scanf()` 函数来进行串口通信了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值