一、准备工作

1.在已安装好的jlink目录中,找到RTT文件夹

在这里插入图片描述
备注:如果没有安装jlink,可以到segger的官方进行安装。

二、开始移植

1.复制RTT整个文件夹到需要移植的工程项目目录中

在这里插入图片描述

2.解压缩SEGGER_RTT_V798i压缩文件

在这里插入图片描述

3.进入工程中,创建相关RTT分组,并在RTT分组下添加刚才移植的RTT文件夹下的SEGGER_RTT.c和SEGGER_RTT_printf.c文件

在这里插入图片描述

4.添加SEGGER_RTT_Conf.h头文件和SEGGER_RTT.h头文件的路径

在这里插入图片描述

5.在需要使用Segger打印功能的.c文件中引用SEGGER_RTT.h头文件即可

在这里插入图片描述

6.移植成功

在这里插入图片描述

三、优化

  • 重新封装SEGGER_RTT_printf函数

1.在SEGGER_RTT_printf.c文件底部添加

void print_log(const char * sFormat, ...)
{    
    va_list ParamList;
    va_start(ParamList, sFormat);
    SEGGER_RTT_vprintf(0, sFormat, &ParamList);
    va_end(ParamList);
}

2.在SEGGER_RTT.h文件中声明函数print_log

在这里插入图片描述

3.重封装效果

在这里插入图片描述
在这里插入图片描述

  • 解决无法打印浮点数的问题

1.现象描述

在这里插入图片描述
在这里插入图片描述

2.解决办法

在SEGGER_RTT_printf.c文件顶部添加依赖

static unsigned int _powBuf[] = {1, 10, 100, 1000, 10000, 100000, 1000000};
/*********************************************************************
 *
 *       _pow
 */
static unsigned int _pow(unsigned char base, unsigned char index)
{
  (void)base;
  if (index <= 6)
    return _powBuf[index];
  else
    return 1;
}

找到函数SEGGER_RTT_vprintf,在其switch语句中,添加

case 'f':
      case 'F':
      {
			float fv = (float)va_arg(*pParamList, double); // Retrieves the input floating point value

			v = (int)fv;                                                         // Take the positive integer part
			_PrintInt(&BufferDesc, v, 10u, FieldWidth, FieldWidth, FormatFlags); // According to an integer

			if ((NumDigits == 0) || (NumDigits > 6)) // 最高打印6位小数
			  NumDigits = 6;

			_StoreChar(&BufferDesc, '.'); // Display decimal point
			unsigned int powN = _pow(10, NumDigits);

			fv = fv - v;            // 取小数部分
			fv = fv < 0 ? -fv : fv; // 取小数的绝对值
			fv *= powN;             // 根据显示精度取整
			v = (int)(fv);
			if (fv - v >= 0.5f) // 四舍五入
			  v += 1;

			_PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags | FORMAT_FLAG_LEFT_JUSTIFY | FORMAT_FLAG_PAD_ZERO); // Display three decimal places
      }
		break;

3.效果

在这里插入图片描述

四、附加

  • 在使用 RTT (Real Time Transfer) 进行嵌入式开发时,希望在每次设备上电或复位后,RTT Viewer(如 J-Link RTT Viewer 或其他支持 RTT 的工具)能自动清屏,以避免显示之前会话的旧数据

1.在SEGGER_RTT_printf.c文件中,末尾行添加

const char* welcome_logo[] = {
    "####################################",
    "#                                  #",
    "#    WELCOME TO MY EMBEDDED        #",
    "#           PROJECT!               #",
	"#                                  #",
    "####################################",
	"\r\n"
};

#define LOGO_LINES (sizeof(welcome_logo) / sizeof(welcome_logo[0]))

void segger_viewer_clean_screen(void)
{
	print_log("\033[2J\033[H"); 
	for (int i = 0; i < LOGO_LINES; i++)
    {
        SEGGER_RTT_WriteString(0, welcome_logo[i]);
        SEGGER_RTT_WriteString(0, "\n"); // 换行
    }
}

2.在SEGGER_RTT.h头文件中,声明segger_viewer_clean_screen函数。

3.在mian.c文件中,引用头文件SEGGER_RTT.h。并且在main.c文件中调用segger_viewer_clean_screen函数即可。

4.RTT Viewer显示效果

在这里插入图片描述

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