这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【JLINK调试篇】修改RTT源码-支持浮点数打印(三)

共2条 1/1 1 跳转至

【JLINK调试篇】修改RTT源码-支持浮点数打印(三)

助工
2024-12-18 23:10:24     打赏

一、引言

帖1【JLINK调试篇】JLINK-RTT Viewer工具使用(一)-电子产品世界论坛

帖2【JLINK调试篇】RTT Viewer工具的安装与配置(二)-电子产品世界论坛

以上帖子完成了RTT View工具的安装、库文件移植等内容,但是RTT源码不支持浮点数输出打印,需要对源码作如下修改以实现浮点数格式化输出。

二、操作方法

2.1 封装RTT_printf函数

main.c文件增加如下代码,封装的RTT_printf函数支持可变长度参数输入

void RTT_printf(const char * sFormat, ...);
void segger_rtt_init(char * str);
void RTT_printf(const char * sFormat, ...)
{
    va_list ParamList;
    va_start(ParamList, sFormat);
    SEGGER_RTT_vprintf(0, sFormat, &ParamList);
    va_end(ParamList);
}
void segger_rtt_init(char * str)
{
    SEGGER_RTT_Init();
    RTT_printf(str);  // 封装接口,无需填写 BUFFER_INDEX
}

2.2 RTT源码修改

在Keil内打开SEGGER_RTT_printf.c文件,定位至文件第445行

      case '%':
        _StoreChar(&BufferDesc, '%');

5A%~4T{%0P8IQIJWE6]XBII.png

新增case如下

//----------输出浮点-----------------------------
               case 'f':
               case 'F':
               {
                float fv;
                fv = (float)va_arg(*pParamList, double);    //取出输入的浮点数值

                v = (int)fv;                                //取整数部分

                _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); //显示整数,支持负数
               _StoreChar(&BufferDesc, '.');                                        //显示小数点

                v = abs((int)(fv * 1000000));
                v = v % 1000000;
               _PrintInt(&BufferDesc, v, 10u, 2, FieldWidth, FormatFlags);          //显示小数点后两位

//               v = abs((int)(fv * 1000));
//               v = v % 1000;
//              _PrintInt(&BufferDesc, v, 10u, 2, FieldWidth, FormatFlags);          //显示小数点后三位


//              v = abs((int)(fv * 10000));
//              v = v % 10000;
//             _PrintInt(&BufferDesc, v, 10u, 2, FieldWidth, FormatFlags);          //显示小数点后四位
//
//             v = abs((int)(fv * 100000));
//             v = v % 100000;
//            _PrintInt(&BufferDesc, v, 10u, 2, FieldWidth, FormatFlags);          //显示小数点后五位
//
//            v = abs((int)(fv * 1000000));
//            v = v % 1000000;
//           _PrintInt(&BufferDesc, v, 10u, 2, FieldWidth, FormatFlags);          //显示小数点后六位
               }
               break;
        //---------------------------------------

main.c浮点数测试

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_Delay(300);
		RTT_printf("PI=%f...\n",3.141590);//输出小数点后6位
		HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

RTT源码修改完成后,编译无误烧录程序至目标板

三、实验结果

可以看到RTT_printf实现浮点数输出打印,使用方式与标准库函数printf一致

HNTL}~$HUELAU9$A$$D9$O4.png





关键词: RTT浮点数打印    

院士
2024-12-19 10:58:55     打赏
2楼

MCU还可以打印浮点程序啊


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]