jtag防鎖死和lm3s系列幾個(gè)基本例程_第1頁
jtag防鎖死和lm3s系列幾個(gè)基本例程_第2頁
jtag防鎖死和lm3s系列幾個(gè)基本例程_第3頁
jtag防鎖死和lm3s系列幾個(gè)基本例程_第4頁
jtag防鎖死和lm3s系列幾個(gè)基本例程_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、目 錄第 1 章1.11.21.31.41.51.61.7幾個(gè)基本例程1空的 main( )函數(shù)1實(shí)用工程模板1LED 閃爍發(fā)光6輸出o world7UART 控制臺(tái)10利用 Windows 超級(jí)終端調(diào)試 UART11使用 ROM 庫編程17i第幾個(gè)基本例程本章將講解幾個(gè)最基本的 Slaris 系列 ARM 例程,作為初者的入范例。空的 m in( )函數(shù)一個(gè)最簡單的C 語言程序是什么呢?程序清單 1.1 給出了經(jīng)典的答案,就 空的 main( )1.1函,什么也不做。序1.1 C 語言經(jīng) 的空m in( )函數(shù)我們注意到,在程序清單 1. 里,main( )函數(shù)原型是“main(void)”

2、,即參數(shù)為 void、返回類型為,這是標(biāo)準(zhǔn)的格式,具有非常好的兼容性,不會(huì)出現(xiàn)編譯警告。今后,在我們的例程中,都將采用這一格式。在典的 main( )函數(shù)里,要明確地用 return 語句返回?cái)?shù)值 0,用來通知操作系統(tǒng)(或者是其它的上一層調(diào)用者是正常的返回。但是,在嵌入式系統(tǒng)程里 main( )函數(shù)往往不允許返回,尤其是在不使用操作系統(tǒng)的場合下,如果執(zhí)行了返回操作則可能引起程序跑飛或死機(jī)。因此,在針對(duì) Slaris 系列 ARM程的 main( )函數(shù)里,我們做了一個(gè)改動(dòng):刪除 return 語句,并安排一個(gè) for 死循環(huán)(也可以是 while(1)死循環(huán)),永遠(yuǎn)不返回,如程序單 1.2 所

3、示。1.2 S lari 系列 main( )函數(shù) 本形式序1.實(shí)用工程模板在周立功單片機(jī)網(wǎng)站“ ”提供有IAR EWARM開發(fā)環(huán)境的實(shí)用工程模板“Demo”。有了該Demo例程,我們就不需要從頭開始一步步新建工程,因?yàn)檫@樣太繁瑣了,而是直接通過修改Demo工程來編寫用戶程序。程序清單 1.3 列出了Demo工程里程序文件“main.c”、“systemInit.h”和“systemInit. ”的全部內(nèi)容。序1.3 實(shí)用 程模板 Demo文 :main.c1nclude sy teni h/ 主 數(shù)(程 入口)ma (void)ma n oidr ; )ma n oid)re u (0);文

4、件:systemInit h文件:systemInit.c2#include systemInit h/ 定義全局的系統(tǒng)時(shí)鐘變量unsigned long TheSysClock = 12000000UL;/ 定義 KEY#define KEY_PERIPHSYSCTL_PERIPH_GPIOG#define KEY_PORTGPIO_PORTG_BASE#define KEY_PINGPIO_PIN_5#ifndef SYSTEM_INIT_H #define SYSTEM_INIT_H / 包含必要的頭文件 #include #include #include #include #incl

5、ude #include / 將較長的標(biāo)識(shí)符定義成較短的形式#define SysCtlPeriEnableSysCtlPeripheralEnable #define SysCtlPeriDisable SysCtlPeripheralDisable #define GPIOPypeInGPIOPypeGPIOInput #define GPIOPypeOut GPIOP ypeGPIOOutput #define GPIOPypeODGPIOPypeGPIOOutputODextern unsigned long TheSysClock;/ 聲明全局的系統(tǒng)時(shí)鐘變量extern void j

6、tagWait(void);/ 防止JTAG 失效extern void clockInit(void);/ 系統(tǒng)時(shí)鐘初始化#endif / SYSTEM_INIT_H jtagWait( );/ 防止JTAG 失效,重要!clockInit( );/ 時(shí)鐘初始化:晶振,6MHzfor (;)因?yàn)槭悄0宄绦?,所以?main( )函數(shù)里只做了兩件事情:預(yù)防 JTAG 連接失效、系統(tǒng)時(shí)鐘初始化,接著是 for 死循環(huán)。下面,讓我們來詳細(xì)分析這個(gè)實(shí)用模版程序。1 驅(qū)動(dòng)庫頭文件包含我們用的是基于Slaris 外設(shè)驅(qū)動(dòng)庫的編程方法。在整個(gè)驅(qū)動(dòng)庫里,頭文件“hw_type.h”和“hw_memmap.h

7、”處于基礎(chǔ)性的地位,基本上在每個(gè)例程里都要包含它們。其中前綴“hw_”表示 hardware(硬件)。另外幾個(gè)頭文件是關(guān)于中斷控制、系統(tǒng)控制和 GPIO3/ 防止JTAG 失效void jtagWait(void)SysCtlPeriEnable(KEY_PERIPH);/ 使能KEY 所在的 GPIO 端口GPIOPypeIn(KEY_PORT, KEY_PIN);/ 設(shè)置KEY 所在管腳為輸入if (GPIOPinRead(KEY_PORT, KEY_PIN) = 0 x00)/ 若復(fù)位時(shí)按下KEY,則進(jìn)入for (;);/ 死循環(huán),以等待JTAG 連接SysCtlPeriDisable(

8、KEY_PERIPH);/ 禁止KEY 所在的 GPIO 端口/ 系統(tǒng)時(shí)鐘初始化void clockInit(void)SysCtlLDOSet(SYSCTL_LDO_2_50V);/ 設(shè)置LDO 輸出電壓SysCtlClockSet(SYSCTL_USE_OSC |/ 系統(tǒng)時(shí)鐘設(shè)置SYSCTL_OSC_MAIN |/ 采用主振蕩器SYSCTL_XTAL_6MHZ |/ 外接 6MHz 晶振SYSCTL_SYSDIV_1);/ 不分頻/*SysCtlLDOSet(SYSCTL_LDO_2_75V);/ 配置 PLL 前須將 LDO 設(shè)為 2.75VSysCtlClockSet(SYSCTL_U

9、SE_PLL | / 系統(tǒng)時(shí)鐘設(shè)置,采用PLL SYSCTL_OSC_MAIN |/ 主振蕩器SYSCTL_XTAL_6MHZ |/ 外接 6MHz 晶振SYSCTL_SYSDIV_10);/ 分頻結(jié)果為 20MHz*/TheSysClock = SysCtlClockGet( );/ 獲取當(dāng)前的系統(tǒng)時(shí)鐘頻率的,極為常用。表 1.1 給出了這些頭文件的解釋。在后續(xù)章節(jié)里,我們會(huì)對(duì)每個(gè)功能模塊進(jìn)行詳細(xì)講解。表 1.1 Demo 例的頭文件2 名稱太長的問題在調(diào)用Slaris 外設(shè)驅(qū)動(dòng)庫里的函數(shù)時(shí),我們發(fā)現(xiàn)函數(shù)名稱或者參數(shù)名稱往往過長,這給實(shí)際應(yīng)用帶來了一些不便。比如,庫函數(shù) SysCtlPeri

10、pheralDeepSleepEnable( )的名稱長達(dá) 31 個(gè)字母!如果取較為簡短的名稱 SysCtlPeriDSlpEnable( ),函數(shù)的功能仍然可以“顧名思義”,而且使用起來也要方便得多。因此,在實(shí)際編程時(shí),我們有必要重新把這些超長的標(biāo)識(shí)符名稱定義得簡短一些。3 必須要預(yù)防 JTAG 失效JTAG 是一種國際標(biāo)準(zhǔn)測試協(xié)議(IEEE 1149.1 兼容),主要用于芯片內(nèi)部測試。現(xiàn)在多數(shù)的高級(jí)器件都支持 JTAG 協(xié)議,如 ARM、DSP、FPGA 等。標(biāo)準(zhǔn)的 JTAG 接口是 4 根線:測試模式選擇 TMS、測試時(shí)鐘 TCK、測試數(shù)據(jù)輸出 TDO,測試數(shù)據(jù)輸入 TDI。在實(shí)際系統(tǒng)中

