记录stm32f407 使用hal库,串口2重定向到printf的一些问题(已解决)

大致介绍

在使用usart2时,使用中断传输进行printf会出现异常。使用阻塞传输无问题。在usart1中无问题。在GD32F407中无问题。直接使用中断传输无问题。

使用代码

正常配置串口,勾选microlib库,重写fputc

int fputc(int ch, FILE *f)
{
    while(HAL_UART_Transmit_IT(&huart2, (unsigned char *)&ch, 1)!=HAL_OK){};
    return ch;
}

结果

只配置usart2时,使用printf打印,只能接收到0x0C;
image
同时配置了usart1时,使用printf打印,只能接收到0x14;
image
同时配置usart3时,使用printf打印,只能接收到0x16;
image
同时配置usart6时,使用printf打印,只能接收到0x1e;
image

原因所在

在查询串口相关的讯息时,考虑到不使用microlib库打印会如何。
加入标准库支持后,打印正常。

#pragma import(__use_no_semihosting)

//标准库需要的支持函数

struct __FILE

{

    int handle;

};



FILE __stdout;

/**

 * @brief 定义_sys_exit()以避免使用半主机模式

 * @param void

 * @return  void

 */

void _sys_exit(int x)

{

    x = x;

}

同时发现,使用微库时,优化等级也会造成影响。
在-o3,-o2,-o1时时,除了usart1以外,其他的均会出现以上情况。
-o0时,一切正常。(以上均是仅测试usart1,usart2,usart3)。
考虑到有在网上见到过:

选上Use MicroLIB,例如你用printf()函数的时候,就会从串口1输出字符串,直接默认定向到串口1。
法1可实现串口1数据输出,但要定向到串口2,串口3,microLIB就不合用了;

这样的言论,也许有一定关系吧。

总结

此次问题的原因可以总结为microlib和优化等级共同造成的问题。在实际应用时,优化等级带来的问题不容小觑;microlib作为缺省c库,不符合iso c标准,也尽量不要使用。
参考文章:
关于在MDK中使用 printf 函数 - cronus象牙塔 - 博客园 (cnblogs.com)
微库 & 断言 & (Keil)代码优化 | 靡不有初,鲜克有终 (shatang.github.io)

posted @ 2022-03-01 17:10  USTHzhanglu  阅读(867)  评论(0编辑  收藏  举报