STM32 的ITM、DWT功能實現
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 5DWT6 //定義需使能位 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 } 35ITM
7.功能窗口:
可使用以下兩種方式查看打印信息:
a.使用keil debug功能。
b.使用J-link SWO Viewer。
打開J-link SWO Viewer工具,選擇相應的芯片型號。
STM32 的ITM、DWT功能實現