网上有很多说直接把syscalls.c挪过来就可以用,实际测试并不能啊,难不成骗我了,不,重点有一句话漏了.
// 重点,否则不会直接打印,甚至出错(因为缓冲区满)
setvbuf(stdout, NULL, _IONBF, 0);
如果不设置,printf打印几次后,就会进入HardFault,错误类型是不对齐的访问/精确访问错误/总线错误,并且不会调用syscalls.c的内容,不管把syscalls的函数挪main里也不行.
所以在Printf之前,需要先关闭输出缓冲,然后重载_write函数就可以发送数据了.
int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar(*ptr++);
}
return len;
}
int __io_putchar(int ch)
{
while(!LL_USART_IsActiveFlag_TXE(USART1)){}
LL_USART_TransmitData8(USART1,ch);
return ch;
}
当然可以和编译器也有关,可能旧编译器不用关闭缓冲呢?