由于RTT是基于RAM块实现,无法做到像SPI之类的同步控制,所以大家程序中RTT的RAM块疯狂写数据(SWD接口速度远跟不上CPU写入RAM速度)会有RTT不能及时读取的情况,或者读取错误(比如调试器和CPU同时方式一块RAM区)。
但是一般性的应用场景下(中低速下),RTT波形基本是不丢数据或者读取错误的。
【稳定波形测试准备工作】
(1)先保证TOOL供电足,比如USB供电,要保证Power的电压在4.7以上,此贴有详细说明:地址
(2)用TOOL送的硅胶杜邦线或者60cm的屏蔽线均可。
【测试代码】
测试例子,我这里是用的我们V5开发板,STM32F407IGT6。开了一个定时器做发送。
每次发送6字节数据,比如定时器中断时10KHz的话,那么波形速度就是60KB/S
V5-工程调试利器SEGGER的RTT组件,替代串口调试.7z
(2.63 MB, 下载次数: 48)
RTT的缓冲大小配置:[C] 纯文本查看 复制代码 /*********************************************************************
*
* Defines, configurable
*
**********************************************************************
*/
#define SEGGER_RTT_MAX_NUM_UP_BUFFERS (3) // Max. number of up-buffers (T->H) available on this target (Default: 3)
#define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (3) // Max. number of down-buffers (H->T) available on this target (Default: 3)
#define BUFFER_SIZE_UP (8192) // Size of the buffer for terminal output of target, up to host (Default: 1k)
#define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16)
#define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64)
#define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0)
#define USE_RTT_ASM (0) // Use assembler version of SEGGER_RTT.c when 1
测试代码:
[C] 纯文本查看 复制代码 #include "bsp.h" /* 底层硬件驱动 */
#include "SEGGER_RTT.h"
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参:无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
#include "math.h"
float testInput_f32_REF[1024];
float testInput_f32_REF1[1024];
int main(void)
{
uint32_t i = 0;
/*
由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
启动文件 startup_stm32f4xx.s 会调用 system_stm32f4xx.c 中的 void SystemInit(void)。
SystemInit()函数配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
安富莱STM32-V5开发板主晶振是25MHz, 内部PLL倍频到168MHz。如果需要更改主频,可以修改下面的文件:
\User\bsp_stm32f4xx\system_stm32f4xx.c
文件开头的几个宏是PLL倍频参数,修改这些宏就可以修改主频,无需更改硬件。
*/
bsp_Init(); /* 硬件初始化 */
bsp_StartAutoTimer(0, 1); /* 启动1个100ms的自动重装的定时器 */
for(i=0; i<1024; i++)
{
testInput_f32_REF = sin(2*3.1415926f*50*i/1024);
testInput_f32_REF1 = sin(2*3.1415926f*20*i/1024);
}
/* 配置通道0,上行配置*/
SEGGER_RTT_ConfigUpBuffer(0, "RTTUP", NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
/* 配置通道0,下行配置*/
SEGGER_RTT_ConfigDownBuffer(0, "RTTDOWN", NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
bsp_SetTIMforInt(TIM6, 1000, 0, 0);
/* 进入主程序循环体 */
while (1)
{
}
}
/*
*********************************************************************************************************
* 函 数 名: TIM6_DAC_IRQHandler
* 功能说明: TIM6中断服务程序。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
uint32_t j = 0;
char buf[6];
void TIM6_DAC_IRQHandler( void )
{
if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
{
j++;
sprintf(buf, "%f\r\n", testInput_f32_REF[j]);
SEGGER_RTT_WriteString(0, buf);
if(j==1024) j=0;
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
[i] }[/i]
[i]}
【波形测试】
1KHz中断,每次6字节数据, 基本不出错

5KHz中断,每次6字节数据, 基本不出错

10KHz中断,每次6字节数据, 基本不出错

20KHz中断,每次6字节数据, 一般不出错,不排除有出错的可能

50KHz中断,每次6字节数据, 偶尔会出错

100KHz中断,每次6字节数据, 有时会出错

如果有出错时,效果,中间会有一个数据读取错误:
|