采用MAXQ610評(píng)估套件(EV kit)和IAR嵌入式工作臺(tái)進(jìn)行設(shè)計(jì)
摘要:應(yīng)用筆記介紹怎樣面向MAXQ610低功耗RISC微控制器開(kāi)發(fā)、構(gòu)建并調(diào)試應(yīng)用程序。文章使用了IAR?系統(tǒng)公司提供的IAR Embedded Workbench?工具箱和C編譯器。
引言
MAXQ610是Maxim Integrated Products提供的低功耗微控制器,設(shè)計(jì)用于電池供電的應(yīng)用,提供低電流工作模式(1MHz時(shí)的典型值為1.4mA,12MHz時(shí)為3.5mA),以及低電流停止模式(典型值200nA)。微控制器還具有效率非常高的16位單周期RISC處理器核以及靈活的時(shí)鐘配置,有助于動(dòng)態(tài)控制性能和功耗。MAXQ610適合于需要大量I/O引腳以及對(duì)功耗要求比較高的應(yīng)用。
MAXQ610具有很多重要的特性,包括:
- 1.7V至3.6V的寬范圍工作電壓
- 64KB應(yīng)用程序(IAP)閃存
- 2KB數(shù)據(jù)SRAM
- SPI?和兩個(gè)USART
- 8kHz低功耗“異或”喚醒定時(shí)器
- IR載頻發(fā)生器和調(diào)制
- 擾碼功能可防止攻擊者下載軟件,提供IP保護(hù)
- 存儲(chǔ)器保護(hù)功能隔離了內(nèi)核庫(kù),提供IP保護(hù),防止第三方應(yīng)用
MAXQ610評(píng)估套件(EV)為MAXQ610處理器開(kāi)發(fā)低功耗應(yīng)用提供成熟可靠的平臺(tái)。套件包括IR發(fā)射器和接收器;兩個(gè)串口;用于用戶輸入的8個(gè)按鍵;出于應(yīng)用目的的4個(gè)LED;原型區(qū);以及用于訪問(wèn)MAXQ610所有I/O引腳的插頭等。此外,還提供跳線,可以方便地監(jiān)監(jiān)MAXQ610處理器在工作時(shí)的實(shí)際功耗。
設(shè)置MAXQ610評(píng)估套件
MAXQ610評(píng)估套件電路板如圖1所示。評(píng)估套件含有下面的硬件元件,這些元件用于實(shí)現(xiàn)并驗(yàn)證本應(yīng)用筆記中的演示程序:
更詳細(xì)的圖(PDF, 284kB)
圖1. MAXQ610評(píng)估套件
MAXQ610評(píng)估套件電路板和JTAG電路板都有很多跳線需要進(jìn)行配置。在本應(yīng)用筆記中,應(yīng)按照表1和表2配置這些跳線。
表1. MAXQ610評(píng)估套件的電路板跳線配置
Jumper(s) | State | Purpose |
JH1, JH2 | Don't Care | Control RS-232 level shifters FORCEON and active-low FORCEOFF inputs |
JH3, JH4 | Don't Care | Configure RS-232 transmitter inputs |
JH20, JH21 | Don't Care | Connect RS-232 receiver outputs to MAXQ610 signals |
JH18 | Don't Care | Connect RS-232 active-low INVALID input to MAXQ610 control pin |
JH5 | Connect Pins 1 (Square Pad) and 2 | Connects regulated voltage to MAXQ610 supply |
JH22, JH23, JH24, JH25 | Closed | Connects MAXQ610 port pins to LEDs |
JH15, JH16, JH17 | Don't Care | Connect IR circuitry to MAXQ610 pins |
JH26 | Closed | Uses power from JTAG connection to power the MAXQ610 board |
JH14 | Closed | Connects board power to MAXQ610 |
表2. JTAG電路板跳線配置
Jumper(s) | State | Purpose |
JH1, JH2 | Don't Care | External DTR used to control loading the on-board microcontroller. |
JH3 | Closed | Connects JTAG board's 5.0V supply to JTAG connector pin 8 (feeds target board). |
用JTAG電纜連接JTAG電路板和MAXQ610評(píng)估套件電路板。電纜上的紅條應(yīng)連接至JTAG電路板上標(biāo)有引腳9和引腳10的連接器一側(cè),以及MAXQ610評(píng)估套件電路板上標(biāo)有TDI-GND的連接器一側(cè)。
用9針串行電纜連接PC和JTAG電路板(不要將其連接至MAXQ610評(píng)估套件電路板)。最后,將5V電源連接至JTAG電路板的電源連接器。
采用IAR編譯器開(kāi)始設(shè)計(jì):blinker
我們不以“Hello World”開(kāi)始,而是構(gòu)建一個(gè)簡(jiǎn)單的應(yīng)用程序,該應(yīng)用程序使MAXQ610評(píng)估套件電路板上的4個(gè)LED閃爍(例如,DS1、DS2、DS3和DS4)。我們要使用的工具包是IAR嵌入式工作臺(tái),由IAR系統(tǒng)公司提供。本應(yīng)用筆記的軟件采用IAR系統(tǒng)公司2.12版KickStart試驗(yàn)包來(lái)編寫(xiě)并進(jìn)行了測(cè)試。
在開(kāi)始一個(gè)新工程之前,需要將一些MAXQ610特殊文件復(fù)制到IAR安裝目錄(通常是C:\Program Files\IAR Systems\Embedded Workbench 4.0,下面將其稱(chēng)為[IAR])中。網(wǎng)上提供本應(yīng)用筆記的文件(請(qǐng)參考文檔最后的了解詳細(xì)信息一節(jié)),評(píng)估套件的CD-ROM也提供這些文件。請(qǐng)復(fù)制這里提到的這些文件:
- 將
iomaxq610.h
復(fù)制到[IAR]\MAXQ\inc
- 將
lnkmaxq610.xcl
復(fù)制到[IAR]\MAXQ\config
- 將
maxq610.sfr
復(fù)制到[IAR]\MAXQ\config
- 將
maxq610.ddf
復(fù)制到[IAR]\MAXQ\config
- 將
maxq610.menu
復(fù)制到[IAR]\MAXQ\config\devices
現(xiàn)在啟動(dòng)IAR嵌入式工作臺(tái)。選擇“Create new project in current workspace” (圖2)。選擇MAXQ?工具鏈,確定選擇了“Empty project” (圖3)。單擊OK,打開(kāi)一個(gè)文件對(duì)話框。在這個(gè)例子中,工程文件名為“blinker” (圖4)。
圖2. 工作臺(tái)啟動(dòng)
圖3. 建立一個(gè)空的工程
圖4. 如圖所示,保存工程“blinker”
工作空間將顯示“blinker”工程。現(xiàn)在,建立一個(gè)新文件(File New File),將以下文本復(fù)制到該文件中。
#include#include void main() { /* * Try to get a 1Hz blink on the LEDs. System clock = 12MHz. * Timer reload = 0x5B8D = 23437. Running at div 256, so we get a timer * interrupt once every 23437*256 cycles = 5,999,872, or roughly 500ms. * We toggle every 500ms, so we get a 1Hz cycle. */ TB0R = 0x5B8D; // reload for timer 0 TB0CN = 0x0416; // timer set to run, enable interrupt, down count, div 256 PD3 = 0x0f; // set port 2 lower nibble to output IC_bit.IGE = 1; // set global interrupt enable while (1) { } }
在這個(gè)簡(jiǎn)單的應(yīng)用程序中,采用一個(gè)定時(shí)器中斷來(lái)啟動(dòng)使評(píng)估套件LED不斷接通和關(guān)斷的代碼。要重新裝入的值在定時(shí)器寄存器中斷時(shí)自動(dòng)裝入該寄存器,大約每500ms周期性中斷一次。設(shè)置定時(shí)器運(yùn)行之后,將連接LED的端口引腳配置為輸出,然后,全局使能中斷。應(yīng)用程序進(jìn)入無(wú)限while循環(huán)。中斷服務(wù)例程(ISR)代碼完成應(yīng)用程序(請(qǐng)參見(jiàn)下面圖5)。
單擊save,將文件命名為main.c
(確定代碼保存目錄與您建立新工程的目錄相同)。在工作窗口下,右鍵單擊“blinker”,選擇Add Add main.c
。
下一步,將另外兩個(gè)文件從軟件分配源復(fù)制到您的工程目錄中:isr.c
和clib.r66
。C文件含有中斷部分,編譯器需要利用它來(lái)編譯程序。r66文件含有應(yīng)用程序運(yùn)行需要的啟動(dòng)代碼和標(biāo)準(zhǔn)庫(kù)代碼。每次開(kāi)始新的MAXQ610工程時(shí),都需要重復(fù)這一復(fù)制步驟。
再次右鍵單擊工作窗口中的“blinker”行,找到Add Add Files,選擇isr.c
。
現(xiàn)在,需要配置工程選項(xiàng)。選擇Project Options,打開(kāi)選項(xiàng)窗口。請(qǐng)按照以下步驟進(jìn)行:
- 在General選項(xiàng)下:Target,選擇MAXQ610。
- 在General選項(xiàng)下:Library Configuration,從下拉菜單中選擇Custom CLIB。瀏覽Library File文本區(qū),選擇剛剛復(fù)制到工程目錄中的
clib.r66
文件。 - 在Debugger下:Setup,從driver下拉菜單中選擇JTAG。
- 在JTAG下:輸入您將使用的連接JTAG電路板的串口。
現(xiàn)在,構(gòu)建應(yīng)用程序就非常簡(jiǎn)單了。按下F7或者選擇Project Make。您首先會(huì)被詢(xún)問(wèn)保存工作空間。對(duì)此,請(qǐng)輸入“gettingstarted”。工程應(yīng)該被正確構(gòu)建。
如果您希望在此處運(yùn)行應(yīng)用程序(例如,Project Debug,然后單擊右箭頭按鈕),電路板上不會(huì)有任何事情發(fā)生。這是因?yàn)閼?yīng)用程序代碼試圖使用定時(shí)器中斷來(lái)確定LED什么時(shí)候應(yīng)該改變,而定時(shí)器的ISR中沒(méi)有代碼。因此,必須為定時(shí)器(ISR)編寫(xiě)代碼。
打開(kāi)文件isr.c
,找到函數(shù)isr6(void)
,在它旁邊應(yīng)該有注釋//timers
。在函數(shù)中輸入以下代碼:
TB0CN = TB0CN & 0xFF7F; // clear timer 0 interrupt PO3 = PO3 ^ 0x0f; // toggle lower nibble
這些代碼首先清除定時(shí)器中斷標(biāo)志(必須由軟件清除中斷標(biāo)志,否則,將導(dǎo)致中斷矢量不斷啟動(dòng))。第二行觸發(fā)所有4個(gè)LED,這些LED連接到端口引腳P3.0至P3.3。
現(xiàn)在開(kāi)始構(gòu)建工程,進(jìn)行調(diào)試(Project Debug把您帶到執(zhí)行C代碼的第一行,如圖5所示)。代碼第一行下面高亮顯示,左側(cè)空白區(qū)有一個(gè)箭頭,指示程序在此暫停。現(xiàn)在,單擊Run按鈕(圖6)。該按鈕使程序運(yùn)行至結(jié)束(或者到下一個(gè)斷點(diǎn))。當(dāng)程序執(zhí)行無(wú)限循環(huán)時(shí),LED塊在一直閃爍。
圖5. 程序在代碼第一行暫停
圖6. 程序Run按鈕
使用IAR嵌入式工作臺(tái)調(diào)試應(yīng)用程序
現(xiàn)在,我們看一下MAXQ610和嵌入式工作臺(tái)工具的調(diào)試功能。MAXQ610處理器有內(nèi)置JTAG引擎,支持在實(shí)際芯片中進(jìn)行調(diào)試。這一特性還避免了使用昂貴的模擬器或者有可能出錯(cuò)的仿真器。
返回到最初的blinker應(yīng)用程序,開(kāi)始上面介紹的調(diào)試過(guò)程。第一行高亮顯示后,點(diǎn)擊Go按鈕,繼續(xù)執(zhí)行。您將看到LED接通500ms,然后關(guān)斷500ms。
單擊Break按鈕,或者選擇Debug Break,暫停執(zhí)行(圖7)。程序應(yīng)暫停在while(1)
聲明上,這是因?yàn)樵撀暶髡加昧藷o(wú)限循環(huán)的大部分運(yùn)行時(shí)間,而中斷矢量只占用了很少的時(shí)間(每500ms只有幾個(gè)周期)。
圖7. Break按鈕
在檢查一些處理器寄存器中的數(shù)值時(shí),打開(kāi)寄存器窗口(View Register)。此處,從下拉菜單中選擇Timer 0,您將看到與定時(shí)器控制閃爍LED相關(guān)的寄存器(圖8)。這里顯示的Timer 0寄存器包括重裝寄存器(TB0R),控制寄存器(TB0CN),計(jì)數(shù)寄存器(TB0C)和數(shù)值寄存器(TB0V)。
圖8. Register窗口顯示Timer 0寄存器
作為演示,我們將執(zhí)行幾行代碼,觀察這些定時(shí)器寄存器會(huì)有什么變化。按下Step Over按鈕幾次(圖9),或者選擇Debug Step Over。觀察TB0V中的數(shù)值。Step Over按鈕執(zhí)行一行C代碼,但是不會(huì)進(jìn)入任何函數(shù)調(diào)用。該按鈕按下時(shí),您將看到TB0V中的數(shù)值變化范圍很大,這是因?yàn)檎{(diào)試引擎執(zhí)行時(shí),定時(shí)器在不斷運(yùn)行。您還將看到,TB0CN寄存器隨著定時(shí)器中斷出現(xiàn)和結(jié)束的變化。
圖9. Step Over按鈕
寄存器窗口不但顯示了寄存器內(nèi)容,而且,在調(diào)試進(jìn)程中,還可以向其寫(xiě)入數(shù)值。程序暫停時(shí),雙擊TB0R寄存器中的數(shù)值。將寄存器改為0x2DC6
(這是0x5B8C/2
),然后,單擊Go按鈕。LED現(xiàn)在閃爍應(yīng)比以前快兩倍,這是因?yàn)槎〞r(shí)器重新裝入的計(jì)數(shù)值減小了,從而減小了定時(shí)器中斷之間的時(shí)間。
在另一個(gè)演示中,我們把光閃爍模式由全通/全關(guān)(1111 0000 1111
)改為交替模式(1010 0101 1010
)。而這種改變并不需要重新編譯程序。首先,我們必須加入一個(gè)斷點(diǎn)。程序運(yùn)行時(shí),打開(kāi)isr.c
文件,找到定時(shí)器中斷矢量。雙擊代碼第一行左側(cè)的灰色區(qū),將出現(xiàn)一個(gè)紅色X。這一X表示加入了一個(gè)斷點(diǎn)。當(dāng)程序執(zhí)行到這一行代碼時(shí),程序?qū)⑼V梗淦聊伙@示如圖10所示。綠色箭頭和高亮顯示的代碼表示已經(jīng)到達(dá)斷點(diǎn),程序暫停在這里。
圖10. 斷點(diǎn)設(shè)置和到達(dá)斷點(diǎn)
在寄存器窗口中,從下拉列表中選擇Port I/O。注意,代碼使用了XOR (^)運(yùn)算符來(lái)觸發(fā)端口3 (P3)最下面的4個(gè)引腳,而這些引腳從未明確設(shè)置。為改變這一操作,單擊PO3中的數(shù)值,輸入新值0x05
。輸入后,您將看到,按照0101的模式,2個(gè)LED接通,2個(gè)LED關(guān)斷。現(xiàn)在,單擊Run。程序開(kāi)始運(yùn)行,直至到達(dá)斷點(diǎn)而再次停止,LED將轉(zhuǎn)換狀態(tài),因此,處理器現(xiàn)在輸出1010
模式。雙擊紅色X,清除斷點(diǎn),然后,單擊Go。程序?qū)⒁越惶鍸ED模式不斷運(yùn)行。
在IAR嵌入式工作臺(tái)中,您可以按照與寄存器一樣的方法來(lái)觀察并改變變量值。對(duì)此進(jìn)行演示時(shí),單擊Stop或者選擇Debug Stop Debugging,停止應(yīng)用程序。現(xiàn)在,修改代碼,在主函數(shù)中加入變量x,在while循環(huán)中嵌入延時(shí)循環(huán)。如下所示,輸入對(duì)程序的一些修改。注意,在代碼中故意設(shè)置了錯(cuò)誤,稍后對(duì)它進(jìn)行討論。
void main() { /* * Try to get a 1Hz blink on the LEDs. System clock = 12MHz. * Timer reload = 0x5B8D = 23437. Running at div 256, so we get a timer * interrupt once every 23437*256 cycles = 5,999,872, or roughly 500ms. * We toggle every 500ms, so we get a 1Hz cycle. */ long int x; TB0R = 0x5B8D; // reload for timer 0 TB0CN = 0x0416; // timer set to run, enable interrupt, down count, div 256 PD3 = 0x0f; // set port 2 lower nibble to output IC_bit.IGE = 1; // set global interrupt enable while (1) { for (x=0;x<100000;x++) { if (x==100000) PO3 = PO3 ^ 0x01; } } }
這些改變用于偶爾觸發(fā)端口3最下面一個(gè)引腳,因此,3個(gè)LED同步閃爍,而1個(gè)將獨(dú)立閃爍。延時(shí)循環(huán)間隔并不重要,但是必須提供足夠的延時(shí)才能觀察到結(jié)果。運(yùn)行該應(yīng)用程序(開(kāi)始調(diào)試,然后,運(yùn)行),您將很快看到和最初的應(yīng)用程序并沒(méi)有什么不同;所有LED以1秒的間隔同時(shí)接通和關(guān)斷。暫停應(yīng)用程序,打開(kāi)本地變量觀察窗口(View Locals)。如果程序停在主應(yīng)用程序的while循環(huán)(很有可能)中,窗口中將顯示變量x (圖11)。
前面曾提到上面的代碼中有錯(cuò)誤。現(xiàn)在,按下Step Over按鈕幾次,您將看到執(zhí)行從循環(huán)對(duì)比(x<100000
)跳到條件測(cè)試“if”聲明(x ==100000
),直到遞增(x++
),然后是本地窗口中x值的變化。在PO3 = PO3 ^ 0x01
99999
,單擊Step Over幾次。您將注意到,由于x=0
部分被執(zhí)行,“for”循環(huán)終止,然后再次開(kāi)始。問(wèn)題很明顯—x值永遠(yuǎn)不會(huì)到達(dá)“for”循環(huán)中的100000,這是因?yàn)檫M(jìn)行了“l(fā)ess than”測(cè)試。停止程序,將“if”聲明中的對(duì)比值改為99999
。重新編譯程序,啟動(dòng)調(diào)試器,單擊Go。LED開(kāi)始閃爍,LED DS1自己獨(dú)立閃爍。
圖11. 本地變量窗口
評(píng)論
查看更多