IAR开发stm32-printf重定向

开发的时候用串口打印信息的时候发现printf重定向没任何输出,在网上找的方法都是这样的,这样的确是可以解决FILE未定义错误,但是输出还是没有
开发板:正点原子探索者
mcu:stm32f407
IDE:IAR Embedded Workbench for ARM 9.40.1

我是直接用的keil的例子,usart.c文件已经写好对printf重定向操作,即重写fputc函数,代码如下:

/* FILE 在 stdio.h里面定义. */
FILE __stdout;

/* 重定义fputc函数, printf函数最终会通过调用fputc输出字符串到串口 */
int fputc(int ch, FILE *f)
{
    while ((USART1->SR & 0X40) == 0);               /* 等待上一个字符发送完成 */

    USART1->DR = (uint8_t)ch;                       /* 将要发送的字符 ch 写入到DR寄存器 */
    return ch;
}

但是IAR并没有调用这个函数,IAR是调用__write,所以正确方式是重写__write函数,不过不能直接把fputc函数改名为__write,对,我最开始就是这么操作的,应该是这样的:

//串口重定向打印
size_t __write(int handle, const unsigned char * buffer, size_t size)
{
  /* Sending in normal mode */
  if(HAL_OK == HAL_UART_Transmit(&g_uart1_handle,(uint8_t *)buffer,size,100000))
  {
    return size;
  }
  else
  {
    return -1;
  }
}

第一张图片选full那个操作也是需要的
然后~,have fun!

另一种方法,串口printf打印已经结束了,还可以利用半主机模式(semihosting)重定向到IAR Embedded Workbench中的Terminal I/O
选项可以这么选

这样编译的话肯定报FILE未定义错误,可以直接把FILE相关代码注释掉,本来也没有使用那部分代码,这样操作的话也需要把刚才重写的__write函数注释掉,编译器内部实现操作
在调试时,通过View>Terminal I/O打开Terminal I/O窗口显示对应的打印输出,这种方式打印的很慢,也不支持中文打印,也可能可以支持,没仔细研究

还有通过SWD方式,我并没有尝试
参考链接:https://www.iar.com/zh/knowledge/support/technical-notes/general/implementing-printf-output

作者:IGH EtherCAT

物联沃分享整理
物联沃-IOTWORD物联网 » IAR开发stm32-printf重定向

发表回复