RA6M5中Coresight配置问题

你好,

我在EK-RA6M5开发板上尝试使用Coresight组件中的ITM和ETB做打印,也就是通过ITM产生输出传输到ETB中存储,之后再做读取。但是现在ETB中并没有接收到ITM产生的instrumentation packets,如下图所示,因为在trace停止后ETB中RWP写指针只增加到0x10,并且不是溢出,在RRD中数据0xffffeeee是提前写入的值,没有被覆盖。请看一下配置上是有什么问题或者还可能是什么问题?

目前配置包含三部分:ITM、ATB funnel和ETB,在开启阶段是

1. ITM:(1)设置DEMCR.TRCENA全局使能ITM (2)打开ITM_LAR软件锁 (3)设置ITM_TER使能ITM的stimulus port (4)设置ITM_TCR.ITMENA使能ITM (5)关闭ITM_LAR软件锁

2.ATB funnel:(1)打开LAR软件锁 (2)为slave port 0和1设置Priority寄存器 (3)设置Contro寄存器使能slave port 0和1 (4)关闭LAR软件锁

3.ETB:(1)打开LAR软件锁 (2)关闭Control寄存器 (3)等待FFSR寄存器中Formatter停止 (4)设置FFCR寄存器中ETB模式 (5)重置RRP读指针和RWP写指针 (5)设置Control寄存器使能ETB (6)等待FFSR寄存器中Formatter启动 (7)关闭LAR软件锁

之后会向ITM_STIM寄存器写数据来产生输出,最后关闭ITM和ETB的跟踪,从ETB中读取

1.ITM:(1)打开ITM_LAR软件锁 (2)设置ITM_TCR.ITMENA关闭ITM (3)关闭ITM_LAR软件锁

2.ETB:(1)打开LAR软件锁 (2)关闭Control寄存器 (3)等待FFSR寄存器中Flush停止 (4)重置RRP读指针从头读ETB RAM (5)从RRD寄存器中读取数据 (6)关闭LAR软件锁

具体代码如下:

// configure ATB funnel

CS_UNLOCK(ATB_FUNNEL_LAR);

SET_REG(ATB_FUNNEL_PRIO, 0x00000009UL);

SET_REG(ATB_FUNNEL_CTL, 0x00000E03UL);

CS_LOCK(ATB_FUNNEL_LAR);

uint32_t * DCB_DEMCR = (uint32_t *)(DCB_BASE + 0x00C);

*DCB_DEMCR |= DCB_DEMCR_TRCENA_Msk;

 

// configure ITM

uint32_t *ITM_LAR = (uint32_t *)(ITM_BASE + 0xFB0);

*ITM_LAR = 0xC5ACCE55;

uint32_t *ITM_TCR = (uint32_t *)(ITM_BASE + 0xE80);

uint32_t *ITM_TER = (uint32_t *)(ITM_BASE + 0xE00);

*ITM_TER = 0xffffffff;

*ITM_TCR |= ITM_TCR_ITMENA_Msk;

*ITM_LAR = 0x0;

// configure ETB

CS_UNLOCK(ETB_LAR);

SET_REG(ETB_CTL, 0);

while (!ETB_FORMATTER_STOPPED) {

}

SET_REG(ETB_FFCR, 0b00);

SET_REG(ETB_RRP, 0);

SET_REG(ETB_RWP, 0);

for(int i=0;i<50;i++){

SET_REG(ETB_RWD, 0xffffeeee);

}

SET_REG(ETB_RWP, 0);

SET_REG(ETB_CTL, 0b1);

while (ETB_FORMATTER_STOPPED) {

}

CS_LOCK(ETB_LAR);

// write to ITM stimulus port

uint32_t value = 0xeeeeeeee;

for (int i=0;i<50;i++){

ITM_SendChar(value);

}

// disable ITM

*ITM_LAR = 0xC5ACCE55;

*ITM_TCR &= ~(1 << ITM_TCR_ITMENA_Pos);

*ITM_LAR = 0x0;

// disable ETB

CS_UNLOCK(ETB_LAR);

SET_REG(ETB_CTL, 0);

while (ETB_FLUSH_IN_PROGRESS) {

}

CS_LOCK(ETB_LAR);

// read from ETB

CS_UNLOCK(ETB_LAR);

SET_REG(ETB_RRP, 0);

uint32_t read;

for (int i=0;i<50;i++){

read = GET_REG(ETB_RRD);

}

CS_LOCK(ETB_LAR);