引言
??? MAXQ610是Maxim Integrated Products提供的低功耗微控制器,,設計用于電池供電的應用,,提供低電流工作模式(1MHz時的典型值為1.4mA,,12MHz時為3.5mA),,以及低電流停止模式(典型值200nA),。微控制器還具有效率非常高的16位單周期RISC處理器核以及靈活的時鐘配置,有助于動態(tài)控制性能和功耗,。MAXQ610適合于需要大量I/O引腳以及對功耗要求比較高的應用,。??? MAXQ610具有很多重要的特性,包括:
- 1.7V至3.6V的寬范圍工作電壓
- 64KB應用程序(IAP)閃存
- 2KB數(shù)據(jù)SRAM
- SPI?和兩個USART
- 8kHz低功耗“異或”喚醒定時器
- IR載頻發(fā)生器和調(diào)制
- 擾碼功能可防止攻擊者下載軟件,,提供IP保護
- 存儲器保護功能隔離了內(nèi)核庫,,提供IP保護,防止第三方應用
設置MAXQ610評估套件
??? MAXQ610評估套件電路板如圖1所示,。評估套件含有下面的硬件元件,這些元件用于實現(xiàn)并驗證本應用筆記中的演示程序:- MAXQ610評估套件電路板
- JTAG電路板
- JTAG電纜(連接MAXQ610套件電路板和JTAG電路板)
- 9針串行電纜
- 穩(wěn)壓電源(5V,,±5%,,300mA,正極中心)
更詳細的圖(PDF, 284kB)
圖1. MAXQ610評估套件
??? MAXQ610評估套件電路板和JTAG電路板都有很多跳線需要進行配置,。在本應用筆記中,,應按照表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評估套件電路板,。電纜上的紅條應連接至JTAG電路板上標有引腳9和引腳10的連接器一側,,以及MAXQ610評估套件電路板上標有TDI-GND的連接器一側。
??? 用9針串行電纜連接PC和JTAG電路板(不要將其連接至MAXQ610評估套件電路板),。最后,,將5V電源連接至JTAG電路板的電源連接器。
采用IAR編譯器開始設計:blinker
??? 我們不以“Hello World”開始,,而是構建一個簡單的應用程序,,該應用程序使MAXQ610評估套件電路板上的4個LED閃爍(例如,DS1,、DS2,、DS3和DS4)。我們要使用的工具包是IAR嵌入式工作臺,,由IAR系統(tǒng)公司提供,。本應用筆記的軟件采用IAR系統(tǒng)公司2.12版KickStart試驗包來編寫并進行了測試。??? 在開始一個新工程之前,需要將一些MAXQ610特殊文件復制到IAR安裝目錄(通常是C:Program FilesIAR SystemsEmbedded Workbench 4.0,,下面將其稱為[IAR])中,。網(wǎng)上提供本應用筆記的文件(請參考文檔最后的了解詳細信息一節(jié)),評估套件的CD-ROM也提供這些文件,。請復制這里提到的這些文件:
- 將
iomaxq610.h
復制到[IAR]MAXQinc
- 將
lnkmaxq610.xcl
復制到[IAR]MAXQconfig
- 將
maxq610.sfr
復制到[IAR]MAXQconfig
- 將
maxq610.ddf
復制到[IAR]MAXQconfig
- 將
maxq610.menu
復制到[IAR]MAXQconfigdevices
圖2. 工作臺啟動
圖3. 建立一個空的工程
圖4. 如圖所示,保存工程“blinker”
??? 工作空間將顯示“blinker”工程?,F(xiàn)在,,建立一個新文件(File New
File),將以下文本復制到該文件中,。
#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) { } }
??? 在這個簡單的應用程序中,,采用一個定時器中斷來啟動使評估套件LED不斷接通和關斷的代碼。要重新裝入的值在定時器寄存器中斷時自動裝入該寄存器,,大約每500ms周期性中斷一次,。設置定時器運行之后,將連接LED的端口引腳配置為輸出,,然后,,全局使能中斷。應用程序進入無限while循環(huán),。中斷服務例程(ISR)代碼完成應用程序(請參見下面圖5),。
??? 單擊save,將文件命名為
main.c
(確定代碼保存目錄與您建立新工程的目錄相同),。在工作窗口下,,右鍵單擊“blinker”,選擇Add 
main.c
,。??? 下一步,,將另外兩個文件從軟件分配源復制到您的工程目錄中:
isr.c
和clib.r66
。C文件含有中斷部分,,編譯器需要利用它來編譯程序,。r66文件含有應用程序運行需要的啟動代碼和標準庫代碼。每次開始新的MAXQ610工程時,都需要重復這一復制步驟,。??? 再次右鍵單擊工作窗口中的“blinker”行,,找到Add

isr.c
,。??? 現(xiàn)在,,需要配置工程選項。選擇Project

- 在General選項下:Target,選擇MAXQ610,。
- 在General選項下:Library Configuration,,從下拉菜單中選擇Custom CLIB。瀏覽Library File文本區(qū),,選擇剛剛復制到工程目錄中的
clib.r66
文件,。 - 在Debugger下:Setup,從driver下拉菜單中選擇JTAG,。
- 在JTAG下:輸入您將使用的連接JTAG電路板的串口,。

??? 如果您希望在此處運行應用程序(例如,,Project

??? 打開文件
isr.c
,找到函數(shù)isr6(void)
,,在它旁邊應該有注釋//timers
,。在函數(shù)中輸入以下代碼: TB0CN = TB0CN & 0xFF7F; // clear timer 0 interrupt PO3 = PO3 ^ 0x0f; // toggle lower nibble
?
??? 這些代碼首先清除定時器中斷標志(必須由軟件清除中斷標志,否則,,將導致中斷矢量不斷啟動),。第二行觸發(fā)所有4個LED,這些LED連接到端口引腳P3.0至P3.3。
??? 現(xiàn)在開始構建工程,,進行調(diào)試(Project Debug把您帶到執(zhí)行C代碼的第一行,,如圖5所示)。代碼第一行下面高亮顯示,,左側空白區(qū)有一個箭頭,,指示程序在此暫停?,F(xiàn)在,,單擊Run按鈕(圖6)。該按鈕使程序運行至結束(或者到下一個斷點),。當程序執(zhí)行無限循環(huán)時,,LED塊在一直閃爍。
圖5. 程序在代碼第一行暫停
圖6. 程序Run按鈕
使用IAR嵌入式工作臺調(diào)試應用程序
??? 現(xiàn)在,,我們看一下MAXQ610和嵌入式工作臺工具的調(diào)試功能,。MAXQ610處理器有內(nèi)置JTAG引擎,支持在實際芯片中進行調(diào)試,。這一特性還避免了使用昂貴的模擬器或者有可能出錯的仿真器,。??? 返回到最初的blinker應用程序,開始上面介紹的調(diào)試過程,。第一行高亮顯示后,點擊Go按鈕,,繼續(xù)執(zhí)行,。您將看到LED接通500ms,然后關斷500ms,。
??? 單擊Break按鈕,,或者選擇Debug

while(1)
聲明上,,這是因為該聲明占用了無限循環(huán)的大部分運行時間,而中斷矢量只占用了很少的時間(每500ms只有幾個周期),。
圖7. Break按鈕
??? 在檢查一些處理器寄存器中的數(shù)值時,,打開寄存器窗口(View Register)。此處,,從下拉菜單中選擇Timer 0,,您將看到與定時器控制閃爍LED相關的寄存器(圖8)。這里顯示的Timer 0寄存器包括重裝寄存器(TB0R),,控制寄存器(TB0CN),,計數(shù)寄存器(TB0C)和數(shù)值寄存器(TB0V)。
圖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)和結束的變化,。
圖9. Step Over按鈕
??? 寄存器窗口不但顯示了寄存器內(nèi)容,,而且,在調(diào)試進程中,,還可以向其寫入數(shù)值,。程序暫停時,雙擊TB0R寄存器中的數(shù)值,。將寄存器改為0x2DC6
(這是0x5B8C/2
),,然后,單擊Go按鈕,。LED現(xiàn)在閃爍應比以前快兩倍,,這是因為定時器重新裝入的計數(shù)值減小了,從而減小了定時器中斷之間的時間,。
??? 在另一個演示中,,我們把光閃爍模式由全通/全關(1111
)改為交替模式( 0000
1111
1010
)。而這種改變并不需要重新編譯程序,。首先,,我們必須加入一個斷點。程序運行時,,打開 0101
1010
isr.c
文件,,找到定時器中斷矢量。雙擊代碼第一行左側的灰色區(qū),,將出現(xiàn)一個紅色X,。這一X表示加入了一個斷點。當程序執(zhí)行到這一行代碼時,,程序將停止,,其屏幕顯示如圖10所示,。綠色箭頭和高亮顯示的代碼表示已經(jīng)到達斷點,程序暫停在這里,。
圖10. 斷點設置和到達斷點
??? 在寄存器窗口中,,從下拉列表中選擇Port I/O。注意,,代碼使用了XOR (^)運算符來觸發(fā)端口3 (P3)最下面的4個引腳,,而這些引腳從未明確設置。為改變這一操作,,單擊PO3中的數(shù)值,,輸入新值0x05
。輸入后,,您將看到,,按照0101的模式,2個LED接通,,2個LED關斷?,F(xiàn)在,單擊Run,。程序開始運行,,直至到達斷點而再次停止,LED將轉換狀態(tài),,因此,,處理器現(xiàn)在輸出1010
模式。雙擊紅色X,,清除斷點,,然后,單擊Go,。程序將以交替LED模式不斷運行。
??? 在IAR嵌入式工作臺中,,您可以按照與寄存器一樣的方法來觀察并改變變量值,。對此進行演示時,單擊Stop或者選擇Debug Stop Debugging,,停止應用程序?,F(xiàn)在,修改代碼,,在主函數(shù)中加入變量x,,在while循環(huán)中嵌入延時循環(huá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最下面一個引腳,,因此,3個LED同步閃爍,,而1個將獨立閃爍,。延時循環(huán)間隔并不重要,但是必須提供足夠的延時才能觀察到結果,。運行該應用程序(開始調(diào)試,,然后,運行),,您將很快看到和最初的應用程序并沒有什么不同,;所有LED以1秒的間隔同時接通和關斷。暫停應用程序,,打開本地變量觀察窗口(View Locals),。如果程序停在主應用程序的while循環(huán)(很有可能)中,窗口中將顯示變量x (圖11),。
??? 前面曾提到上面的代碼中有錯誤?,F(xiàn)在,按下Step Over按鈕幾次,,您將看到執(zhí)行從循環(huán)對比(x<100000
)跳到條件測試“if”聲明(x ==100000
),,直到遞增(x++
),然后是本地窗口中x值的變化,。在PO3 = PO3 ^ 0x01
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. 本地變量窗口
了解詳細信息
???? 評估套件CD-ROM中提供本應用筆記所有文件的源代碼,。還可以從Maxim網(wǎng)站下載這些源代碼。文件還含有工程文件,;所有頭文件和include文件,;以及機器可裝入.HEX輸出文件,采用Maxim的MTK (微控制器工具套件)等終端模擬器直接可以裝入并運行它(例如,,不需要使用編譯器工具包),,可以下載這一模擬器。???? Maxim提供軟件庫,、應用筆記和參考設計,。如果您需要了解庫和工具的最新信息,或者對本應用筆記還有問題,,請搜索Maxim網(wǎng)站的微控制器部分,,或者聯(lián)系 [email protected] (English only)。
IAR Embedded Workbench是IAR Systems AB的注冊商標,。
??? IAR是IAR Systems AB的商標,。
??? MAXQ是Maxim Integrated Products, Inc.的注冊商標。
??? SPI是Motorola, Inc.的商標,。
?
?
?