基于STM32F407ZGT6的SEGGER RTT移植
基于STM32F407ZGT6的SEGGER RTT移植
·
一、准备工作
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显示效果

更多推荐



所有评论(0)