I.STM32 DWT时间戳功能实现
1.m3、m4实测可用。
2.精度:1/内核频率(s)。
3.实现流程:
a.先使能DWT外设,由内核调试寄存器DEM_CR的位24控制,写1使能。
b.使能CYCCNT寄存器之前,先清0。
c.使能CYCCNT寄存器,由DWT_CTRL的位0控制,写1使能。
4.实现代码如下: - 1 //寄存器基地址
- 2 #define DWT_CR *(uint32_t*)0xE0001000
- 3 #define DWT_CYCCNT *(uint32_t*)0xE0001004
- 4 #define DEM_CR *(uint32_t*)0xE000EDFC
- 5
- 6 //定义需使能位
- 7 #define DEM_CR_TRCENA (1<<24)
- 8 #define DWT_CR_CYCCNTENA (1<<0)
- 9
- 10 //DWT init
- 11 void DWT_init(void)
- 12 {
- 13 DEM_CR |= (uint32_t)DEM_CR_TRCENA;
- 14 DWT_CYCCNT = (uint32_t)0u;
- 15 DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;
- 16 }
- 17 //get DWT count
- 18 uint32_t DWT_TS_GET(void)
- 19 {
- 20 return((uint32_t)DWT_CYCCNT);
- 21 }
复制代码
5.使用场景:
a.可用来实现延时功能。
b.测量程序运行时间。
c.。。。。。 II.STM32 ITM调试功能实现 1.概念:ITM是一应用驱动的跟踪源,它支持printf类的调试手段来跟踪操作系统和应用事件,
并发布判定的系统信息。ITM以包的形式发布跟踪信息。
2.实际应用:当调试时需要打印出信息,而又不能占用串口时,ITM就派上用场了。
3.m3、m4实测可用。
4.配置步骤:
a.配置TPIU并使能I/IO_TRACEN以使能TRACE的引脚
b.向Trace Lock Access寄存器写入0xC5ACCE55,以允许写其他ITM寄存器
c.向Trace Control寄存器写入0x00010005,使能TPIU的同步包并使能整个ITM功能,
寄存器中的ATB ID为0x01
d.向ITM Trace Enable寄存器写入0x01,以使能触发端口0
e.向ITM Trace Privilege寄存器写入0x01,关闭对触发端口7:0的屏蔽
f.把需要输出的值写入触发端口0寄存器,这个步骤可以通过软件完成(使用printf功能)
5.注意事项:
a.只能使用SWD方式调试
b.需要使用到TRACESWO引脚,正常为PB3
6.代码实现: - 1 int main(void)
- 2 {
- 3 int dat = 0;
- 4
- 5 DBGMCU->CR = 0x27;//使能TRACE的引脚
- 6 ITM->LAR = 0xC5ACCE55;//允许写其他ITM寄存器
- 7 ITM->TCR = 0x00010005; //使能TPIU的同步包并使能整个ITM功能
- 8 ITM->TER = 0x01;//以使能触发端口0
- 9 ITM->TPR = 0x01;//关闭对触发端口7:0的屏蔽
- 10 ITM_RxBuffer = 0x5AA55AA5;//如果不需要scanf功能可屏蔽掉
- 11
- 12 printf("input data");
- 13 for(;;)
- 14 {
- 15 scanf("%s",&dat);
- 16 if(dat)
- 17 {
- 18 ptintf("your input is %d\n",dat);
- 19 dat = 0;
- 20 }
- 21 }
- 22 }
- 23
- 24 //重定义printf功能
- 25 int fputc(int ch,FILE *f)
- 26 {
- 27 return ITM_SendChar(ch);
- 28 }
- 29 //重定义scanf功能
- 30 int fgetc(FILE *f)
- 31 {
- 32 while(ITM_CheckChar() != 1) __NOP();
- 33 return (ITM_ReceiveChar());
- 34 }
- 35
复制代码
7.功能窗口: 可使用以下两种方式查看打印信息:
a.使用keil debug功能。
|