STM32
直播中

凌章致

7年用户 875经验值
私信 关注
[问答]

用keil仿真无法用printf打印怎么解决?

用keil仿真 无法用printf打印.想用printf重定向到Usart1的方法,使printf打印信息能够在UART#1的窗口打印出来.

硬件连接用的是SW(没有连SWO引脚,只连接DIO和CLK)接口方式. 芯片USART1的RX TX引脚反接仿真器RX TX引脚.

这种连接方式可以使printf重定向到usart1用Keil实现在线调试吗?


我试了好多次都实现不了!!!~

回帖(2)

李骏鹏

2024-4-11 09:56:29
试一试这个:


  • #include
  • #include
  • #include


  • extern UART_HandleTypeDef huart1;


  • //USART1 retargetting:
  • struct __FILE
  • {
  •   int handle;
  • };


  • FILE __stdout;


  • // fgetc
  • int fgetc(FILE *f) {
  •   uint8_t ch = 0;
  •   while(HAL_UART_Receive( huart1,  ch, 1, 100000));
  •   return((int)ch);
  • }


  • // fputc
  • int fputc( int ch, FILE *f )
  • {
  •   while ( (USART1->SR   0X40) == 0 )
  •   ;
  •   USART1->DR = (uint8_t) ch;
  •   return (ch);
  • }


  • //_ttywrch
  • int _ttywrch( int ch )
  • {
  •   ch = ch;
  •   return (ch);
  • }



举报

陈丽

2024-4-11 14:56:09
要在Keil中实现printf重定向到USART1进行在线调试,你需要进行以下步骤:

1. 在Keil中打开你的工程。
2. 打开工程目录并找到名为"retarget.c"的文件。如果没有该文件,你需要手动创建一个。
3. 在retarget.c文件中,根据你的具体芯片型号,找到以下两个宏的定义(如果找不到,你可以在网上搜索):
   - #define UART                       // USART or UART
   - #define UART_PORT    USART1        // USART port number
4. 这些宏定义会告诉Keil将printf重定向到哪个USART端口上。请确保将UART_PORT设置为USART1。
5. 继续在retarget.c文件中,找到下面三个函数的定义(如果没有,你也可以在网上搜索):
   - int fputc(int ch, FILE *f)
   - int fgetc(FILE *f)
   - int ferror(FILE *f)
6. 在每个函数的定义中,将使用USART1的相关函数进行重定向。例如,fputc函数可以使用USART_SendData函数发送数据到USART1。

完成上述步骤后,再次编译和运行你的代码。现在,printf的输出应该会被重定向到USART1,并且你应该能够在USART1的窗口中打印出来。

请注意,这些步骤基于你所描述的硬件连接方式。如果无法正常工作,请确保连接正确,并检查芯片型号、引脚连接和时钟配置等。如果仍然无法解决问题,你可能需要参考芯片厂商提供的资料或咨询相关技术支持。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分