在使用C2000的時候,經(jīng)常遇到工程師說芯片仿真能夠運(yùn)行,但是單機(jī)跑卻不能跑起來;或者在調(diào)試時,復(fù)位芯片>run,發(fā)現(xiàn)程序不能跑起來。這其中的原因主要是沒有了解C2000的引導(dǎo)模式設(shè)置。另外當(dāng)我們想通過其他方式去引導(dǎo)芯片啟動的時候,往往也需要清楚知道C2000的引導(dǎo)是怎么設(shè)置的。因此,在這里跟大家分享一下我對C2000引導(dǎo)模式的理解,希望對各位理解芯片從上電到跑到main這一段芯片運(yùn)行情況有所幫助。
以C2000Piccolo系列的引導(dǎo)模式為例,delfino稍微有點(diǎn)區(qū)別,concerto系列的引導(dǎo)則更復(fù)雜。但理解了Piccolo的引導(dǎo)原理對我們理解后面兩個系列的芯片有非常大的幫助。
1.首先我們根據(jù)圖1來看一下芯片上電后的代碼執(zhí)行流程,當(dāng)芯片在接收到一個復(fù)位信號后,會到0x3FFFC0去復(fù)位向量,該復(fù)位向量跳到BootROM0x3FF75C中去執(zhí)行bootloader的程序,這里主要有initboot,和SelectBootMode,以及一些外設(shè)引導(dǎo)的函數(shù)。SeleteBootMode根據(jù)芯片的硬件或軟件設(shè)置來判斷芯片該去哪里尋找程序入口,直接目的是如何找到main,然后執(zhí)行應(yīng)用程序。
圖1.芯片的復(fù)位流程圖
我們最常用到的主要有兩種引導(dǎo)模式:
一種是boottoRAM,即跳到0x000000的RAM中,去開始執(zhí)行指令,主要針對程序加載在RAM的仿真模式;另外一種是boottoFlash,則跳到0x3F7FF6中去開始執(zhí)行代碼。
相應(yīng)的,程序會這兩個入口地址0x000000,0x3F7FF6放一條跳轉(zhuǎn)指令,在codestart.asm源文件中,原因是在Flash的入口地址處只有兩個單元的空間,后面是CSM模塊,所以需要跳轉(zhuǎn);而在RAM中之所以也需要跳轉(zhuǎn),主要是因?yàn)樵谔D(zhuǎn)到main之前,需要執(zhí)行一小段代碼_c_int00,該代碼會使用0x000003之后的一段RAM,如果代碼放在那里,在執(zhí)行_c_int00之后會損壞代碼。
另外就是一些外設(shè)引導(dǎo)模式,如SCI引導(dǎo)以及SPI引導(dǎo)等,像我們常使用的C2PROG軟件就支持SCI引導(dǎo),然后通過串口下載程序。
2. 那么芯片的SelectBootMode函數(shù)是如何來判斷芯片的引導(dǎo)模式(bootmode)呢?
從圖2中我們可以看到,首先會判斷芯片是否連接仿真器,根據(jù)TRST引腳的狀態(tài)來判斷。
如果是仿真器連接,則進(jìn)入仿真引導(dǎo)(Emulation Boot),這時候芯片的引導(dǎo)主要是靠2個RAM的單元來判斷,即EMU_BMODE和EMU_KEY,地址是0xD01和0xD00,所以我們在連接仿真器后,可以首先修改這兩個EMU_BMODE和EMU_KEY來設(shè)置引導(dǎo)模式;
如果沒有連接仿真器,則進(jìn)入單機(jī)跑模式(stand alone), 這時候芯片的引導(dǎo)主要靠GPIO34和GPIO37的狀態(tài),以及兩個OTP存儲單元的值來判斷。不過我們經(jīng)常沒有使用OTP這兩個單元,用GPIO的狀態(tài)就已經(jīng)夠了。
圖2. 兩種狀態(tài)下的引導(dǎo)模式
3. 仿真器連接時的引導(dǎo)模式配置
當(dāng)帶仿真器的時候,芯片會根據(jù)EMU_BMODE和EMU_KEY這兩個單元的值來判斷引導(dǎo)模式,比如我們帶仿真器最常用的就是引導(dǎo)到RAM,即需要設(shè)置EMU_KEY = 0X55AA, EMU_BMODE = 0X000A。當(dāng)我們在仿真的時候,程序load到Flash的時候,就需要設(shè)置EMU_KEY = 0X55AA, EMU_BMODE = 0X000B,如果EMU_BMODE = 0x0003的話,由于我們沒有對OTP單元進(jìn)行操作,即OTP的值為0xFFFF,所以這種情況下也是boot to flash。
在帶仿真器跑程序的時候,我們發(fā)現(xiàn)即使我們不配置引導(dǎo)模式,程序也能夠跑到main,這主要是因?yàn)镃CS的功能,在程序load到芯片的時候,或是reset > restart,CCS會自動屏蔽bootloader的過程,自動跳到main函數(shù)入口。如果我們只選擇reset CPU,則需要配置引導(dǎo)模式,即對0x0d01, 0x0d00這兩個單元在memory window進(jìn)行寫相應(yīng)的值,或是在script的菜單中選擇引導(dǎo)模式,程序才能夠跑到main中。
4. 單機(jī)跑是引導(dǎo)模式配置
單機(jī)跑的時候,我們最常用的是跑到Flash中,這時候則需要配置GPIO34和GPIO37的引腳為高電平,由于Piccolo系列芯片這幾個引導(dǎo)都有上電默認(rèn)內(nèi)部上拉使能,所以即使不用加上拉電阻也可以。這時候的引導(dǎo)模式是GetMode,由于我們沒有去配置OTP兩個單元,所以這兩個單元默認(rèn)為0xFFFF,所以芯片的引導(dǎo)模式最終為boot to Flash。
5. 其他外設(shè)的引導(dǎo)模式
從上面這幾張圖中可以看到還有許多外設(shè)引導(dǎo)的功能,以SCI引導(dǎo)為例,帶仿真器和單機(jī)跑的時候,都要配置相應(yīng)的存儲單元以及GPIO口狀態(tài),使之配置為SCI boot mode。然后芯片會SCI boot 函數(shù),準(zhǔn)備接收串口的代碼,上位機(jī)要根據(jù)SCI boot的通信協(xié)議,生成SCI boot的數(shù)據(jù)流格式,將數(shù)據(jù)通過串口發(fā)送給芯片,芯片的bootloader會接收該代碼,接收完后會根據(jù)該數(shù)據(jù)流中的起始運(yùn)行地址去開始執(zhí)行從SCI下載的代碼。
審核編輯:郭婷
-
芯片
+關(guān)注
關(guān)注
455文章
50714瀏覽量
423137 -
RAM
+關(guān)注
關(guān)注
8文章
1368瀏覽量
114640
發(fā)布評論請先 登錄
相關(guān)推薦
評論