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面板中查看。
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面板中查看。
举报