stm32CudeMx中初始化uart后,上网查阅发现大家都是通过重定向fputc和fgetc来实现printf重定向,但我修改完后发现并没有生效,在fputc中点灯也无任何反应,说明printf压根就没进这个function。
后面发现,printf在不同编译器下的底层实现不一样,由于大部分人使用stm32CudeMx+Keil以实现一键构建,而我使用makefile配合make for window来手动构建整个project,导致编译器并不相同,Keil使用的编译器是其自带的Arm Compiler,而我使用的编译器是arm-none-eabi-gcc,这就是问题的根本所在,最后,修改成arm-none-eabi-gcc对应的_write()接口解决了该问题。
int _write(int fd, char *ptr, int len)
{
HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, 0xFFFF);
return len;
}
这是对于arm-none-eabi-gcc的解决方法,如果你使用的是其他编译器,查找其对应的底层接口并在其中实现重定向即可。