好记性不如铅笔头

ARM, STM32, 操作系统

STM32CubeMX简单使用笔记:启用UART输出和printf实现

因为项目需要,最近重新拾起来STM32,正好趁着这个机会好好的梳理下遇到的知识细节。

启用UART输出

最简单程序 的基础上,我们启用UART1,模式为异步模式,可以在Configuration中看到很多配置,这里默认配置为PA9,PA10作为TX,RX,115200波特率。如下图:

我们保存配置,IDE会自动生成代码,此时我们在main.c中增加测试代码:

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
/* USER CODE END Includes */
。。。
。。。
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	char *p_str = "hello world\r\n";
	HAL_UART_Transmit(&huart1, (uint8_t *)p_str, strlen(p_str)+1, 0xFFFF);
	HAL_Delay(1000);

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

然后编译,烧录,连接上UART,就可以看到输出了。如下图:

这里需要注意的是修改代码时,最好严格按照注释提示的位置来编写,否则万一后面配置修改,IDE在冲洗生成代码的时候可能会对代码进行覆盖。

启用printf支持

STM32CubeIDE内部附带了一个ARM的交叉编译器,已经完整的支持了IO相关库,可以看到工程中有文件syscalls.c和sysmem.c,因此这里我们只要支持底层输出即可。这里为了减少main函数代码,增加代码内聚性,我们新编一个文件来实现底层输出:

my_debug_console.h

#ifndef SRC_MY_DEBUG_CONSOLE_H_
#define SRC_MY_DEBUG_CONSOLE_H_

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

#include "stm32f4xx_hal.h"

#define MY_OUTPUT_RAW(format, args...)   	printf(format, ##args)

int32_t my_debug_console_register(UART_HandleTypeDef *p_log_uart);

#endif /* SRC_MY_DEBUG_CONSOLE_H_ */

my_debug_console.c

#include "my_debug_console.h"

typedef struct {
	UART_HandleTypeDef *p_log_uart;
}my_dbg_console_mgr_s;

static my_dbg_console_mgr_s s_mgr = {0};

#ifdef __GNUC__
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
	if(s_mgr.p_log_uart != NULL)
	{
		HAL_UART_Transmit(s_mgr.p_log_uart, (uint8_t *)&ch, 1, 0xFFFF);
	}
  return ch;
}

int32_t my_debug_console_register(UART_HandleTypeDef *p_log_uart)
{
	if(p_log_uart == NULL)
	{
		return -1;
	}
	s_mgr.p_log_uart = p_log_uart;

	return 0;
}

我们在main.c中增加测试代码:

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "my_debug_console.h"
/* USER CODE END Includes */
。。。
。。。
  /* USER CODE BEGIN Init */
  my_debug_console_register(&huart1);

  /* USER CODE END Init */
。。。
。。。
    /* USER CODE END WHILE */
	MY_OUTPUT_RAW("hello printf\r\n");
	HAL_Delay(1000);
    /* USER CODE BEGIN 3 */

然后编译,烧录,连接上UART,就可以看到输出了。如下图:

Leave a Reply

4 × 2 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据