STM32F407 HAL库 printf 重定向到串口1

本文详细介绍了在STM32平台上如何配置SYS时钟、使用外部时钟,以及设置串口的不同工作模式,如异步通信。还展示了如何重写printf函数和使用HAL_UART_Transmit进行数据传输的示例代码及主函数测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置SYS和时钟

使用外部时钟

使用外部时钟,总线时钟为最大

配置串口

串口不同模式

mode
Asynchronous异步通讯
Synchronous同步通讯
Single Wire(Half-Duple)半双工模式
MultiprocessorCommunication多处理器通讯
IrDA红外通讯
LIN局域互联网
SmartCard智能卡模式

这里选择异步通信

填写串口信息

打开串口中断

确认串口GPIO

生成工程

Use MicroLIB”这是KEIL自带的一个简易的库

使用printf函数,直接默认定向到串口1

重写串口函数


#include "stdio.h"


/* 重定义C库函数到串口,printf */
int fputc(int ch,FILE *f)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
    return (ch);
}

int fgetc(FILE *f)
{
    int ch;
    HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);
    return ch;
}

void usart1_sendString(uint8_t * str)
{
    unsigned int sendIndex = 0;
    
    do{
        
        HAL_UART_Transmit(&huart1, (uint8_t *)(str + sendIndex), 1, 1000);
        sendIndex++;
        
    }while(*(str + sendIndex) != '\0');
}

主函数测试

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  while (1)
  {
        
        printf("Hello word STM32 \r\n");
        HAL_Delay(1000);
        int num = 0,index = 0;
        scanf("%d",&num);
        
        for(index = 0;index<num;index++){
            
            HAL_Delay(500);
            
            printf("index:%d\r\n",index);
            
            HAL_Delay(500);
        }
        
  }
}

 测试案例https://download.youkuaiyun.com/download/hmxm6/88968220icon-default.png?t=O83Ahttps://download.youkuaiyun.com/download/hmxm6/88968220

### 实现 STM32F407 串口重定向 为了使 `printf` 函数能够通过串口输出信息,在 STM32F407 上实现串口重定向主要涉及几个方面的工作: #### 配置硬件资源 初始化 UART 或 USART 外设,设置波特率、字长、停止位等参数。这一步骤通常借助于 HAL 来简化操作。 ```c UART_HandleTypeDef huart1; void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } ``` #### 定义 `_write` 函数用于重写标准中的输出接口 当调用 `printf` 发送字符时,最终会调用到 C 标准里的 `_write` 方法。因此可以通过自定义该方法使得所有要打印的内容都经由指定的串口发出[^2]。 ```c #include <sys/stat.h> #include "usart.h" int _write(int file, char *ptr, int len) { /* 如果是标准错误流则忽略 */ if(file == STDOUT_FILENO || file == STDERR_FILENO){ HAL_UART_Transmit(&huart1,(uint8_t *) ptr,len ,0xFFFF); } return len; } ``` #### 中断处理机制优化通信性能 对于实时性要求较高的应用场景来说,采用中断方式可以有效提高系统的响应速度并减少 CPU 占用时间。每当接收到新数据时触发相应的 ISR(Interrupt Service Routine),从而及时读取缓冲区内的内容并向对方发送确认消息[^3]。 ```c void USART1_IRQHandler(void) { if (__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)) { __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_TC); // 可在此处加入其他逻辑 }else if(__HAL_UART_GET_IT_SOURCE(&huart1,UART_IT_RXNE)){ uint8_t ch = (uint8_t)(huart1.Instance->DR & (uint8_t)0xFF); // 这里可以根据需求做进一步处理比如回显或者其他命令解析 HAL_UART_Transmit(&huart1,&ch,sizeof(ch),0xFFFF); } } ``` 以上就是基于 STM32F407 平台下完成串口重定向所需的关键步骤和技术要点说明。需要注意的是实际项目中可能还需要考虑更多细节问题,例如异常情况下的保护措施以及多任务环境下的同步控制等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值