如何在Visual Studio Code实现MCU printf

/ 0评 / 0

网上有很多说直接把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;
}

当然可以和编译器也有关,可能旧编译器不用关闭缓冲呢?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注