搜索
bottom↓
回复: 13

请问Segger Embedded Studio里printf要怎样才能在单片机的UART输出?

[复制链接]

出0入18汤圆

发表于 2024-3-20 09:10:17 | 显示全部楼层 |阅读模式
挺无语的,将keil工程移植到SES,其它功能都正常,但是printf时,它会在调试时输出到ide里的终端窗口,不能在MCU上输出,即时不使用debug,直接下载到flash,MCU的IO也无输出

几个和串口有关的函数(程序肯定没有问题,Keil中一切正常):

#define        USARTx USART2


#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define UART_DISPLAY int __io_putchar(int ch)
#else
#define UART_DISPLAY int fputc(int ch, FILE *f)
#endif /* __GNUC__ */



/**
  * @brief USART1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USARTx_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USARTx;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */

  /* USER CODE END USART1_Init 2 */

}


/* USER CODE BEGIN 4 */
/**
* @brief  Retargets the C library printf function to the USART.
* @param  None
* @retval None
*/
UART_DISPLAY            // printf重定向于USART2,需要添加此函数
{
    /* Place your implementation of fputc here */
    /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

    return ch;
}
/* USER CODE END 4 */

出0入18汤圆

 楼主| 发表于 2024-3-20 09:16:51 | 显示全部楼层
如图所示:
使用printf的信息,在终端窗口显示;直接调用HAL,串口有输出。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2024-3-20 19:20:27 | 显示全部楼层
我从来不用自带的printf,一直用这个http://elm-chan.org/fsw/strf/xprintf.html

出0入4汤圆

发表于 2024-3-21 07:56:03 | 显示全部楼层
估计是你这句:#ifdef __GNUC__在后来的环境里没有生效,也就是没有定义 __GNUC__,导致串口重新定向根本就没有被编译进去,也就无法执行了。
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define UART_DISPLAY int __io_putchar(int ch)
#else
#define UART_DISPLAY int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

出0入0汤圆

发表于 2024-3-21 08:11:12 来自手机 | 显示全部楼层
选项页面的usemicrolib打钩,或者再写几句,采用半主机模式打印。具体方法搜printf半主机模式

出0入18汤圆

 楼主| 发表于 2024-3-21 08:38:47 | 显示全部楼层
jianfengxixi 发表于 2024-3-20 19:20
我从来不用自带的printf,一直用这个http://elm-chan.org/fsw/strf/xprintf.html
(引用自3楼)

要解决printf的问题,不是自己的应用,是为了解决客户的问题。

原来客户开发的程序,网上很多例子,以及ST的例子,本身是用的ptintf,要直接方便的使用。

出20入186汤圆

发表于 2024-3-21 08:43:01 | 显示全部楼层
Segger Embedded Studio里原生支持RTT,所以很方便的。

出0入18汤圆

 楼主| 发表于 2024-3-21 08:44:52 | 显示全部楼层
pspice 发表于 2024-3-21 07:56
估计是你这句:#ifdef __GNUC__在后来的环境里没有生效,也就是没有定义 __GNUC__,导致串口重新定向根本就 ...
(引用自4楼)

不是这个原因。
1 在调试的时候,显示__GNUC__这一段是亮的,下面的几行是灰色的:


2 直接注释其它行,仍然是一样的效果:
//#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define UART_DISPLAY int __io_putchar(int ch)
//#else
//#define UART_DISPLAY int fputc(int ch, FILE *f)
//#endif /* __GNUC__ */

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入18汤圆

 楼主| 发表于 2024-3-21 08:46:11 | 显示全部楼层
why800 发表于 2024-3-21 08:11
选项页面的usemicrolib打钩,或者再写几句,采用半主机模式打印。具体方法搜printf半主机模式 ...
(引用自5楼)

我们是为客户做FAE,不是自己写程序。客户原来的程序不能改。

出0入18汤圆

 楼主| 发表于 2024-3-21 08:47:50 | 显示全部楼层
yuyu87 发表于 2024-3-21 08:43
Segger Embedded Studio里原生支持RTT,所以很方便的。
(引用自7楼)

是的,可以在Library->Library I/O设为RTT,在调试的时候是方便,可脱机的时候,要的是在MCU的IO上输出。现成所有使用printf语句的应用,都在IO上输出不了

出0入18汤圆

 楼主| 发表于 2024-3-21 08:58:01 | 显示全部楼层
why800 发表于 2024-3-21 08:11
选项页面的usemicrolib打钩,或者再写几句,采用半主机模式打印。具体方法搜printf半主机模式 ...
(引用自5楼)

这是Keil里的用法,SES没有use microlib的选项

出0入4汤圆

发表于 2024-3-21 09:37:28 | 显示全部楼层
#define UART_DISPLAY int __io_putchar(int ch)
#define UART_DISPLAY int fputc(int ch, FILE *f)
这两个分别保留一个试试呢?

出0入18汤圆

 楼主| 发表于 2024-3-21 09:43:10 | 显示全部楼层
看上去没有简单方法,要修改代码:

https://wiki.segger.com/Embedded_Studio_Library_IO#STD

出0入18汤圆

 楼主| 发表于 2024-3-21 09:43:29 | 显示全部楼层
pspice 发表于 2024-3-21 09:37
#define UART_DISPLAY int __io_putchar(int ch)
#define UART_DISPLAY int fputc(int ch, FILE *f)
这两个 ...
(引用自12楼)

都试过了,不行。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 09:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表