嵌入式学习小组
直播中

刘玉兰

7年用户 943经验值
私信 关注

M487JIDAE如何使用ITM功能实现printf打印?

M487JIDAE如何使用ITM功能实现printf打印?

回帖(1)

王萍

2024-5-23 17:38:57
M487JIDAE是一款Microchip的单片机,它提供了一组Instrumentation Trace Macrocell (ITM)调试助手,可以实现在程序运行时通过调试端口输出调试信息。

使用ITM功能实现printf打印,需要进行以下步骤:

1. 打开调试功能:在工程配置中,开启调试功能的选项。

2. 初始化ITM:在main函数中,添加初始化ITM的代码。其中,要开启ITM功能,需要设置寄存器TPI->SPPR和TPI->ACPR。并将寄存器ITM->TER中的第0位设置为1。

3. 重定向printf输出:在stdio.h头文件中,重写fwrite函数,将输出数据通过ITM发送到调试端口。

以下为具体代码实现:

1. 开启调试功能

在Keil MDK中,可以在Options for Target -> Debug中勾选“Enable Debug (printf) Viewer”选项,开启调试功能。

2. 初始化ITM

在main函数中添加以下代码:

```
#include "core_cm4.h"  // 导入CMSIS头文件

int main(void)
{
  // 初始化ITM
  ITM->LAR = 0xC5ACCE55;   // 开启ITM访问权限
  TPI->SPPR = 2;           // Trace数据分频器,分频系数为2
  TPI->ACPR = 0x0F;        // Trace时钟分频器,分频系数为16
  ITM->TPR = 0x0F;         // Trace控制寄存器,使用Cycle Count地址
  ITM->TER = 0x01;         // Trace使能寄存器,使能第0个口
  SystemCoreClockUpdate(); // 更新系统时钟
  
  // 程序代码
}
```

3. 重定向printf输出

在stdio.h头文件中添加以下代码:

```
#include "core_cm4.h"  // 导入CMSIS头文件

#ifdef __cplusplus
extern "C" {
#endif

int32_t _write(int fd, const void *buf, size_t nbytes)
{
  const uint8_t *p = (const uint8_t *)buf;
  for (size_t i = 0; i < nbytes; i++)
  {
    while (ITM->PORT[0].u32 == 0)
    {
      // 等待Trace空闲
    }
    ITM->PORT[0].u8 = *p++;
  }
  return nbytes;
}

#ifdef __cplusplus
}
#endif
```

通过以上三个步骤,就可以使用ITM功能实现printf打印了。在程序中调用printf函数时,输出的数据会通过ITM发送到调试端口,可以在Keil IDE的Debug(printf) Viewer面板中查看。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分