概述
MAXQ微控制器開發(fā)平臺(tái)得到Rowley Associates的CrossWorks編程工具的支持。本應(yīng)用筆記說明怎樣使用CrossWorks v.1.0和MAXQ2000評(píng)估板來創(chuàng)建、構(gòu)建和調(diào)試面向MAXQ平臺(tái)的C應(yīng)用程序。這些說明對(duì)以后的CrossWorks版本仍然適用。MAXQ2000微控制器的特性會(huì)在下面的“設(shè)置”部分進(jìn)行說明。設(shè)置MAXQ2000評(píng)估板
寫代碼前,必須先連接MAXQ2000評(píng)估板。評(píng)估板包括3塊電路板,其中一塊帶有小型LCD屏。圖1為連接有LCD子板的最大電路板,這就是實(shí)際的MAXQ2000評(píng)估板,稍后我們將進(jìn)行討論。將LCD連接到MAXQ2000評(píng)估板(見圖1)上標(biāo)號(hào)為J3的接頭上。
圖1. 安裝了LCD板的MAXQ2000評(píng)估板
MAXQ2000加載器和調(diào)試引擎使用JTAG協(xié)議進(jìn)行通信。因?yàn)閷?shí)際上沒有用于個(gè)人計(jì)算機(jī)的商業(yè)、通用JTAG適配器,所以Dallas Semiconductor提供了一個(gè)串口-JTAG轉(zhuǎn)換電路板,即第三塊電路板。使用評(píng)估板帶的小型10芯電纜,將MAXQ2000評(píng)估板上標(biāo)號(hào)為J4的接頭與JTAG板上標(biāo)號(hào)為P2的接頭連接。見圖2。注意,連接器紅色一側(cè)對(duì)應(yīng)兩個(gè)板上的引腳1和2。
圖2. MAXQ2000評(píng)估板與JTAG板連接
MAXQ2000評(píng)估板上應(yīng)該有3個(gè)跳線。連接頭JU1的引腳1和2應(yīng)使用跳線相連。同樣,JU2的引腳1和2,以及JU3的引腳1和2也應(yīng)使用跳線相連。另外,確保高頻晶振安裝在Y1上(靠近電路板上的微控制器)。本應(yīng)用筆記的演示代碼假定采用16MHz晶振,評(píng)估板上安裝了該晶振。JTAG電路板應(yīng)該也在JH1、JH2和JH3接頭上安裝了3個(gè)跳線。
該設(shè)置還需要一個(gè)中心為正的5V ±5%直流電源。關(guān)于電源要求的更多信息請(qǐng)參考MAXQ2000評(píng)估板文檔。將電源連接到JTAG板的電源插孔J2上。
最后,將PC串口與JTAG板相連。使用常規(guī)的9芯直通串口電纜,將計(jì)算機(jī)的一個(gè)串口與JTAG板的串口相連。注意:不要連接到MAXQ2000評(píng)估板上的串口。圖3所示為正確連接。
圖3. 串口電纜與JTAG板的正確連接
現(xiàn)在可以開始使用CrossWorks工具了。
在CrossWorks中創(chuàng)建MAXQ2000工程
Rowley Associates為MAXQ提供全功能CrossWorks (30天評(píng)估許可),可以從www.rowley.co.uk/maxq/index.htm下載。按照提示安裝,安裝位置和其它選項(xiàng)選擇缺省值。注意,Rowley Associates的MAXQ CrossWorks目前只有基于Windows平臺(tái)的版本。需要發(fā)電子郵件給Rowley Associates,索取30天產(chǎn)品激活密鑰,才能繼續(xù)安裝。遵循Rowley Associates網(wǎng)站“支持” (Support)欄的指導(dǎo)說明:評(píng)估CrossWorks (Evaluating CrossWorks)。安裝完成后,按下列操作運(yùn)行MAXQ CrossWorks,從開始菜單起,依次選擇Rowley Associates Limited,然后CrossWorks MAXQ 1.0,最后CrossStudio。主窗口打開后會(huì)顯示CrossWorks的功能概要。
創(chuàng)建工程時(shí),首先選擇File,然后是New,再選擇New Project。在出現(xiàn)的對(duì)話框中,從模板中選擇C Executable,輸入新工程的名稱和位置,點(diǎn)擊OK (見圖4)。
圖4. 新工程選項(xiàng)對(duì)話窗口
在接下來的工程設(shè)置對(duì)話框(見圖5)中,確認(rèn)Target Processor選項(xiàng)為MAXQ2000。其它設(shè)置可以保留缺省值。點(diǎn)擊Finish產(chǎn)生新的MAXQ2000工程。
圖5. 新工程設(shè)置對(duì)話窗口
隨后,需要輸入足夠的代碼,讓MAXQ2000評(píng)估板做一些有趣的事情。如果工程管理器窗口沒有打開,選擇View,然后選擇Project Explorer打開它?,F(xiàn)在可以在工程管理器窗口內(nèi)雙擊打開main.c文件。輸入下列代碼(先將main.c原來的代碼刪除)。
#include輸入上述代碼后,確認(rèn)MAXQ2000評(píng)估板和串口-JTAG板按照上述說明連接完畢和上電。CrossWorks窗口底部的狀態(tài)欄應(yīng)指示MAXQ Serial to JTAG,旁邊有一黃燈。但是,如果指示Disconnected,旁邊帶有灰燈,就要通過選擇Target,隨后選擇菜單中的Connect MAXQ Serial to JTAG來連接串口-JTAG板。void main(void) { int i = 0; int j = 0; int k = 1; LCRA = 0x03E0; // Set LCD configuration LCFG = 0xF3; // Set up all segments as outputs, normal operation // mode, and enable display. while (1) { for (i = 0; i < 500; i++) { for (j = 0; j < 500; j++) { // delay loop } } k = (k << 1); if (k == 64) { k = 1; } LCD0 = k; LCD1 = k; LCD2 = k; LCD3 = k; } }
一旦串口-JTAG板連接就緒后,選擇Build,然后選擇菜單的Build and Run,以創(chuàng)建并執(zhí)行工程代碼。在輸出窗口應(yīng)出現(xiàn)以Verify Completed為結(jié)尾的一串消息;MAXQ2000評(píng)估板上的LCD段顯示器應(yīng)該隨著代碼的運(yùn)行而顯示變換信息。
上述代碼演示了MAXQ CrossWorks的多種功能。第一,MAXQ2000的所有寄存器都在包含文件MAXQ2000.h中預(yù)先定義。CrossWorks出廠時(shí)在目錄%Program Files%Rowley Associates LimitedCrossWorks MAXQ 1.0include下包含該文件。工程編譯時(shí)自動(dòng)搜索該目錄,所以不必將MAXQ2000.h復(fù)制到包含工程的目錄下。
工程里包含MAXQ2000.h文件后,代碼就可以直接通過C語(yǔ)言訪問所有MAXQ2000內(nèi)部寄存器,如上所述,這些寄存器為L(zhǎng)CRA、LCFG、LCD0、LCD1、LCD2和LCD3。MAXQ2000支持的全部系統(tǒng)和外設(shè)寄存器列表參見MAXQ2000用戶指南補(bǔ)充資料 (English only)。
注意:名稱中包含內(nèi)置括號(hào)的寄存器,如A[0]和DP[0],在CrossWorks中必須用帶下劃線的名稱引用,如A_0和DP_0。另外,可能不能直接用C代碼設(shè)置獨(dú)立的寄存器位,例如,不允許出現(xiàn)IMR.0 = 0的情況。
MAXQ2000評(píng)估板的功能
在進(jìn)一步了解CrossWorks調(diào)試器之前,我們?cè)賱?chuàng)建一個(gè)更復(fù)雜的應(yīng)用程序,來展示MAXQ2000評(píng)估板的一些功能。本實(shí)例代碼可以下載。本應(yīng)用程序在LCD上顯示運(yùn)行的計(jì)數(shù)器值,象秒表一樣進(jìn)行連續(xù)遞增或遞減計(jì)數(shù)。計(jì)數(shù)器值達(dá)到19999 (LCD可顯示的最大值)時(shí)反轉(zhuǎn)。MAXQ2000評(píng)估板上的兩個(gè)按鈕編程為本應(yīng)用程序的控制開關(guān):
- 按SW5使計(jì)數(shù)器值復(fù)位至0000。
- 按SW4使計(jì)數(shù)器反向。如果原先遞增計(jì)數(shù),將變?yōu)檫f減計(jì)數(shù),反之亦然。如果計(jì)數(shù)值低于0,就反轉(zhuǎn)到19999。
現(xiàn)在可以演示MAXQ2000評(píng)估板的一個(gè)更有用的性能,即復(fù)位(RESET)按鈕。在MAXQ2000評(píng)估板的左下側(cè)有一個(gè)標(biāo)注為SW2和RESET的開關(guān)。按下此按鈕,觀察LCD屏。讀數(shù)應(yīng)該立即從0重新開始。該RESET按鈕連接至MAXQ2000的復(fù)位引腳。如果需要重新啟動(dòng)應(yīng)用程序,就按此按鈕。
初始化MAXQ2000的LCD控制器
MAXQ2000提供一個(gè)液晶顯示(LCD)硬件控制模塊,可運(yùn)行在全偏壓、1/2偏壓和1/3偏壓模式下,實(shí)現(xiàn)靜態(tài)、x2、x3或x4復(fù)用顯示方式。也就是說,在x4復(fù)用顯示器上,MAXQ2000-RAX (COM0到COM3,SEG0到SEG32)上可專用于LCD驅(qū)動(dòng)功能的37條線最多可驅(qū)動(dòng)132個(gè)LCD段(33段X 4個(gè)公共信號(hào))。每個(gè)打開的LCD段都需要連續(xù)的電壓波形來驅(qū)動(dòng),該電壓波形由連接該段的段線和公用信號(hào)線提供。驅(qū)動(dòng)電壓波形使各段按要求打開或關(guān)閉,而不會(huì)產(chǎn)生可能損壞LCD的直流偏壓。MAXQ2000的LCD控制器在后臺(tái)自動(dòng)產(chǎn)生這些電壓波形。也就是說,當(dāng)LCD的顯示段發(fā)生改變時(shí),只需要修改LCD控制器的寄存器內(nèi)容。
如上例,第一步是初始化用于控制顯示的LCD控制器寄存器。
void initLCD(void) { LCRA = 0x03E0; // Set LCD configuration LCFG = 0xF3; // Set up all segments as outputs, normal operation // mode, and enable display. }LCRA寄存器控制3項(xiàng)重要功能:顯示形式,本例中為靜態(tài);VADJ和地之間的可調(diào)電阻,用來修改顯示對(duì)比度;以及LCD段驅(qū)動(dòng)波形的頻率。LCFG寄存器控制LCD控制器的開/關(guān),并控制哪些兩用引腳作為端口引腳使用,哪些用作LCD段。
向顯示器寫入數(shù)值
各LCD段分別由一個(gè)LCD控制顯示寄存器的一位進(jìn)行控制,與使用的LCD類型和多路復(fù)用方式無關(guān)。此位置高就打開(黑)該段;清除此位就關(guān)閉(透明)該段。我們的MAXQ2000評(píng)估板所用的LCD段與存儲(chǔ)器映射關(guān)系,如圖6所示。圖6. LCD段與LCD顯示存儲(chǔ)寄存器位的映射關(guān)系
LCD的各位占用一個(gè)LCD顯示存儲(chǔ)寄存器,各個(gè)位的分布形式相同。因此,我們可以使用查找表,找到各位0到9的段寄存器值,并將該數(shù)值寫到LCD顯示寄存器。
#define LCD_PATTERN_0 0x03F #define LCD_PATTERN_1 0x006 #define LCD_PATTERN_2 0x05B #define LCD_PATTERN_3 0x04F #define LCD_PATTERN_4 0x066 #define LCD_PATTERN_5 0x06D #define LCD_PATTERN_6 0x07D #define LCD_PATTERN_7 0x007 #define LCD_PATTERN_8 0x07F #define LCD_PATTERN_9 0x067 int PATTERNS[] = { LCD_PATTERN_0, LCD_PATTERN_1, LCD_PATTERN_2, LCD_PATTERN_3, LCD_PATTERN_4, LCD_PATTERN_5, LCD_PATTERN_6, LCD_PATTERN_7, LCD_PATTERN_8, LCD_PATTERN_9 }; /****************************************************************************** * Returns the value that will need to be placed in one of LCD0-LCD3 to display * a digit 0-9. No bounds checking is done here. If you ask for a digit other * than 0-9, you will get a bogus display. */ int getLCDDigit(int digit) { return PATTERNS[digit]; }這些程序準(zhǔn)備好后,我們可以采用以下方法,向顯示器寫入計(jì)數(shù)器值(4位,特殊情況下“1”對(duì)應(yīng)第5位):
int show(int value) { if (value >= 10000) LCD4 = 0x40; else LCD4 = 0; LCD3 = getLCDDigit((value / 1000) % 10); LCD2 = getLCDDigit((value / 100) % 10); LCD1 = getLCDDigit((value / 10) % 10); LCD0 = getLCDDigit((value) % 10); return 0; }
去抖按鈕輸入
按鈕SW4和SW5是本應(yīng)用程序的另外兩個(gè)人機(jī)交互元件,分別通過DIP開關(guān)部件SW6與端口引腳P5.2和P7.1相連。(RESET開關(guān)不需要編程支持,它直接與MAXQ2000低電平有效復(fù)位引腳連接)。所有MAXQ2000端口引腳(對(duì)應(yīng)JTAG 接口的P4.0到P4.3除外)的上電缺省模式都為輸入模式,端口引腳和VDDIO之間具有內(nèi)部弱上拉。SW4和SW5開關(guān)的連接方式是當(dāng)按下時(shí)將端口引腳拉到地,因此端口引腳已經(jīng)是我們需要的配置方式了。端口引腳狀態(tài)可以非常簡(jiǎn)單地通過檢查端口引腳輸入位(SW4為PI5.2,SW5為PI7.1)來獲得;位值為0時(shí)表示按鈕按下,為1時(shí)表示按鈕松開。
然而,因?yàn)檫@些開關(guān)是機(jī)械結(jié)構(gòu)的,所以單次按下操作可能造成多次0到1的轉(zhuǎn)換。為避免這種情況發(fā)生,可以使用已有的主循環(huán)和延遲作為功能模塊,實(shí)現(xiàn)一些簡(jiǎn)單的去抖操作。
while(1) { for (i = 0; i < 32000; i++) { // just a delay loop } show(counter); if (((PI5 & 0x04) == 0) && (debounce1 == 0)) { inc *= -1; debounce1 = 20; } if (((PI7 & 0x02) == 0) && (debounce2 == 0)) { counter = 0; debounce2 = 20; } counter += inc; if (counter > 19999) { counter = 0; } if (counter < 0) { counter = 19999; } if ((debounce1 > 0) && ((PI5 & 0x04) == 0x04)) { debounce1--; } if ((debounce2 > 0) && ((PI7 & 0x02) == 0x02)) { debounce2--; } }當(dāng)開關(guān)由高變低時(shí),設(shè)置一個(gè)去抖計(jì)數(shù)器。開關(guān)的高狀態(tài)必須保持20個(gè)主計(jì)數(shù)器計(jì)數(shù)周期,才會(huì)接受下一次高向低的轉(zhuǎn)換。去抖計(jì)數(shù)器除提供開關(guān)去抖功能外,還保證了按鈕一直按下時(shí)不會(huì)重復(fù)功能操作;開關(guān)必須松開以重新按下。
使用CrossWorks調(diào)試器
因程序已經(jīng)在MAXQ2000上運(yùn)行,我們可以檢查CrossWorks調(diào)試系統(tǒng)的功能。向MAXQ2000加載代碼的JTAG接口還支持許多硬件調(diào)試功能。包括以下一些示例:- 指令單步執(zhí)行
- 執(zhí)行地址斷點(diǎn)(可以同時(shí)有4個(gè)有效斷點(diǎn))
- 直接讀寫寄存器
- 代碼和棧存儲(chǔ)器瀏覽
- 數(shù)據(jù)存儲(chǔ)器瀏覽和直接編輯
CrossWorks使用這些硬件調(diào)試功能提供C和匯編級(jí)源代碼調(diào)試,具有完備的調(diào)試功能,如設(shè)置斷點(diǎn)、觀察變量和寄存器,以及存儲(chǔ)器瀏覽和編輯模式。要進(jìn)行程序調(diào)試,首先選擇Build,接著選擇菜單中的Build and Debug。將進(jìn)行應(yīng)用程序編譯、下載到MAXQ2000評(píng)估板,最終在main()函數(shù)(見圖7)內(nèi)停止運(yùn)行。
圖7. CrossWorks調(diào)試模式
在圖7中可看到CrossWorks調(diào)試器的多項(xiàng)功能。
- 頁(yè)面左邊有一個(gè)黃色箭頭表示當(dāng)前的執(zhí)行位置。所有可執(zhí)行位置(不包括注釋、空白區(qū)和一些括號(hào))由左邊的藍(lán)色三角形示出。
- 局部變量和它們的值也在應(yīng)用代碼的右側(cè)示出。這些值可通過點(diǎn)擊數(shù)值和輸入新值來進(jìn)行編輯。
- Step Into (F11)執(zhí)行一行,可以單步執(zhí)行代碼。如果該行含有函數(shù)調(diào)用,將單步進(jìn)入該函數(shù),轉(zhuǎn)到該函數(shù)的開始位置。
- Step Over (F10)也是執(zhí)行一行,如果該行不包括函數(shù)調(diào)用的話。如果有函數(shù)調(diào)用,則連續(xù)執(zhí)行該函數(shù)(執(zhí)行該函數(shù),而不是跳過它),并在該函數(shù)調(diào)用的下一行停止。
- Step Out (Shift+F11)只能在某一函數(shù)(不是最上層函數(shù)main())內(nèi)使用。該功能將連續(xù)執(zhí)行完該函數(shù)的其余部分,停在調(diào)用該函數(shù)行的下一行。
- Run to Cursor (Control+F10)執(zhí)行到光標(biāo)所在位置。光標(biāo)必須處在可執(zhí)行代碼行上,才能使用該功能。
- Break命令(Control+".")將使應(yīng)用程序立即停止運(yùn)行,無論當(dāng)時(shí)處在什么位置。
- 左鍵單擊任何可執(zhí)行代碼行的藍(lán)色三角標(biāo)記,可在應(yīng)用程序的相應(yīng)位置設(shè)置斷點(diǎn)。這樣藍(lán)色三角形會(huì)變成紅色圓圈。應(yīng)用程序運(yùn)行到斷點(diǎn)后會(huì)停止運(yùn)行,并重新進(jìn)入調(diào)試模式。程序停止或運(yùn)行時(shí)可以設(shè)置或清除多達(dá)4個(gè)斷點(diǎn)。(注意,因?yàn)椴煌牟竭M(jìn)調(diào)試功能占用一個(gè)斷點(diǎn),如果采用單步調(diào)試模式,只能設(shè)置3個(gè)斷點(diǎn))。
在調(diào)試模式下,有3種不同方法查看應(yīng)用程序:
-
li>源代碼模式(Control+T, S)僅以C代碼形式顯示程序。
- 匯編模式(Control+T, A)以匯編語(yǔ)言方式顯示。單步執(zhí)行和斷點(diǎn)功能可以用于單個(gè)匯編行。
- 交錯(cuò)模式(Control+T, I) (見圖8)在同一個(gè)窗口內(nèi)同時(shí)顯示C和匯編代碼。
圖8. 在交互模式下進(jìn)行調(diào)試
使用寄存器窗口
應(yīng)用程序在調(diào)試模式下停止運(yùn)行時(shí),可以查看并直接編輯MAXQ2000的寄存器(見圖9)。要打開該顯示窗口,選擇Debug,再選擇菜單中的Debug Windows和Registers (1,2,3,4)。可快速瀏覽4個(gè)不同寄存器窗口;通過點(diǎn)擊左上部的組(Groups)圖標(biāo),可以配置窗口以顯示不同組的寄存器。圖9. 寄存器窗口
使用Call Stack (堆棧使用)窗口
另一個(gè)調(diào)試窗口顯示了應(yīng)用程序當(dāng)前的堆棧使用情況(見圖10)。該窗口列出了到達(dá)代碼當(dāng)前執(zhí)行點(diǎn)的所有調(diào)用函數(shù)。當(dāng)前正在執(zhí)行的函數(shù)顯示在列表最后,調(diào)用當(dāng)前函數(shù)的上一個(gè)函數(shù)顯示在上一行。依次類推,一直按這一顯示模式進(jìn)行顯示,最后是main()顯示在第一行。要打開此窗口,選擇Debug,再選擇Debug Windows,最后選擇Call Stack,或者按下Control+Alt+S。圖10. Call Stack窗口
使用變量和觀察窗口
Debug和Debug Windows菜單中還提供其它調(diào)試窗口。Locals和Globals窗口分別顯示局部變量(當(dāng)前函數(shù)或顯示范圍內(nèi))值和全局變量值。局部變量顯示窗口見上面圖7。還有一個(gè)Watch窗口,不僅可以用來顯示變量值,而且可以顯示任意C表達(dá)式的值(見圖11)。然而,這些表達(dá)式中不能有MAXQ2000寄存器??梢远x4個(gè)Watch窗口,每個(gè)都有獨(dú)自的變量和表達(dá)式列表。圖11. 觀察(Watch)窗口
查看代碼和數(shù)據(jù)存儲(chǔ)器
存儲(chǔ)器窗口(選擇Debug,再選擇Debug Windows,最后選擇Memory (1,2,3,4))可以進(jìn)行配置,以顯示任意代碼段和數(shù)據(jù)存儲(chǔ)器的當(dāng)前值。這些值在每步執(zhí)行后或者停在斷點(diǎn)處時(shí)都將更新(見圖12)。另外,可直接點(diǎn)擊數(shù)據(jù)存儲(chǔ)器值并輸入新值進(jìn)行編輯。圖12. 數(shù)據(jù)存儲(chǔ)器窗口
支持選項(xiàng)
MAXQ平臺(tái)提供多種支持選項(xiàng)。Dallas Semiconductor開發(fā)者管理著一個(gè)在線討論論壇 (English only),回答用戶提出的問題。該論壇也是開發(fā)者的新聞發(fā)布窗口,它包含最新的可用工具信息和其它感興趣的問題。對(duì)不適合公開討論的問題,Dallas Semiconductor工程師們提供兩個(gè)email地址。
- micro.software@dalsemi.com (English only)由軟件工程師管理,他們可以幫助解決MAXQ微控制器的編程問題,對(duì)使用如Rowley Associates'的CrossWorks等軟件工具提供幫助。
- micro.support@dalsemi.com (English only)由應(yīng)用工程師管理,他們可以協(xié)助解決電路中使用MAXQ微控制器碰到的硬件和設(shè)計(jì)問題。
故障排除
使用任何新器件時(shí)都會(huì)碰到一些常見問題。通過檢查本文檔前半部分的操作說明,許多問題可以迎刃而解(如電路板連接和工程配置)。下面是另外一些常見問題和解決方法。Problem | Possible Solution |
When I compile my application, I get an "undeclared identifier" error each place I use a MAXQ2000 register. |
Make sure you have the line #include at the start of your application. |
When I select Connect MAXQ Serial to JTAG, I get a "Device is not responding" error. | Make sure: that both boards are connected and powered up; that the JTAG cable connects with the red wire going to pin 1 on both sides; and that jumpers P2 (on the Serial-to-JTAG board) and JU11 (on the MAXQ2000 board) are both closed. |
When I select Connect MAXQ Serial to JTAG, I get a "Cannot open serial link" error. | Make sure no other software is using the COM port you have selected. Often, PDA software will own the serial port from the time you boot your computer. You can either choose a different COM port, or turn off your PDA software. |
The LCD segments are scrambled when I run the demo application. | Make sure that the LCD daughterboard is hanging off the top side of the MAXQ2000 Evaluation kit, not in the position where it hangs downward over the center of the board. |
結(jié)論
MAXQ2000是功能強(qiáng)大的低成本、低功耗微控制器,具備支持多種應(yīng)用系統(tǒng)的豐富外設(shè)。在Rowley Associates提供的MAXQ開發(fā)環(huán)境CrossWorks的支持下,可以用C語(yǔ)言編寫復(fù)雜應(yīng)用程序,并借助這個(gè)強(qiáng)大的工具進(jìn)行調(diào)試。這樣,可快速向市場(chǎng)推出高質(zhì)量的產(chǎn)品。
評(píng)論
查看更多