一、代码的位置
| 区域标记 | 用途 |
|---|---|
/* USER CODE BEGIN 0 */ |
放头文件、宏定义、函数声明、fputc 重定向 |
/* USER CODE BEGIN PV */ |
放全局变量(整个文件可用) |
/* USER CODE BEGIN PD */ |
放宏定义(#define) |
/* USER CODE BEGIN PFP */ |
放私有函数声明(函数原型) ,如 static void MyFunction(void); |
/* USER CODE BEGIN PM */ |
放私有宏定义,通常用于复杂宏或调试宏,与 PD 类似但语义更侧重"宏函数" |
/* USER CODE BEGIN 2 */ |
main 函数初始化后、while 循环前执行的代码 |
/* USER CODE BEGIN 3 */ |
while 循环内部末尾的代码 |
/* USER CODE BEGIN 4 */ |
放回调函数、自定义函数 |
/* USER CODE BEGIN WHILE */ |
while(1) 循环开头的代码 |
/* USER CODE BEGIN PTD */ |
放用户自定义的类型定义,如 typedef struct、typedef enum |
二、printf的实现
cs
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart6, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
return ch;
}
#endif

三、HAL_UART_Receive 的data类型注意
uint8_t 后面的 8 就是"8位"的意思,所以它只能是 1 字节,而不是 4 字节。
因为 HAL_UART_Receive 要一次性接收 6 个字节 ,uint8_t data 只能存 1 个字节,而 uint8_t data[7] 才能提供连续的 6 个字节存储空间。