引言
MAXQ610是Maxim Integrated Products提供的低功耗微控制器,設(shè)計用于電池供電的應(yīng)用,提供低電流工作模式(1MHz時的典型值為1.4mA,12MHz時為3.5mA),以及低電流停止模式(典型值200nA)。微控制器還具有效率非常高的16位單周期RISC處理器核以及靈活的時鐘配置,有助于動態(tài)控制性能和功耗。MAXQ610適合于需要大量I/O引腳以及對功耗要求比較高的應(yīng)用。MAXQ610具有很多重要的特性,包括:
- 1.7V至3.6V的寬范圍工作電壓
- 64KB應(yīng)用程序(IAP)閃存
- 2KB數(shù)據(jù)SRAM
- SPI?和兩個USART
- 8kHz低功耗“異或”喚醒定時器
- IR載頻發(fā)生器和調(diào)制
- 擾碼功能可防止攻擊者下載軟件,提供IP保護
- 存儲器保護功能隔離了內(nèi)核庫,提供IP保護,防止第三方應(yīng)用
設(shè)置MAXQ610評估套件
MAXQ610評估套件電路板如圖1所示。評估套件含有下面的硬件元件,這些元件用于實現(xiàn)并驗證本應(yīng)用筆記中的演示程序:更詳細的圖(PDF, 284kB)
圖1. MAXQ610評估套件
MAXQ610評估套件電路板和JTAG電路板都有很多跳線需要進行配置。在本應(yīng)用筆記中,應(yīng)按照表1和表2配置這些跳線。
表1. MAXQ610評估套件的電路板跳線配置
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評估套件電路板。電纜上的紅條應(yīng)連接至JTAG電路板上標有引腳9和引腳10的連接器一側(cè),以及MAXQ610評估套件電路板上標有TDI-GND的連接器一側(cè)。
用9針串行電纜連接PC和JTAG電路板(不要將其連接至MAXQ610評估套件電路板)。最后,將5V電源連接至JTAG電路板的電源連接器。
采用IAR編譯器開始設(shè)計:blinker
我們不以“Hello World”開始,而是構(gòu)建一個簡單的應(yīng)用程序,該應(yīng)用程序使MAXQ610評估套件電路板上的4個LED閃爍(例如,DS1、DS2、DS3和DS4)。我們要使用的工具包是IAR嵌入式工作臺,由IAR系統(tǒng)公司提供。本應(yīng)用筆記的軟件采用IAR系統(tǒng)公司2.12版KickStart試驗包來編寫并進行了測試。在開始一個新工程之前,需要將一些MAXQ610特殊文件復(fù)制到IAR安裝目錄(通常是C:\Program Files\IAR Systems\Embedded Workbench 4.0,下面將其稱為[IAR])中。網(wǎng)上提供本應(yīng)用筆記的文件(請參考文檔最后的了解詳細信息一節(jié)),評估套件的CD-ROM也提供這些文件。請復(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
![圖2. 工作臺啟動](/article/UploadPic/2009-4/2009423155035555.jpg)
圖2. 工作臺啟動
![圖3. 建立一個空的工程](/article/UploadPic/2009-4/2009423155035125.jpg)
圖3. 建立一個空的工程
![圖4. 如圖所示,保存工程“blinker”](/article/UploadPic/2009-4/2009423155035595.jpg)
圖4. 如圖所示,保存工程“blinker”
工作空間將顯示“blinker”工程。現(xiàn)在,建立一個新文件(File New File),將以下文本復(fù)制到該文件中。
#include在這個簡單的應(yīng)用程序中,采用一個定時器中斷來啟動使評估套件LED不斷接通和關(guān)斷的代碼。要重新裝入的值在定時器寄存器中斷時自動裝入該寄存器,大約每500ms周期性中斷一次。設(shè)置定時器運行之后,將連接LED的端口引腳配置為輸出,然后,全局使能中斷。應(yīng)用程序進入無限while循環(huán)。中斷服務(wù)例程(ISR)代碼完成應(yīng)用程序(請參見下面圖5)。#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) { } }
單擊save,將文件命名為main.c (確定代碼保存目錄與您建立新工程的目錄相同)。在工作窗口下,右鍵單擊“blinker”,選擇Add Add main.c。
下一步,將另外兩個文件從軟件分配源復(fù)制到您的工程目錄中:isr.c和clib.r66。C文件含有中斷部分,編譯器需要利用它來編譯程序。r66文件含有應(yīng)用程序運行需要的啟動代碼和標準庫代碼。每次開始新的MAXQ610工程時,都需要重復(fù)這一復(fù)制步驟。
再次右鍵單擊工作窗口中的“blinker”行,找到Add Add Files,選擇isr.c。
現(xiàn)在,需要配置工程選項。選擇Project Options,打開選項窗口。請按照以下步驟進行:
- 在General選項下:Target,選擇MAXQ610。
- 在General選項下:Library Configuration,從下拉菜單中選擇Custom CLIB。瀏覽Library File文本區(qū),選擇剛剛復(fù)制到工程目錄中的clib.r66文件。
- 在Debugger下:Setup,從driver下拉菜單中選擇JTAG。
- 在JTAG下:輸入您將使用的連接JTAG電路板的串口。
如果您希望在此處運行應(yīng)用程序(例如,Project Debug,然后單擊右箭頭按鈕),電路板上不會有任何事情發(fā)生。這是因為應(yīng)用程序代碼試圖使用定時器中斷來確定LED什么時候應(yīng)該改變,而定時器的ISR中沒有代碼。因此,必須為定時器(ISR)編寫代碼。
打開文件isr.c,找到函數(shù)isr6(void),在它旁邊應(yīng)該有注釋//timers。在函數(shù)中輸入以下代碼:
TB0CN = TB0CN & 0xFF7F; // clear timer 0 interrupt PO3 = PO3 ^ 0x0f; // toggle lower nibble這些代碼首先清除定時器中斷標志(必須由軟件清除中斷標志,否則,將導(dǎo)致中斷矢量不斷啟動)。第二行觸發(fā)所有4個LED,這些LED連接到端口引腳P3.0至P3.3。
現(xiàn)在開始構(gòu)建工程,進行調(diào)試(Project Debug把您帶到執(zhí)行C代碼的第一行,如圖5所示)。代碼第一行下面高亮顯示,左側(cè)空白區(qū)有一個箭頭,指示程序在此暫停。現(xiàn)在,單擊Run按鈕(圖6)。該按鈕使程序運行至結(jié)束(或者到下一個斷點)。當(dāng)程序執(zhí)行無限循環(huán)時,LED塊在一直閃爍。
![圖5. 程序在代碼第一行暫停](/article/UploadPic/2009-4/2009423155036338.jpg)
圖5. 程序在代碼第一行暫停
![圖6. 程序Run按鈕](/article/UploadPic/2009-4/2009423155036752.jpg)
圖6. 程序Run按鈕
使用IAR嵌入式工作臺調(diào)試應(yīng)用程序
現(xiàn)在,我們看一下MAXQ610和嵌入式工作臺工具的調(diào)試功能。MAXQ610處理器有內(nèi)置JTAG引擎,支持在實際芯片中進行調(diào)試。這一特性還避免了使用昂貴的模擬器或者有可能出錯的仿真器。返回到最初的blinker應(yīng)用程序,開始上面介紹的調(diào)試過程。第一行高亮顯示后,點擊Go按鈕,繼續(xù)執(zhí)行。您將看到LED接通500ms,然后關(guān)斷500ms。
單擊Break按鈕,或者選擇Debug Break,暫停執(zhí)行(圖7)。程序應(yīng)暫停在while(1)聲明上,這是因為該聲明占用了無限循環(huán)的大部分運行時間,而中斷矢量只占用了很少的時間(每500ms只有幾個周期)。
![圖7. Break按鈕](/article/UploadPic/2009-4/2009423155036423.jpg)
圖7. Break按鈕
在檢查一些處理器寄存器中的數(shù)值時,打開寄存器窗口(View Register)。此處,從下拉菜單中選擇Timer 0,您將看到與定時器控制閃爍LED相關(guān)的寄存器(圖8)。這里顯示的Timer 0寄存器包括重裝寄存器(TB0R),控制寄存器(TB0CN),計數(shù)寄存器(TB0C)和數(shù)值寄存器(TB0V)。
![圖8. Register窗口顯示Timer 0寄存器](/article/UploadPic/2009-4/2009423155036681.jpg)
圖8. Register窗口顯示Timer 0寄存器
作為演示,我們將執(zhí)行幾行代碼,觀察這些定時器寄存器會有什么變化。按下Step Over按鈕幾次(圖9),或者選擇Debug Step Over。觀察TB0V中的數(shù)值。Step Over按鈕執(zhí)行一行C代碼,但是不會進入任何函數(shù)調(diào)用。該按鈕按下時,您將看到TB0V中的數(shù)值變化范圍很大,這是因為調(diào)試引擎執(zhí)行時,定時器在不斷運行。您還將看到,TB0CN寄存器隨著定時器中斷出現(xiàn)和結(jié)束的變化。
![圖9. Step Over按鈕](/article/UploadPic/2009-4/2009423155036392.jpg)
圖9. Step Over按鈕
寄存器窗口不但顯示了寄存器內(nèi)容,而且,在調(diào)試進程中,還可以向其寫入數(shù)值。程序暫停時,雙擊TB0R寄存器中的數(shù)值。將寄存器改為0x2DC6 (這是0x5B8C/2),然后,單擊Go按鈕。LED現(xiàn)在閃爍應(yīng)比以前快兩倍,這是因為定時器重新裝入的計數(shù)值減小了,從而減小了定時器中斷之間的時間。
在另一個演示中,我們把光閃爍模式由全通/全關(guān)(1111 0000 1111)改為交替模式(1010 0101 1010)。而這種改變并不需要重新編譯程序。首先,我們必須加入一個斷點。程序運行時,打開isr.c文件,找到定時器中斷矢量。雙擊代碼第一行左側(cè)的灰色區(qū),將出現(xiàn)一個紅色X。這一X表示加入了一個斷點。當(dāng)程序執(zhí)行到這一行代碼時,程序?qū)⑼V梗淦聊伙@示如圖10所示。綠色箭頭和高亮顯示的代碼表示已經(jīng)到達斷點,程序暫停在這里。
![圖10. 斷點設(shè)置和到達斷點](/article/UploadPic/2009-4/2009423155036790.jpg)
圖10. 斷點設(shè)置和到達斷點
在寄存器窗口中,從下拉列表中選擇Port I/O。注意,代碼使用了XOR (^)運算符來觸發(fā)端口3 (P3)最下面的4個引腳,而這些引腳從未明確設(shè)置。為改變這一操作,單擊PO3中的數(shù)值,輸入新值0x05。輸入后,您將看到,按照0101的模式,2個LED接通,2個LED關(guān)斷。現(xiàn)在,單擊Run。程序開始運行,直至到達斷點而再次停止,LED將轉(zhuǎn)換狀態(tài),因此,處理器現(xiàn)在輸出1010模式。雙擊紅色X,清除斷點,然后,單擊Go。程序?qū)⒁越惶鍸ED模式不斷運行。
在IAR嵌入式工作臺中,您可以按照與寄存器一樣的方法來觀察并改變變量值。對此進行演示時,單擊Stop或者選擇Debug Stop Debugging,停止應(yīng)用程序。現(xiàn)在,修改代碼,在主函數(shù)中加入變量x,在while循環(huán)中嵌入延時循環(huán)。如下所示,輸入對程序的一些修改。注意,在代碼中故意設(shè)置了錯誤,稍后對它進行討論。
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最下面一個引腳,因此,3個LED同步閃爍,而1個將獨立閃爍。延時循環(huán)間隔并不重要,但是必須提供足夠的延時才能觀察到結(jié)果。運行該應(yīng)用程序(開始調(diào)試,然后,運行),您將很快看到和最初的應(yīng)用程序并沒有什么不同;所有LED以1秒的間隔同時接通和關(guān)斷。暫停應(yīng)用程序,打開本地變量觀察窗口(View Locals)。如果程序停在主應(yīng)用程序的while循環(huán)(很有可能)中,窗口中將顯示變量x (圖11)。
前面曾提到上面的代碼中有錯誤。現(xiàn)在,按下Step Over按鈕幾次,您將看到執(zhí)行從循環(huán)對比(x<100000)跳到條件測試“if”聲明(x ==100000),直到遞增(x++),然后是本地窗口中x值的變化。在PO3 = PO3 ^ 0x01一行設(shè)置一個斷點,單擊Go。出于某些原因,執(zhí)行并沒有暫停。很明顯,程序沒有進入“if”聲明。再次按下Break,將變量x值改為99999,單擊Step Over幾次。您將注意到,由于x=0部分被執(zhí)行,“for”循環(huán)終止,然后再次開始。問題很明顯—x值永遠不會到達“for”循環(huán)中的100000,這是因為進行了“l(fā)ess than”測試。停止程序,將“if”聲明中的對比值改為99999。重新編譯程序,啟動調(diào)試器,單擊Go。LED開始閃爍,LED DS1自己獨立閃爍。
![圖11. 本地變量窗口](/article/UploadPic/2009-4/2009423155036108.jpg)
圖11. 本地變量窗口
評論