一、引言
帖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, '%');
新增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一致