11、可能還有測試復(fù)位 TRST,低電平有效。我們調(diào)試 S laris 系列 ARM 一般都采用 JTAG 接口。傳統(tǒng)的接口方式是電腦打印機(jī)并口轉(zhuǎn) JTAG,但現(xiàn)在很多電腦尤其是筆記本已經(jīng)沒有并口了,這對(duì)電子工程師來說可能會(huì)很不方便。在 EasyARM1138 開發(fā)板上內(nèi)嵌了 USB 轉(zhuǎn) JTAG 的硬件調(diào)試接口,實(shí)際上是 S laris系列 ARM 專用仿真器 LM LINK 的簡化版,因此調(diào)試起來會(huì)非常方便。但是,在調(diào)試過程中有可能偶爾出現(xiàn)芯片的 JTAG 接口連接失效的問題,即遇到用調(diào)試器再也無法連接的情況。導(dǎo)致芯片 JTAG 接口連接失效的原因有多種,如與 JTAG 接口復(fù)用的 GPIO 管

12、腳被占用、程序中已啟用看門狗定時(shí)器(總是在不斷復(fù)位,干擾調(diào)試)等等,但最常見的原因還是與 JTAG 接口復(fù)用的 GPIO 管腳被占用,從而導(dǎo)致上電后 JTAG 調(diào)試器來不及與芯片連接。表 1.2 列出了與 JTAG 接口復(fù)用的 GPIO 管腳。表 1.2 與 JTAG 接口復(fù)用的 GPIO 管腳4GPIO 管腳對(duì)應(yīng)的 JTAG 接口PB7/TRSTPC0TCKPC1TMSPC2TDIPC3TDO頭文件解釋hw_types h硬件類型定義:包括對(duì)布爾類型t、硬件寄存器訪問 HWREG( )等的定義hw_memmap.h硬件存儲(chǔ)器映射:包括對(duì)全部片內(nèi)外設(shè)模塊寄存器集的基址定義hw_ s h硬件中斷

13、定義:包括對(duì)所有中斷源的定義errupt.h中斷控制頭文件:包括中斷控制相關(guān)的庫函數(shù)原型聲明等sysctl h系統(tǒng)控制頭文件:包括系統(tǒng)控制模塊庫函數(shù)原型聲明、參數(shù)宏定義等gpio hGPIO 頭文件:包括 GPIO 模塊庫函數(shù)原型聲明、參數(shù)宏定義等如果出現(xiàn)JTAG接口連接失效的情況,可以通過LMFlashProgrammer編程工具軟件來解鎖。該軟件可以在廣州周立功單片機(jī)網(wǎng)站“htt”或Luminary Micro官”下載到。解鎖操作的具體步驟是:方網(wǎng)站“運(yùn)行 LMFlashProgrammer 軟件,把 JTAG Speed(Hz)調(diào)到 100,000 以下;點(diǎn)擊在 Flash Utilti

14、es 選項(xiàng)卡里的 Erase 按鈕進(jìn)行擦除操作,看能否恢復(fù)連接;如果不行,則切換到 Other Utilties 選項(xiàng)卡,在 Debug Port Unlock 復(fù)選框里選擇芯片的家族:LM3S1000 以下的為 Sandstorm(沙暴)家族,LM3S1000 以上的為 Fury(狂暴)和 DustDevil(塵魔)家族;先按住復(fù)位鍵不松手,再點(diǎn)擊 Other Utilties 選項(xiàng)卡里的 Unlock 按鈕進(jìn)行解鎖操作;操作完成后重新復(fù)位芯片即完成解鎖操作,同時(shí)片內(nèi) Flash 內(nèi)容也被擦除。需要當(dāng)心的是:對(duì)于 Sandstorm 家族(即 LM3S100、300、600、800 等),一

