记录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;
同时配置了usart1时,使用printf打印,只能接收到0x14;
同时配置usart3时,使用printf打印,只能接收到0x16;
同时配置usart6时,使用printf打印,只能接收到0x1e;
原因所在
在查询串口相关的讯息时,考虑到不使用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)