在調(diào)試的過程中,時常需要查看寄存器值,以確認(rèn)配置是否正常寫入或者手動修改某些位。
支持的交互方式列舉如下。
無論是哪種交互方式,都要注意
|
1、通過svc文件。將芯片對應(yīng)的svc文件加入到工程(部分驅(qū)動庫已經(jīng)包含在chip目錄下)。
● 打開Peripherals Pane的視圖
● 進(jìn)入調(diào)試界面,選擇要查看的外設(shè)。toggle點擊可以取消查看。
● 調(diào)試界面可以看到對應(yīng)外設(shè)的寄存器內(nèi)容
2、通過Frame Pane中的Memory tab。如果您手中暫時沒有svc文件,也可以通過查看memory區(qū)內(nèi)容獲得寄存器狀態(tài)。
● 確保Frame Pane處于打開狀態(tài)。
● 對照芯片使用手冊,查詢外設(shè)基地址。
● 定位Memory地址。如下圖。寄存器地址為基址+Offset值。
如果代碼要用math庫中的函數(shù),需要做
1、文件中 #include
2、修改link tab的內(nèi)容。將連接類型改成whole-archive,并在link flags中增加 -lm,如下圖所示:
如果不小心關(guān)閉了一些顯示窗口,比如調(diào)試時的匯編窗口、Frame Info窗口、Debugger窗口……,找不到恢復(fù)地方可以使用一鍵恢復(fù)默認(rèn)顯示。
1.點擊菜單欄中的“Windows”,再點擊“Reset View to Defaults”
如何實現(xiàn)變量的絕對定位
CDK編譯環(huán)境使用了GNU C Complier,簡稱GCC。GCC使用ld腳本對代碼對象進(jìn)行鏈接,將多個輸入文件整合成一個輸出文件。
在一些特殊的場合,我們需要對代碼中的一些內(nèi)容實現(xiàn)精確的定位。
這里我們分兩個方面來介紹,分別是變量的絕對定位和函數(shù)(代碼段)的絕對定位。
假設(shè)要實現(xiàn)將wData[] 放到程序存儲區(qū) 0x9000的位置。需要做以下兩個操作
1. 首先在代碼文件中,將變量歸入某個section,這個例子里是FlashData段。
__attribute__((section(".FlashData"))) const uint32_t wData[] = {0x1, 0x2}; //在這種絕對定位的情況下,關(guān)鍵字 const 不是必須的。
< /FONT >
< P > 2. 其次,要對ld文件進(jìn)行修改。增加以下內(nèi)容,將FlashData段起始地址定位在0x9000。
.FlashData 0x9000:
{
. = ALIGN(0x4)
;
*(.FlashData)
*(.FlashData.*)
} > ROM
再重新編譯,就可以在map文件上看到:
有時候,會希望有一些代碼可以快速取址并運行。其中一個實現(xiàn)的方法是把函數(shù)定位到RAM區(qū)。
假設(shè)要實現(xiàn)將function() 放到RAM。需要做以下兩個操作:
1. 首先在代碼文件中,將函數(shù)歸入某個section,這個例子里是codeinram段。
__attribute__((section(".codeinram"))) void function1(void);
2. 其次,要對ld文件進(jìn)行修改。
1、如果拿到的庫程序第一次編譯報錯,錯誤提示如下:
這是因為庫發(fā)布時帶了一些編譯選項,點擊CDK“清除”快捷按鈕清除一下工程,再重新編譯即可。
1、芯片放在燒錄器上燒寫時需關(guān)注芯片放置的位置,有沒有放反等等。
2、芯片在板燒寫時,需要注意
● 燒寫需要用到的5個信號(VDD,VSS,SWD,SWCLK,RST)有沒有都連到燒寫器上
● VDD和VSS之間的電容有沒有超過100uF,超過的話可能需要在燒錄器這邊的VDD和VSS之間并個小電容(如500ohm)來對板子上的大電容進(jìn)行放電
● SWD,SWCLK和RST線的路徑上有沒有串電阻或并電容,這些都會影響燒寫時序。電路設(shè)計時要盡量避免這樣的電路。 如果應(yīng)用上不得不有這些阻容,電容<101pF,電阻<1Kohm
1、 可能的原因是沒有選擇正確的下載文件,或者下載文件的長度為0。
當(dāng)遇到CDK環(huán)境下可以燒錄代碼,但是拿到燒錄器上反而提示燒錄失敗的現(xiàn)象時,請檢查:
ihex文件的大小是不是超過了芯片的最大DROM size?
如果超過了,再檢查ld文件,是不是出現(xiàn)了段定義錯誤?如下面ROM段的LENGTH。
MEMORY
{
ROM(RX) : ORIGIN = 0x00000000, LENGTH = 64K
RAM(RWX) : ORIGIN = 0x20000000, LENGTH = 4K
}