15、旦 JTAG接口因?yàn)檎`將其無防護(hù)地配置為 GPIO 接口而被鎖定,則有可能再也無法恢復(fù)。為了防患于未然,我們建議在編寫每一個(gè)應(yīng)用程序時(shí)都必須要在 main( )函數(shù)的開始處插入一段能夠預(yù)防 JTAG 失效的代碼(對(duì)于 Fury 和 DustDevil 家族也推薦這樣做)。在 Demo 例程中jtagWait( )函數(shù)就是預(yù)防 JTAG 失效的范例代碼,請認(rèn)真參考。該函數(shù)的工作原理是:將能夠有效預(yù)防 JTAG 失效的函數(shù) jtagWait( )插入到 main( )函數(shù)的開始處;芯片正常復(fù)位時(shí),由于 KEY 沒有被按下,因此會(huì)直接運(yùn)行后面的代碼,即 jtagWait( )函數(shù)不影響正常的操作;當(dāng)

16、需要 JTAG 連接時(shí),先按住 KEY 不松手,再復(fù)位,則程序進(jìn)入一個(gè)死循環(huán),以等待 JTAG 連接,在此狀態(tài)下連接是非常可靠的。有了 jtagWait( )函數(shù)的保障,我們就可以放心大膽地使用與 JTAG 接口復(fù)用的 GPIO 了,不必?fù)?dān)心 JTAG 接口再被鎖死的問題了!另外,我們還可以充分利用 JTAG 接口的這一特性來為自己的程序加密,以防非法復(fù)制。4 時(shí)鐘配置方法S laris 系列 ARM 支持多種系統(tǒng)時(shí)鐘來源,如外接晶振、內(nèi)部振蕩器、內(nèi)部 PLL 等。在 Demo 例程中 clockInit( )函數(shù)給出了采用外部 6MHz 晶振和采用內(nèi)部 PLL 的典型配置方法。程序默認(rèn)的配置

17、是外接 6MHz 晶振,PLL 配置部分被“/*.*/”注釋掉了,如果要啟用 PLL 可去掉注釋。在 clockInit( )函數(shù)里,庫函數(shù) SysCtlLDOSet( )的作用是設(shè)置 LDO 的輸出電壓。LDO 是 “Low Drop-Out”的縮寫,是片內(nèi)集成的低壓差線性穩(wěn)壓器,這就為用戶節(jié)省了一個(gè)外部的電源穩(wěn)壓器。LDO 輸出電壓在 2.25 2.75V 之間,步進(jìn) 50mV, 可通過調(diào)用庫函數(shù) SysCtlLDOSet( )來設(shè)置。LDO 輸出一般會(huì)直接連到VDD25 管腳(有的型號(hào)是在內(nèi)部連接的),為處理器內(nèi)核提供穩(wěn)定可靠的電源。芯片內(nèi)部有個(gè) PLL(鎖相環(huán))單元,能夠把輸入的較低頻

18、率時(shí)鐘信號(hào)鎖定到 200MHz輸出。當(dāng)然處理器內(nèi)核最高只能工作在 50MHz,因此必須要進(jìn)行 4 以上的分頻。但是,要當(dāng)心:在啟用 PLL 之前必須要把 LDO 輸出電壓設(shè)置在最高的 2.75V。這是因?yàn)?PLL 單元會(huì)消耗較大的功率,再加上芯片其它的功耗,如果 LDO 電壓不夠高就容易造成死機(jī)。clockInit( )函數(shù)在最后會(huì)將設(shè)置好的系統(tǒng)時(shí)鐘頻率保存到全局變量 TheSysClock 里,這可以提供給程序的其它部分利用。51.3LED 閃爍發(fā)光如圖 1.1 所示,為 Slaris 系列 GPIO 管腳直接驅(qū)動(dòng)小功率 LED(Light-Emitting Diode,發(fā)光二極管)的電路,

19、要注意串聯(lián)在 LED 上的限流電阻不可省略。圖 1.1 GPIO 驅(qū)動(dòng)小功率 LED程序清單 1.4 是控制 LED 閃爍發(fā)光的簡單例程。該程序?qū)嶋H上是實(shí)用工程模板 Demo的一個(gè)應(yīng)用,直接從 main( )函數(shù)開始編寫。在 main( )函數(shù)的前面,定義了 LED 所在的 GPIO 端口和管腳??刂?LED 分 3 步走:調(diào)用函數(shù) SysCtlPeriEnable( )使能 LED 所在的 GPIO 模塊;調(diào)用函數(shù) GPIOPypeOut( )配置 LED 所在的 GPIO 管腳為推挽輸出;調(diào)用函數(shù)GPIOPinWrite( )對(duì)LED 所在的 GPIO 管腳寫 0 和寫 1 來控制 LED

20、 的亮滅,并在中間插入函數(shù) SysCtlDelay( )進(jìn)行延時(shí)控制,以達(dá)到閃爍發(fā)光的效果。程序1.4 LED 閃爍發(fā)光文件:main.c6#include systemInit h/ 定義LED#define LED_PERIPHSYSCTL_PERIPH_GPIOG#define LED_PORTGPIO_PORTG_BASE#define LED_PINGPIO_PIN_2/ 主函數(shù)(程序入口)main(void)jtagWait( );/ 防止 JTAG 失效,重要!clockInit( );/ 時(shí)鐘初始化:晶振,6MHzSysCtlPeriEnable(LED_PERIPH);/ 使

21、能LED 所在的 GPIO 端口GPIOPypeOut(LED_PORT, LED_PIN);/ 設(shè)置LED 所在管腳為輸出for (;)GPIOPinWriED_PORT, LED_PIN, 0 x00);/ 點(diǎn)亮LEDSysCtlDelay(150 * (TheSysClock / 3000);/ 延時(shí)約 150msGPIOPinWriED_PORT, LED_PIN, 0 xFF);/ 熄滅LEDSysCtlDelay(850 * (TheSysClock / 3000);/ 延時(shí)約 850ms1.4輸出o world在 K&R 兩位作者的The C Programming Langua

22、ge一書中第一個(gè)范例就是輸出“o,world”,其本身只是程序的輸出字符,但是由于這本書的經(jīng)典以及作者的聲望,后來這個(gè) o world 幾乎成為了所以程序設(shè)計(jì)語言的第一個(gè)范例。程序清單 1.5 給出了一個(gè)經(jīng)典的 C語言o world 例程版本。程序1.5 C 語言經(jīng)典o world 例程在嵌入式 C 語言里,往往更喜歡用 spr f( )函數(shù)來代替 pr f( ),這兩個(gè)函數(shù)的用法非常類似,區(qū)別是 spr f( )多了一個(gè) char *參數(shù),用來存放格式化輸出結(jié)果,而不是直接輸出到標(biāo)準(zhǔn)輸出設(shè)備(通常是監(jiān)視器)。在嵌入式系統(tǒng)里,輸出設(shè)備類型非常多,比如數(shù)碼管、 UART、LCD、CRT 顯示器等

23、等,很難統(tǒng)一。先把結(jié)果放入一個(gè)緩沖區(qū)里,然后再根據(jù)情況選擇合適的輸出設(shè)備顯示結(jié)果,這是個(gè)比較好的選擇。程序清單 1.6 是Slaris 系列一個(gè)輸出例程。程序運(yùn)行后,除了通過 UART 端口輸出o world 的例程,仍然套用實(shí)用工程模板 Demoo world 以外,還以 16 進(jìn)制格式輸出數(shù)值23456。跟經(jīng)典的o world 有所不同的是,在輸出字符串時(shí)采用rn(回車換行)來代替n(換行),這樣做更加規(guī)范、兼容性更好。在該例程中,采用 UART 端口作為輸出設(shè)備。利用Slaris 外設(shè)驅(qū)動(dòng)庫來配置 UART非常簡單,詳見 uartInit(這里采用的 UART2。)這個(gè)函數(shù)。在 Slar

24、is 系列 ARM 里通常有 13 個(gè) UART 端口,程序1.6Slaris 系列o world 例程文件:main.c7#include systemInit h #include uartGetPut h #include / 主函數(shù)(程序入口)main(void)char s40;jtagWait( );/ 防止 JTAG 失效,重要!clockInit( );/ 時(shí)鐘初始化:晶振,6MHzuartInit( );/ UART 初始化spr f(s, o, worldrn);/ 輸出“o, world”到 s #include main(void)pr f(o, worldn); re

25、turn(0);uartPuts(s);/通過 UART 輸出 s 的內(nèi)容文件:uartGetPut h文件:uartGetP8#include uartGetPut h #include #include #include #include #include #include / UART 初始化void uartInit(void)SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);/ 使能 UART 模塊SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);/ 使能 RX/TX 所在的 GPIO 端口/ 配置 RX/T

26、X 所在管腳為 UART 收發(fā)功能GPIOPypeUART(GPIO_PORTG_BASE, GPIO_PIN_0 | GPIO_PIN_1);/ 配置 UART 端口,波特率 9600,數(shù)據(jù)位 8,停止位 1,無校驗(yàn) UARTConfigSet(UART2_BASE, 9600, UART_CONFIG_WLEN_8 |#ifndef UART_GET_PUT_H #define UART_GET_PUT_H extern void uartInit(void);/ UART 初始化extern void uartP(const char c);/ 通過 UART 發(fā)送一個(gè)字符 extern

27、 void uartPuts(const char *s); / 通過 UART 發(fā)送字符串 extern char uartGetc(void);/ 通過 UART 接收一個(gè)字符externuartGets(char *s,size);/ 通過 UART 接收字符串,回顯,/ 退格修改,回車結(jié)束#endif / UART_GET_PUT_H spr f(s, 23456 = 0 x%Xrn, 23456);/ 數(shù)據(jù)格式化,結(jié)果保存到s uartPuts(s);/ 通過 UART 輸出結(jié)果for (;)UART_CONFIG_STOP_ONE |9UART_CONFIG_PAR_NONE);U

28、ARTEnable(UART2_BASE);/ 使能 UART 端口/ 通過 UART 發(fā)送一個(gè)字符void uartP(const char c)UARTCharPut(UART2_BASE, c);/ 通過 UART 發(fā)送字符串void uartPuts(const char *s)while (*s != 0) uartP(*(s+);/ 通過 UART 接收一個(gè)字符char uartGetc(void)return(UARTCharGet(UART2_BASE);/ 功能:通過 UART 接收字符串,回顯,退格修改,回車結(jié)束/ 參數(shù):*s 保存接收數(shù)據(jù)的緩沖區(qū),只接收可打印字符(ASC

29、II 碼 32127)/size 是緩沖區(qū)*s 的總長度,要求size = 2(包括末尾0,建議用 sizeof( )來獲取)/ 返回:接收到的有效字符數(shù)目uartGets(char *s,size)char c;n = 0;*s = 0;if (size 2) return(0); size-;for (;)c = uartGetc( );/ 接收 1 個(gè)字符uatc(c);/ 回顯輸入的字符if (c = b)/ 遇退格修改if (n 0)1.5UART 控制臺(tái)我們已經(jīng)注意到,在程序清單 1.6 里有一個(gè) uartGets()函數(shù),該函數(shù)相當(dāng)實(shí)用,能夠從UART 讀入一個(gè)限制長度為 siz

30、e(包括末尾0)的字符串,按回車結(jié)束。在讀入的同時(shí)進(jìn)行回顯,如果輸入有誤,按退格鍵還可以進(jìn)行修改。程序清單 1.7 是一個(gè) UART 控制臺(tái)例程,展示了 uartGets( )函數(shù)的妙用。程序運(yùn)行后,輸入命令 on 會(huì)點(diǎn)亮 LED,輸入命令 off 會(huì)熄滅 LED。程序1.7 UART 控制臺(tái)例程文件:main.c10#include systemInit h #include uartGetPut h #include #include / 定義LED#define LED_PERIPHSYSCTL_PERIPH_GPIOG*(-s) = 0; n-;uartPuts( b);/ 顯示空格和

31、退格if (c = r)/ 遇回車結(jié)束uartPuts(rn);/ 顯示回車換行 break;if (n size)/ 如果小于長度限制if (nt(c)/ 如果接收到的是可打印字符*(s+) = c;/ 保存接收到的字符到緩沖區(qū)*s = 0; n+;return(n);/ 返回接收到的有效字符數(shù)目#defineLED_PORTGPIO_PORTG_BASE1.6利用 Windows 超級(jí)終端調(diào)試 UART在第 1.4 和 1.5 節(jié)里都用到了 UART 輸出,在調(diào)試?yán)虝r(shí)一般要接到電腦的 COM 串行口上(DB9 連接器)。對(duì)于 EasyARM1138 開發(fā)板,使用的是 USB 虛擬的 CO

32、M 端口,因此無須使用 DB9 連接器。因此本小節(jié)就有必要講解一下如何利用 Windows 附帶的超級(jí)終端來調(diào)試 UART 接口。11#define LED_PINGPIO_PIN_2/ 主函數(shù)(程序入口)main(void)char s40; size;jtagWait( );/ 防止 JTAG 失效,重要!clockInit( );/ 時(shí)鐘初始化:晶振,6MHzuartInit( );/ UART 初始化SysCtlPeriEnable(LED_PERIPH);/ 使能LED 所在的 GPIO 端口GPIOPypeOut(LED_PORT, LED_PIN);/ 設(shè)置LED 所在管腳為輸出

33、uartPuts(Please input ad with :rn);/ 請輸入一個(gè)命令,按回車執(zhí)行uartPuts(t on = LED turns onrn);/ 輸入on 點(diǎn)亮LEDuartPuts(t off = LED turns offrn);/ 輸入off 熄滅LEDfor (;)uartPuts(cmd);size = uartGets(s, sizeof(s);/ 從 UART 接收命令字符串if (size 0)if (!strcmp(s, on)/ 如果輸入onGPIOPinWriED_PORT, LED_PIN, 0 x00);/ 點(diǎn)亮LEDelse if (!strc

34、mp(s, off)/ 如果輸入off GPIOPinWriED_PORT, LED_PIN, 0 xFF); / 熄滅LEDelseuartPuts(Errordrn);/ 錯(cuò)誤命令uartPuts(OKrn);Windows 附件里的“超級(jí)終端”是個(gè)非常實(shí)用的應(yīng)用程序,可以用來調(diào)試電腦的 COM串行口,也能很好地支持通過 USB 虛擬的 COM 口。以下是超級(jí)終端配置 COM 端口的過程:1 查看 COM 端口鼠標(biāo)右擊“我的電腦”屬性硬件設(shè)備管理器,打開后可以查看到電腦的端口(COM和 LPT)情況,如圖 1.2 所示。通常可以選用 COM1 或COM2(以實(shí)際的硬件連接為準(zhǔn))。對(duì)于 Ea

35、syARM1138 開發(fā)板,要選用 USB 虛擬的 COM 接口(S laris Virtual COM Port),請先記下所要采用的 COM 編號(hào),在后續(xù)操作步驟里會(huì)用到。2 啟動(dòng)超級(jí)終端鼠標(biāo)點(diǎn)擊“開始”程序附件通訊超級(jí)終端,啟動(dòng)后的對(duì)話框如圖 1.3 所示。3 配置過程如圖 1.3 所示,點(diǎn)擊“取消”。然后請參考圖 1.4圖 1.12 進(jìn)行配置。圖 1.2 查看設(shè)備管理器 COM 端口12圖 1.3 啟動(dòng) Windows 超級(jí)終端圖 1.4 確認(rèn)取消:是圖 1.5 超級(jí)終端:確定13圖 1.6連接描述:填寫名稱并選擇自己喜歡的圖標(biāo)圖 1.7 位置信息:取消14圖 1.8 確認(rèn)取消:是圖

36、1.9 超級(jí)終端:確定圖 1.10 連接到:選擇 COM 端口15圖 1.11COM 屬性配置圖 1.12 另存到桌面快捷方式16最后一步是另存到桌面快捷方式,以方便下次直接使用。4 調(diào)試o world 例程如圖 1.13 所示,為調(diào)試第 1.4 小節(jié)輸出“o world”例程的運(yùn)行結(jié)果。圖 1.13o world 例程輸出結(jié)果1.7使用 ROM 庫編程Luminary Micro 從其第 3 代 Slaris 產(chǎn)品 DustDevil 家族開始,在芯片內(nèi)部獨(dú)立地集成了 ROM 存儲(chǔ)器(如圖 1.14 所示),更好的解決了 ISP 功能并增強(qiáng)程序的加密特性,同時(shí)還創(chuàng)新性地將Slaris 外設(shè)驅(qū)

37、動(dòng)庫固化在 ROM 當(dāng)中,這樣就把更多的 Flash 空間留給用戶使用。由于固化驅(qū)動(dòng)庫到 ROM 中節(jié)省了 FLASH 的成本,芯片的整體成本也將降低,也就提高了單片機(jī)的市場競爭力。用戶編程時(shí),只需要調(diào)用 ROM 中的 API 函數(shù)就可以操作外設(shè),非常簡便。圖 1.14 DustDevilROM 結(jié)構(gòu)示意圖驅(qū)動(dòng)庫函數(shù)固化在 ROM 當(dāng)中,好處有:大幅度節(jié)省用戶的 Flash 資源最大限度提高代碼密度加快程序執(zhí)行速度增強(qiáng)代碼安全性17這是 Luminary 免費(fèi)提供的,不存在版權(quán)問題(royalty-free)ROM 同時(shí)也是 Bootloader(支持 ISP 下載),提供 UART、I2C、

38、SSI 等多種接口那么我們在用 C 語言編寫應(yīng)用程序時(shí)如何使用 ROM 庫函數(shù)呢?在 Luminary Micro 官方發(fā)布的Slaris 外設(shè)驅(qū)動(dòng)庫里,提供有兩套功能幾乎完全相同的庫函數(shù)版本:原有的源程序版本,編譯后會(huì)占用 Flash 存儲(chǔ)器空間ROM 版本,以二進(jìn)制代碼形式固化在芯片內(nèi)部,獨(dú)立于 Flash 存儲(chǔ)器程序清單 1.8 給出了使用 ROM 庫編程的實(shí)際例子:LED 閃爍發(fā)光。用法其實(shí)很簡單,現(xiàn)在總結(jié)如下:首先要保證你所使用的芯片屬于 Luminary Micro 第 3 代產(chǎn)品 DustDevil(塵魔)家族,如 LM3S5749在程序的開頭做如下定義:以后在每個(gè)調(diào)用的庫函數(shù)名

39、上前綴“MAP_”就可以了還有另外一種用法是在每個(gè)庫函數(shù)名字上前綴“ROM_”。但是,前綴“MAP_”要比前綴“ROM_”可移植性好:用戶包含即使用 ROM 庫,不包含則自動(dòng)改用原來的庫函數(shù)。在 IAR 集成開發(fā)環(huán)境下,例程編譯無誤后我們通過查看工作區(qū)(WorkSpace)里的*.map文件就可以知道目標(biāo)代碼的大?。浩渲?readonly(只讀)是指 Flash 存儲(chǔ)器,readwrite(讀寫)是指 SRAM 存儲(chǔ)器。如果注釋掉對(duì)頭文件的包含(即不使用 ROM 庫函數(shù)),則查看到的*.map 是:由此可以得出采用 ROM 庫節(jié)省的 Flash 空間是:(1576384)(380276)129

40、6B。另外,要注意以下事項(xiàng):驅(qū)動(dòng)庫版本不能太舊,否則不會(huì)支持 ROM 庫特性(推薦采用 3223 以上版本)對(duì)于個(gè)別庫函數(shù) ROM 庫可能不支持,如 SysCtlDelay( )程序1.8 LED 閃爍發(fā)光(使用 ROM 庫)文件:main.c18#include systemInit h/ 定義LED#define LED_PERIPHSYSCTL_PERIPH_GPIOG#define LED_PORTGPIO_PORTG_BASE1 576 bytes of readonly code memory 380 bytes of readonly data memory1 028 bytes

41、 of readwrite data memory384 bytes of readonly code memory 276 bytes of readonly data memory1 028 bytes of readwrite data memory#define_IS_DUSTDEVIL_RA0/ 目標(biāo)器件是DustDevil 家族 A0 版本#include / 包含以使用 ROM 庫,若注釋掉本行則不使用 ROM 庫 #include / 包含,以后每個(gè)庫函數(shù)都可以前綴 MAP_#defineLED_PINGPIO_PIN_2文件:systemInit h19#ifndef SYS

42、TEM_INIT_H #define SYSTEM_INIT_H / 定義Luminary Micro 第三代產(chǎn)品DustDevil 家族(A0 版本)#define_IS_DUSTDEVIL_RA0/ 包含必要的頭文件 #include #include #include / 包含以使用 ROM 庫,若注釋掉本行則不使用 ROM 庫 #include / 包含,以后每個(gè)庫函數(shù)都可以前綴MAP_ #include #include #include #include / 將較長的標(biāo)識(shí)符定義成較短的形式#define MAP_SysCtlPeriEnableMAP_SysCtlPeripheralEnable #define MAP_SysCtlPeriDisableMAP_SysCtlPeripheralDisable #define MAP_GPIOPypeInMAP_GPIOPypeGPIOInput #define MAP_GPIOP ypeOutMAP_GPIOP ypeGPIOOutput/ 主函數(shù)(程序入口)main(void)jtagWait( );/ 防止JTAG 失效,重要!clo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論