记录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
{模拟串口使用printf函数
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标准,也尽量不要使⽤。
参考⽂章: