在調試的過程中,時常需要查看寄存器值,以確認配置是否正常寫入或者手動修改某些位。
支(zhi)持的交(jiao)互方(fang)式列舉如下。
無論是哪種交互方式,都要注意
|
1、通過svc文件。將芯片對應的(de)svc文件加入到工程(cheng)(部分驅動庫已經包含在chip目錄下)。
● 打開(kai)Peripherals Pane的(de)視圖(tu)
● 進(jin)入調試界面,選擇要查(cha)看的外設(she)。toggle點擊(ji)可以取消查(cha)看。
● 調試界面可以看到對應外設的(de)寄存器內容
2、通過Frame Pane中(zhong)的Memory tab。如果您手中暫(zan)時沒有svc文件,也(ye)可以通過查看(kan)memory區內容獲得寄(ji)存器狀態。
● 確保Frame Pane處于打開狀(zhuang)態。
● 對(dui)照(zhao)芯片使(shi)用手(shou)冊(ce),查詢外設基地址。
● 定位Memory地址(zhi)。如下圖。寄存器地址(zhi)為(wei)基址(zhi)+Offset值。
如果代碼要用math庫(ku)中(zhong)的函數(shu),需要做
1、文件中 #include
2、修改(gai)link tab的(de)內容(rong)。將連(lian)接類(lei)型改(gai)成whole-archive,并在link flags中(zhong)增加(jia) -lm,如下(xia)圖所示:
如(ru)果不小(xiao)心關閉(bi)了一些顯(xian)示窗(chuang)口,比如(ru)調(diao)試(shi)時的匯編窗(chuang)口、Frame Info窗(chuang)口、Debugger窗(chuang)口……,找不到(dao)恢復地方可(ke)以使用一鍵恢復默認顯(xian)示。
1.點(dian)擊菜單欄中的“Windows”,再點(dian)擊“Reset View to Defaults”
如何實現變量的絕對定位
CDK編譯環(huan)境(jing)使(shi)用(yong)了GNU C Complier,簡稱GCC。GCC使(shi)用(yong)ld腳本對(dui)代(dai)碼(ma)對(dui)象進行鏈接,將多個(ge)輸入文件(jian)(jian)整合成(cheng)一個(ge)輸出文件(jian)(jian)。
在(zai)一些(xie)特(te)殊的場合,我們需要對代碼中的一些(xie)內(nei)容實(shi)現(xian)精確的定位。
這里我們(men)分兩個方面來介(jie)紹(shao),分別是變(bian)量的絕(jue)對定(ding)位和函數(shu)(代碼段)的絕(jue)對定(ding)位。
假(jia)設(she)要(yao)實現將(jiang)wData[] 放到程序存儲(chu)區 0x9000的(de)位置(zhi)。需要(yao)做以下兩(liang)個(ge)操作(zuo)
1. 首(shou)先(xian)在代碼(ma)文(wen)件(jian)中,將變(bian)量歸入某個section,這個例子里(li)是(shi)FlashData段。
__attribute__((section(".FlashData"))) const uint32_t wData[] = {0x1, 0x2}; //在(zai)這種絕對定位的(de)情況下,關鍵字 const 不(bu)是必須的(de)。
< /FONT >
< P > 2. 其次,要對ld文件進行修改。增加(jia)以下內容,將(jiang)FlashData段起(qi)始地(di)址(zhi)定位(wei)在(zai)0x9000。
.FlashData 0x9000:
{
. = ALIGN(0x4)
;
*(.FlashData)
*(.FlashData.*)
} > ROM
再(zai)重新編(bian)譯,就(jiu)可以(yi)在map文(wen)件上看到:
有時候,會希望有一(yi)些代碼可(ke)以快速(su)取址并運行。其中一(yi)個實現的方法是把函(han)數(shu)定位(wei)到(dao)RAM區。
假設(she)要實現將(jiang)function() 放到(dao)RAM。需要做以下(xia)兩(liang)個操作(zuo):
1. 首(shou)先在代碼文(wen)件(jian)中,將函數歸入某(mou)個section,這個例子(zi)里是codeinram段(duan)。
__attribute__((section(".codeinram"))) void function1(void);
2. 其次(ci),要對ld文件進行修改。
1、如(ru)果拿到(dao)的庫程序第(di)一次編譯報錯(cuo),錯(cuo)誤提示如(ru)下:
這是(shi)因為(wei)庫發布時帶了一些編譯選項,點擊CDK“清除”快捷按鈕清除一下(xia)工程,再重(zhong)新(xin)編譯即可。
1、芯片(pian)放在燒錄器(qi)上(shang)燒寫時需關注(zhu)芯片(pian)放置的位置,有(you)沒有(you)放反等等。
2、芯片(pian)在板燒寫(xie)時,需要(yao)注意
● 燒寫(xie)需(xu)要用到的5個信號(VDD,VSS,SWD,SWCLK,RST)有(you)沒有(you)都連(lian)到燒寫(xie)器上
● VDD和(he)VSS之(zhi)間的(de)電(dian)(dian)(dian)容(rong)有(you)沒有(you)超(chao)過100uF,超(chao)過的(de)話可能(neng)需要在燒錄(lu)器這邊的(de)VDD和(he)VSS之(zhi)間并個小(xiao)電(dian)(dian)(dian)容(rong)(如(ru)500ohm)來對板子上(shang)的(de)大電(dian)(dian)(dian)容(rong)進行放電(dian)(dian)(dian)
● SWD,SWCLK和RST線的路徑上有沒有串電阻或并電容,這些都會影響燒寫時序。電路設計時要盡量避免這樣的電路。 如果應用上不得不有這些阻容,電容<101pF,電阻<1Kohm
1、 可能的(de)原因是沒有選擇正確(que)的(de)下載文件(jian),或者下載文件(jian)的(de)長度為0。
當(dang)遇到(dao)CDK環境下可以燒(shao)(shao)錄(lu)(lu)代碼,但是拿到(dao)燒(shao)(shao)錄(lu)(lu)器上反而提示燒(shao)(shao)錄(lu)(lu)失敗的(de)現象時,請(qing)檢(jian)查:
ihex文件的(de)(de)大小(xiao)是不(bu)是超過(guo)了芯(xin)片的(de)(de)最大DROM size?
如果(guo)超過了,再(zai)檢查ld文(wen)件,是(shi)不是(shi)出現了段定義錯誤?如下面ROM段的(de)LENGTH。
MEMORY
{
ROM(RX) : ORIGIN = 0x00000000, LENGTH = 64K
RAM(RWX) : ORIGIN = 0x20000000, LENGTH = 4K
}