因为项目需要,最近重新拾起来STM32,正好趁着这个机会好好的梳理下遇到的知识细节。
CONTENTS
启用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,就可以看到输出了。如下图:
发表评论