STM32H743串口打印
时间: 2025-03-26 17:14:12 浏览: 44
### STM32H743 UART `printf` 示例代码与教程
为了实现STM32H743上的UART `printf`功能,需配置USART外设并重定向标准输出到指定的串口。此过程涉及初始化硬件抽象层(HAL),设置波特率、数据位、停止位以及校验位等参数。
#### 初始化USART外设
通过STM32CubeMX工具生成初始项目框架,在Pinout & Configuration界面选择所需的USART端口(如USART1),设定其模式为Asynchronous异步通讯方式,并调整相应的通信属性[^1]。
```c
// 在stm32h7xx_hal_msp.c文件内添加如下函数定义
void HAL_UART_MspInit(UART_HandleTypeDef* huart){
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* 配置TX/RX引脚 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 TX Pin configuration
* PA9 -> USART1_TX.
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/**USART1 RX Pin configuration
* PA10 -> USART1_RX.
*/
GPIO_InitStruct.Pin = GPIO_PIN_10;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
#### 重定向`stdout`至USART
为了让C语言中的`printf()`能够经由选定的USART发送字符流,需要编写一个自定义的写入回调函数 `_write(int file, char *ptr, int len)` 来处理输出操作。该函数会逐字节读取缓冲区并将这些数据推送到USART传输队列中等待发送完成事件触发中断服务例程(ISR)。
```c
#include "usart.h"
int _write(int file, char * ptr, int len) {
HAL_StatusTypeDef status;
if (file == STDOUT_FILENO || file == STDERR_FILENO) {
for (int i = 0 ; i < len ; i++) {
while (__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)==RESET); // Wait until TC flag is set
status = HAL_UART_Transmit(&huart1,(uint8_t*)&ptr[i],1,HAL_MAX_DELAY);
if(status != HAL_OK){
return EIO;
}
}
return len;
}
errno = EBADF;
return -1;
}
```
上述代码片段展示了如何针对特定平台定制化地实现了POSIX兼容的标准I/O接口,使得后续调用`printf()`时可以直接作用于物理设备而非默认指向控制台窗口。
阅读全文
相关推荐


















