STM32G474 keil 串口重定向
时间: 2025-02-11 15:10:41 浏览: 50
### STM32G474 Keil环境下的串口重定向配置
#### 配置项目设置以支持MicroLIB
为了确保`printf()`函数不进入半主机模式,而是通过UART接口输出数据,在Keil项目的魔术棒选项中需勾选Use MicroLIB选项。这一步骤可以防止系统默认调用的标准库函数影响到实际硬件操作[^2]。
```c
// 此处无具体代码展示,仅说明配置项调整
```
#### 实现fputc函数用于UART传输
在嵌入式环境中,由于缺乏传统的文件系统或控制台界面,因此需要自定义实现`fputc`函数来处理字符输出。该函数会逐字节地将待打印的信息经由指定的UART端口发出。对于STM32系列MCU而言,这意味着要利用其USART外设完成这一过程[^3]。
```c
#include "stm32g4xx_hal.h"
int fputc(int ch, FILE *f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); // 假定使用的是huart1实例
return ch;
}
```
上述代码片段展示了如何基于HAL库编写一个简单的`fputc`版本,其中假设已有一个名为`huart1`的全局变量代表初始化好的UART句柄对象。当程序调用`printf`时,实际上就是反复调用这个定制化的`fputc`去发送每一个字符直到整个字符串全部送出为止。
#### 初始化UART并启用中断接收功能
除了正确配置`fputc`之外,还需要确保UART本身已被适当初始化,并开启了相应的中断服务例程以便能够实时响应接收到的数据包。这部分工作一般是在主应用程序启动初期就已完成,比如通过STM32CubeMX工具来自动生成必要的驱动代码框架[^1]。
```c
/* UART MSP Initialization */
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle){
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
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 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
/* UART receive complete callback in non-blocking mode */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance==USART1){
// Process received data here...
// Restart the reception process after processing current byte(s)
HAL_UART_Receive_IT(huart, (uint8_t *)aRxBuffer, RXBUFFERSIZE);
}
}
```
这段代码显示了UART模块的具体初始化流程以及非阻塞方式下接收完成后触发回调函数的例子。注意这里的引脚分配、优先级设定等参数可能依据具体的开发板设计有所不同,请参照官方文档做相应修改。
阅读全文
相关推荐


















