Kl25-ch04(第一個(gè)樣例程序及工程組織)_第1頁(yè)
Kl25-ch04(第一個(gè)樣例程序及工程組織)_第2頁(yè)
Kl25-ch04(第一個(gè)樣例程序及工程組織)_第3頁(yè)
Kl25-ch04(第一個(gè)樣例程序及工程組織)_第4頁(yè)
Kl25-ch04(第一個(gè)樣例程序及工程組織)_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章第一個(gè)樣例程序及工程組織主要內(nèi)容:4.1通用I/O接口基本概念及連接方法4.2端口控制模塊與GPIO模塊的編程結(jié)構(gòu)4.3GPIO驅(qū)動(dòng)構(gòu)件封裝方法與驅(qū)動(dòng)構(gòu)件封裝規(guī)范4.4第一個(gè)C語(yǔ)言工程:控制小燈閃爍4.5工程文件組織框架與第一個(gè)C語(yǔ)言工程分析4.6第一個(gè)匯編語(yǔ)言工程:控制小燈閃爍4.7本章小結(jié)14.1通用I/O接口基本概念及連接方法1.I/O接口的概念

I/O接口,即輸入輸出接口,是微控制器同外界進(jìn)行交互的重要通道,實(shí)現(xiàn)MCU與外部設(shè)備的數(shù)據(jù)交換。

在嵌入式系統(tǒng)中,接口種類繁多,有顯而易見的人機(jī)交互接口,如操縱桿、鍵盤、顯示器;也有無人介入的接口,如網(wǎng)絡(luò)接口、機(jī)器設(shè)備接口2.通用I/O(GPIO)所謂通用I/O,也記為GPIO(GeneralPurposeI/O),即基本的輸入/輸出,有時(shí)也稱并行I/O,或普通I/O,它是I/O的最基本形式。MCU內(nèi)部程序可以對(duì)通用I/O的端口寄存器進(jìn)行讀寫來實(shí)現(xiàn)開關(guān)量的輸入輸出操作,且大多數(shù)通用I/O引腳可以通過編程來設(shè)定其工作方式為輸入或輸出,稱之為雙向通用I/O。23.上拉下拉電阻與輸入引腳的基本接法輸入引腳有三種不同的連接方式:帶上拉電阻的連接、帶下拉電阻的連接和“懸空”連接。

若MCU的某個(gè)引腳通過一個(gè)電阻接到電源(Vcc)上,這個(gè)電阻被稱為“上拉電阻”。與之相對(duì)應(yīng),若MCU的某個(gè)引腳通過一個(gè)電阻接到地(GND)上,則相應(yīng)的電阻被稱為“下拉電阻”。懸空的芯片引腳被上拉電阻或下拉電阻初始化為高電平或低電平。34.輸出引腳的基本接法

作為通用輸出引腳,MCU內(nèi)部程序向該引腳輸出高電平或低電平來驅(qū)動(dòng)器件工作,即開關(guān)量輸出。如圖所示。其中O1引腳是發(fā)光二極管LED的驅(qū)動(dòng)引腳,當(dāng)O1引腳輸出高電平時(shí),LED不亮;當(dāng)O1引腳輸出低電平時(shí),LED點(diǎn)亮。O2引腳接蜂鳴器驅(qū)動(dòng)電路,當(dāng)O2腳輸出高電平時(shí),蜂鳴器響;O2腳輸出低電平時(shí),蜂鳴器不響。44.2.1端口控制模塊

KL25的大部分引腳具有復(fù)用功能,可以通過端口控制模塊(Portcontrolandinterrupts,PORT)提供的寄存器編程指定其為某一具體功能。PORT模塊內(nèi)含3類寄存器,分別是:引腳控制寄存器(PinControlRegister),全局引腳控制寄存器(GlobalPinControlRegister)、中斷狀態(tài)標(biāo)志寄存器(InterruptStatusFlagRegister)。4.2端口控制模塊與GPIO模塊的編程結(jié)構(gòu)51.寄存器映像地址分析

KL25芯片有5個(gè)端口A~E。每個(gè)端口有32個(gè)引腳控制寄存器PORTx_PCRn(其中x=A~E,n=0~31),2個(gè)全局引腳控制寄存器(PORTx_GPCLR、PORTx_GPCHR)、1個(gè)中斷狀態(tài)標(biāo)志寄存器(PORTx_ISFR)。以下地址分析計(jì)算均為16進(jìn)制,略去十六進(jìn)制前綴“0x”不寫。

每個(gè)端口有32個(gè)引腳控制寄存器PORTx_PCRn。端口x的基地址=4004_9000+x*1000(x=A~E,對(duì)應(yīng)0~4)。端口x的每個(gè)引腳控制寄存器PORTx_PCRn的地址為=4004_9000+x*1000+n*4(x=A~E,對(duì)應(yīng)0~4,n=0~31)。例如PORTA_PCR1的地址為:4004_9000+0*1000+1*4=4004_9004。6每個(gè)端口有2個(gè)全局引腳控制寄存器。全局引腳控制寄存器(低)PORTx_GPCLR,地址=4004_9080+x*1000(x=A~E,對(duì)應(yīng)0~4);全局引腳控制寄存器(高)PORTx_GPCHR,地址=4004_9084+x*1000(x=A~E,對(duì)應(yīng)0~4)。每個(gè)端口的有1個(gè)中斷狀態(tài)標(biāo)志寄存器。地址=4004_90A0+x*1000(x=A~E,對(duì)應(yīng)0~4)。72.相關(guān)名詞解釋(1)模擬引腳是指不能夠配置成GPIO的引腳叫做模擬引腳(Analogpin),如RESET、EXTAL及XTAL等引腳。(2)數(shù)字引腳是指能夠被配置成GPIO的引腳叫做數(shù)字引腳(Digitalpin)。(3)無源濾波器(Passivefilter)是由電容器、電抗器和電阻器適當(dāng)組合而成,并兼有無功補(bǔ)償和調(diào)壓功能的濾波器。(4)引腳驅(qū)動(dòng)能力(DriveStrength)是指引腳放出或吸入電流的承受能力,一般用mA單位度量。(5)轉(zhuǎn)換速率(Slewrate)是指電壓在高低電平間轉(zhuǎn)換的時(shí)間間隔,一般用ns單位度量。(6)數(shù)字輸入/輸出(Digitalinput/output)是指芯片引腳只能輸入/輸出高電平(邏輯1)和低電平(邏輯0)兩個(gè)電壓值。(7)引腳復(fù)用槽(Pinmuxingslot)是指信號(hào)復(fù)用裝置與引腳之間的接口,引腳通過連接不同的信號(hào)復(fù)用槽可以配置成不同的功能。(8)W1C是指對(duì)某位寫1而使得該位清0,俗稱寫1清0。83.引腳控制寄存器(PORTx_PCRn)每個(gè)端口的每個(gè)引腳均有一個(gè)對(duì)應(yīng)的引腳控制寄存器,可以配置引腳中斷或DMA傳輸請(qǐng)求,可以配置引腳為GPIO功能或其他功能,可以配置是否啟用上拉或下拉,可以配置選擇輸出引腳的驅(qū)動(dòng)強(qiáng)度,可以配置選擇輸入引腳是否使用內(nèi)部濾波等。其中“X”表示復(fù)位后狀態(tài)不確定。有關(guān)功能說明請(qǐng)見教材P65-P6694.全局引腳控制寄存器每個(gè)端口的全局引腳控制寄存器有兩個(gè),分別為PORTx_GPCLR、PORTx_GPCHR,為只寫寄存器,讀出總為0。每個(gè)寄存器的高16位被稱為全局引腳寫使能字段(GlobalPinWriteEnable,GPWE),低16位被稱為全局引腳寫數(shù)據(jù)字段(GlobalPinWriteData,GPWD)。KL25芯片每個(gè)端口有32個(gè)引腳控制寄存器,分為兩組:低引腳控制寄存器組(15~0)和高引腳控制寄存器組(31~16),全局引腳控制寄存器PORTx_GPCLR批配置低引腳控制寄存器組(15~0),而全局引腳控制寄存器PORTx_GPCHR配置高引腳控制寄存器組(31~16)。這樣可以實(shí)現(xiàn)一次配置16個(gè)功能相同的引腳,提高了編程效率。全局引腳控制寄存器不能配置引腳控制寄存器的高16位,因此,不能使用該功能配置引腳中斷。105.中斷狀態(tài)標(biāo)志寄存器(PORTx_ISFR)數(shù)字引腳模式下,每個(gè)引腳的中斷模式可以獨(dú)立配置,在引腳控制寄存器IRQC字段可配置選擇:中斷禁止(復(fù)位后默認(rèn));高電平、低電平、上升沿、下降沿、沿跳變觸發(fā)中斷;上升沿、下降沿、沿跳變觸發(fā)DMA請(qǐng)求。支持低功耗模式下喚醒。每個(gè)端口的中斷狀態(tài)標(biāo)志寄存器(PORTx_ISFR),對(duì)應(yīng)32個(gè)引腳,相應(yīng)位為1,表明配置的中斷已經(jīng)被檢測(cè)到,反之沒有。各位具有寫1清0特性。114.2.2GPIO模塊1.KL25的GPIO引腳

80引腳封裝的KL25芯片的GPIO引腳分別記為PORTA、PORTB、PORTC、PORTD、PORTE共5個(gè)端口,共含61個(gè)引腳。端口作為GPIO引腳時(shí),邏輯1對(duì)應(yīng)高電平,邏輯0對(duì)應(yīng)著低電平。

(1)PORTA口有10個(gè)引腳,分別為PTA1~2、PTA4~5、PTA12~17;

(2)PORTB口有12個(gè)引腳,分別為PTB0~3、PTB8~11、PTB16~19;

(3)PORTC口有16個(gè)引腳,分別為PTC0~13、PTC16~17;

(4)PORTD口有8個(gè)引腳,分別為PTD0~7;

(5)PORTE口有15個(gè)引腳,分別為PTE0~5、PTE20~25、PTE29~31。122.GPIO寄存器

每個(gè)GPIO口均有6個(gè)寄存器,5個(gè)GPIO口共有30個(gè)寄存器。PORTA、PORTB、PORTC、PORTD、PORTE各口寄存器的基地址分別為400F_F000h、400F_F040h、400F_F0080h、400F_F0C0h、400F_F100h,所以各口基地址相差40h。

各GPIO口的6個(gè)寄存器分別是數(shù)據(jù)輸出寄存器、輸出置1寄存器、輸出清0寄存器、輸出反轉(zhuǎn)寄存器、數(shù)據(jù)輸入寄存器、數(shù)據(jù)方向寄存器。其中輸出寄存器的地址就是口的基地址,其他寄存器的地址依次加4。所有寄存器均為32位寬度,復(fù)位時(shí)均為0000_0000h。13其他各口功能與編程方式完全一致,只是相應(yīng)寄存器名與寄存器地址不同,其中寄存器名只要把其中的PORTA口“A”子字母分別改為B、C、D、E即可獲得,地址按上述給出的規(guī)律計(jì)算。144.2.3GPIO基本編程步驟與舉例1.GPIO基本編程步驟

要使芯片某一引腳為GPIO功能,并定義為輸入/輸出,隨后進(jìn)行應(yīng)用,基本編程步驟如下:(1)通過端口控制模塊(PORT)的引腳控制寄存器PORTx_PCRn的引腳復(fù)用控制字段(MUX)設(shè)定其為GPIO功能(即令MUX=0b001);(2)通過GPIO模塊相應(yīng)口的“數(shù)據(jù)方向寄存器”來指定相應(yīng)引腳為輸入或輸出功能。若指定位為0,則為對(duì)應(yīng)引腳輸入;若指定位為1,則為對(duì)應(yīng)引腳輸出。(3)若是輸出引腳,則通過設(shè)置“數(shù)據(jù)輸出寄存器”來指定相應(yīng)引腳輸出低電平或高電平,對(duì)應(yīng)值為0或1。亦可通過“輸出置位寄存器”、“輸出清位寄存器”、“輸出取反寄存器”改變引腳狀態(tài),參見表4-1中關(guān)于寄存器的說明。(4)若是輸入引腳,則通過“數(shù)據(jù)輸入寄存器”獲得引腳的狀態(tài)。若指定位為0,表示當(dāng)前該引腳上為低電平;若為1,則為高電平。152.理解GPIO基本編程步驟舉例

舉例說明:設(shè)PORTB口的19腳接一個(gè)發(fā)光二極管,低電平點(diǎn)亮?,F(xiàn)在要點(diǎn)亮這個(gè)發(fā)光二極管,步驟如下:(1)計(jì)算給出PORTB19引腳控制寄存器地址從4.2.1節(jié)的端口控制模塊可知,PORTB端口的引腳控制寄存器基地址為0x4004A000u,其中后綴u表示無符號(hào)數(shù),給出不優(yōu)化的32位指針變量portB_ptr:

volatileuint_32*portB_ptr=(uint_32*)0x4004A000u;PORTB19引腳控制寄存器地址=基地址+偏移量:volatileuint_32*portB_PCR_19=portB_ptr+19;這里是19,而不是19*4,由于定義了32位指針,portB_ptr加1相當(dāng)于地址加4。portB_ptr加19代表了portB_ptr地址加上19*4。16(2)計(jì)算給出PORTB的數(shù)據(jù)方向寄存器、輸出寄存器的地址PORTB端口(作為GPIO功能)的基地址為0x400FF040u:

volatileuint_32*gpioB_ptr=(uint_32*)0x400FF040u;參考表4-1,PORTB的數(shù)據(jù)方向寄存器地址=基地址+偏移量,PORTB的數(shù)據(jù)輸出寄存器地址=基地址+偏移量:volatileuint_32*portB_PDDR=gpioB_ptr+5;volatileuint_32*portB_PDO=gpioB_ptr+0;(3)設(shè)置PORTB19引腳為GPIO引腳即令相應(yīng)引腳控制寄存器的10-8位(MUX字段)為0b001,其他位使用默認(rèn)0:

*portB_PCR_19=0x00000100;(4)通過令PORTB的方向寄存器相應(yīng)位為1,定義PORTB19引腳為輸出

*portB_PDDR|=(1<<19);(5)通過PORTB的輸出寄存器相應(yīng)位賦0,使PORTB19引腳輸出低電平

*portB_PDO&=~(1<<19);174.3.1制作GPIO驅(qū)動(dòng)構(gòu)件的必要性及GPIO驅(qū)動(dòng)構(gòu)件封裝要點(diǎn)分析

1.制作GPIO驅(qū)動(dòng)構(gòu)件的必要性將軟件構(gòu)件技術(shù)應(yīng)用到嵌入式軟件開發(fā)中,可以大大提高嵌入式開發(fā)的開發(fā)效率與穩(wěn)定性,可以使軟件具有更好的開放性、通用性和適應(yīng)性。特別是對(duì)于底層硬件的驅(qū)動(dòng)編程,只有封裝成底層驅(qū)動(dòng)構(gòu)件,才能減少重復(fù)勞動(dòng),使開發(fā)者專注于應(yīng)用軟件穩(wěn)定性與功能設(shè)計(jì)上。以KL25的GPIO為例,它有61個(gè)引腳可以作為GPIO,分布在5個(gè)端口,使用直接地址去操作相關(guān)寄存器無法實(shí)現(xiàn)軟件移植與復(fù)用。應(yīng)該把對(duì)GPIO引腳的操作封裝成構(gòu)件,通過函數(shù)調(diào)用與傳參的方式實(shí)現(xiàn)對(duì)引腳的干預(yù)與狀態(tài)獲取,這樣的軟件才便于維護(hù)與移植。同時(shí),底層驅(qū)動(dòng)構(gòu)件的封裝,也為在操作系統(tǒng)下對(duì)底層硬件的操作提供了基礎(chǔ)。

4.3GPIO驅(qū)動(dòng)構(gòu)件封裝方法與驅(qū)動(dòng)構(gòu)件封裝規(guī)范182.GPIO驅(qū)動(dòng)構(gòu)件封裝要點(diǎn)分析

GPIO驅(qū)動(dòng)構(gòu)件可以實(shí)現(xiàn)對(duì)所有GPIO的引腳統(tǒng)一編程,GPIO驅(qū)動(dòng)構(gòu)件由gpio.h、gpio.c兩個(gè)文件組成,如要使用GPIO驅(qū)動(dòng)構(gòu)件,只需要將這兩個(gè)文件加入到所建工程中,由此方便了對(duì)GPIO的編程操作。其中所包含的函數(shù)及入口參數(shù)如下:1)模塊初始化(gpio_init)由于引腳具有復(fù)用特性,把應(yīng)引腳設(shè)置成GPIO功能;同時(shí)定義成輸入或輸出;若是輸出,還要給出初始狀態(tài)。所以GPIO模塊初始化函數(shù)的參數(shù)為哪個(gè)端口、端口的哪個(gè)引腳、是輸入還是輸出、若是輸出其狀態(tài)是什么,函數(shù)不必有返回值。這樣GPIO模塊初始化函數(shù)原型可以設(shè)計(jì)為:

voidgpio_init(uint_8port,uint_8pin,uint_8dir,uint_8state)2)設(shè)置引腳狀態(tài)(gpio_set)對(duì)于輸出,希望通過函數(shù)設(shè)置引腳是高電平(邏輯1)還是低電平(邏輯0),入口參數(shù)應(yīng)該是哪個(gè)端口、端口的哪個(gè)引腳,函數(shù)不必有返回值。這樣設(shè)置引腳狀態(tài)的函數(shù)原型可以設(shè)計(jì)為:

voidgpio_set(uint_8port,uint_8pin,uint_8state)193)獲得引腳狀態(tài)(gpio_get)對(duì)于輸入,希望通過函數(shù)獲得引腳的狀態(tài)是高電平(邏輯1)還是低電平(邏輯0),入口參數(shù)應(yīng)該是哪個(gè)端口、端口的哪個(gè)引腳,函數(shù)需要返回值引腳狀態(tài)。這樣設(shè)置引腳狀態(tài)的函數(shù)原型可以設(shè)計(jì)為:

uint_8gpio_get(uint_8port,uint_8pin)4)引腳狀態(tài)反轉(zhuǎn)(voidgpio_reverse)類似的分析,可以設(shè)計(jì)引腳狀態(tài)反轉(zhuǎn)函數(shù)的原型為:

voidgpio_reverse(uint_8port,uint_8pin)5)引腳上下拉使能函數(shù)(voidgpio_pull)若引腳被設(shè)置成輸入,還可以設(shè)定內(nèi)部上下拉,KL25內(nèi)部上下拉電阻大小為20~50K?。引腳上下拉使能函數(shù)的原型為:voidgpio_pull(uint_8port,uint_8pin,uint_8pullselect)204.3.2底層驅(qū)動(dòng)構(gòu)件封裝規(guī)范概要與構(gòu)件封裝的前期準(zhǔn)備

1.底層驅(qū)動(dòng)構(gòu)件封裝規(guī)范概要1)底層驅(qū)動(dòng)構(gòu)件的組成、存放位置與內(nèi)容所有底層驅(qū)動(dòng)構(gòu)件放在工程文件夾的“Drivers”文件夾中,以構(gòu)件名命名。每個(gè)構(gòu)件由頭文件(.h)與源文件(.c)文件兩個(gè)獨(dú)立文件組成,放在以構(gòu)件名命名的文件夾中。驅(qū)動(dòng)構(gòu)件頭文件(.h)中僅包含對(duì)外接口函數(shù)的聲明,是構(gòu)件的使用指南?;疽笫钦{(diào)用者只看頭文件即可使用構(gòu)件。對(duì)外接口函數(shù)及內(nèi)部函數(shù)的實(shí)現(xiàn)在構(gòu)件源程序文件(.c)中。同時(shí)應(yīng)注意,頭文件聲明對(duì)外接口函數(shù)的順序與源程序文件實(shí)現(xiàn)對(duì)外接口函數(shù)的順序應(yīng)保持一致。源程序文件中內(nèi)部函數(shù)的聲明,放在外接口函數(shù)代碼的前面,內(nèi)部函數(shù)的實(shí)現(xiàn)放在全部外接口函數(shù)代碼的后面,以便提高可閱讀性與可維護(hù)性。21

2)制作構(gòu)件的最基本要求(1)考慮使用與移植方便。(2)要有統(tǒng)一、規(guī)范的編碼風(fēng)格與注釋。(3)宏的使用限制。(4)不使用全局變量。

2.構(gòu)件封裝的前期準(zhǔn)備具體內(nèi)容見構(gòu)件公共要素文件。該文件放在工程文件夾的“\Common”文件夾下,分別名為common.h和common.c。1)KL25芯片寄存器映射文件2)位操作宏函數(shù)3)重定義基本數(shù)據(jù)類型224.3.3KL25的GPIO驅(qū)動(dòng)構(gòu)件及解析GPIO驅(qū)動(dòng)構(gòu)件存放于網(wǎng)上光盤“..\SD-FSL-KL25-Component\gpio”文件夾1.GPIO驅(qū)動(dòng)構(gòu)件頭文件(gpio.h)在GPIO驅(qū)動(dòng)構(gòu)件的頭文件(gpio.h)中包含的內(nèi)容有:頭文件說明;防止重復(fù)包含的條件編譯代碼結(jié)構(gòu)“#ifndef...#define...#endif”;用宏定義方式統(tǒng)一了使用的端口名稱(PORTA、PORTB、PORTC、PORTD、PORTE);給出5個(gè)對(duì)外服務(wù)函數(shù)的接口說明及聲明,函數(shù)包括引腳初始化函數(shù)(gpio_init)、設(shè)定引腳狀態(tài)函數(shù)(gpio_set)、獲取引腳狀態(tài)函數(shù)(gpio_get)、反轉(zhuǎn)引腳狀態(tài)函數(shù)(gpio_reverse)、引腳上下拉使能函數(shù)(voidgpio_pull)。

具體代碼見教材P72-P74或光盤“..\SD-FSL-KL25-Component\gpio\gpio.h”文件。232.GPIO驅(qū)動(dòng)構(gòu)件源程序文件(gpio.c)

GPIO驅(qū)動(dòng)構(gòu)件的源程序文件中實(shí)現(xiàn)的對(duì)外接口函數(shù),主要是對(duì)相關(guān)寄存器進(jìn)行配置,從而完成構(gòu)件的基本功能。構(gòu)件內(nèi)部使用的函數(shù)也在構(gòu)件源程序文件中定義。具體代碼見教材P74-P76或光盤“..\SD-FSL-KL25-Component\gpio\gpio.c”文件。3.GPIO驅(qū)動(dòng)構(gòu)件解析1)兩個(gè)結(jié)構(gòu)體類型在工程文件夾的芯片頭文件(“..\CPU\MKL25Z4.h”)中,有端口寄存器結(jié)構(gòu)體,把端口模塊的編程寄存器用一個(gè)結(jié)構(gòu)體類型(PORT_MemMap)封裝起來:24TypedefstructPORT_MemMap{uint32_tPCR[32];//引腳控制寄存器(0~31),偏移:0x0,間隔:0x4uint32_tGPCLR;//全局引腳控制寄存器(L),偏移:0x80uint32_tGPCHR;//全局引腳控制寄存器(H),偏移:0x84uint8_tRESERVED_0[24];//保留(占位)(0~23)

uint32_tISFR;//中斷狀態(tài)標(biāo)志寄存器,偏移:0xA0}volatile*PORT_MemMapPtr;同時(shí)定義了不優(yōu)化的PORT模塊寄存器結(jié)構(gòu)體指針(PORT_MemMapPtr),這樣,只要給出端口基地址,就可以使用該結(jié)構(gòu)體的成員變量,實(shí)現(xiàn)對(duì)各寄存器的訪問。類似,給出了GPIO模塊結(jié)構(gòu)體類型(GPIO_MemMap)及其指針:25TypedefstructGPIO_MemMap{uint32_tPDOR;//數(shù)據(jù)輸出寄存器,偏移:0x0uint32_tPSOR;//輸出置1寄存器,偏移:0x4uint32_tPCOR;//輸出清0寄存器,偏移:0x8uint32_tPTOR;.//輸出取反寄存器,偏移:0xCuint32_tPDIR;//數(shù)據(jù)輸入寄存器,偏移:0x10uint32_tPDDR;//數(shù)據(jù)方向寄存器,偏移:0x14/}volatile*GPIO_MemMapPtr;2)端口模塊及GPIO模塊各口基地址KL25的端口(PORT)模塊各口基地址:PORTA_BASE_PTR、PORTB_BASE_PTR、PORTC_BASE_PTR、PORTD_BASE_PTR、PORTE_BASE_PTR在芯片頭文件中以宏常數(shù)方式給出。KL25的GPIO模塊各口基地址PTA_BASE_PTR、PTB_BASE_PTR、PTC_BASE_PTR、PTD_BASE_PTR、PTE_BASE_PTR也在芯片頭文件中以宏常數(shù)方式給出,本程序直接作為指針常量。263)編程與注釋風(fēng)格希望仔細(xì)分析本構(gòu)件的編程與注釋風(fēng)格,一開始就規(guī)范起來,這樣就會(huì)逐步鍛煉起良好的編程習(xí)慣。特別是,不要編寫令人難以看懂的程序,不要把簡(jiǎn)單問題復(fù)雜化,不要使用不必要的宏274.4第一個(gè)C語(yǔ)言工程:控制小燈閃爍本書用KL25控制發(fā)光二極管指示燈的例子開始程序之旅,程序中使用了GPIO驅(qū)動(dòng)構(gòu)件來編寫指示燈程序。當(dāng)指示燈兩端引腳上有足夠高的正向壓降時(shí),它就會(huì)發(fā)光。在本書的工程實(shí)例中,燈的正端引腳接KL25的GPIO口,負(fù)端引腳通過電阻接地。當(dāng)在I/O引腳上輸出高或低電平時(shí),指示燈就會(huì)亮或暗。SD-FSL-KL25-EVB硬件板上有個(gè)三色燈,分別是PORTB19=紅燈、PORTB18=綠燈、PORTB9=藍(lán)燈。4.4.1Light構(gòu)件設(shè)計(jì)與測(cè)試工程主程序1.Light構(gòu)件的頭文件light.h(P78-P79)2.Light構(gòu)件的程序文件light.c(P79)3.Light構(gòu)件測(cè)試工程主程序(P79-P80)284.4.2Codewarrior開發(fā)環(huán)境(CW10.3)簡(jiǎn)介及簡(jiǎn)明操作1.CW10.3的簡(jiǎn)介與安裝本書使用的嵌入式軟件集成開發(fā)平臺(tái)件平臺(tái)是:飛思卡爾公司的CodeWarriorDevelopmentStudiov10.3集成開發(fā)環(huán)境(以下簡(jiǎn)稱CW10.3)。CW10.3提供了工程管理、源程序編輯、編譯、連接、下載調(diào)試等功能。為了使本書讀者快速進(jìn)入CW10.3,本書網(wǎng)上光盤的“..\Document”文件夾中提供了含有“CW10.3簡(jiǎn)明操作指南.pdf”,同時(shí)該文件夾中還提供了硬件評(píng)估板的“SD-FSL-KL25-EVB用戶手冊(cè).pdf”,希望初次使用CW10.3進(jìn)行KL25的實(shí)踐讀者,務(wù)必認(rèn)真閱讀后再進(jìn)行實(shí)踐操作,可以避免不少的困惑。CW10.3環(huán)境的運(yùn)行界面如圖:29302.相關(guān)驅(qū)動(dòng)的安裝使用SD-FSL-KL25-EVB,在安裝好CW10.3后,還需安裝網(wǎng)上光盤的“..\Tools”內(nèi)的相關(guān)驅(qū)動(dòng)程序:(1)TTL-USB串口線的驅(qū)動(dòng)(2)SD-FSL-KL25-EVB評(píng)估板上的KL25編程器驅(qū)動(dòng)程序(3)KL25編程器補(bǔ)丁安裝包3.初次在CW10.3環(huán)境下快速導(dǎo)入工程、編譯、下載程序4.運(yùn)行程序5.遇到問題的解決辦法6.幾個(gè)常用操作

以上3-6點(diǎn)請(qǐng)參考教材P82-P83或“SD-FSL-KL25-EVB用戶手冊(cè).pdf”第三、第四章的內(nèi)容。314.5工程文件組織框架與第一個(gè)C語(yǔ)言工程分析嵌入式系統(tǒng)工程包含若干文件,包括程序文件、頭文件、與編譯調(diào)試相關(guān)的文件、工程說明文件、開發(fā)環(huán)境生成文件等,文件眾多,合理組織這些文件,規(guī)范工程組織,可以提高項(xiàng)目的開發(fā)效率、提高閱讀清晰度、提高可維護(hù)性、降低維護(hù)難度。工程組織應(yīng)體現(xiàn)嵌入式軟件工程的基本原則與基本思想。324.5.1CW10.3開發(fā)環(huán)境下工程文件組織框架右圖給出以Light工程為例的樹形工程結(jié)構(gòu)模板,物理組織與邏輯組織一致。該模板是蘇州大學(xué)飛思卡爾嵌入式中心為在CW環(huán)境下開發(fā)ARMCortex-M4/M0+KinetisK/L系列MCU應(yīng)用工程而制作的。331.工程名與新建工程不必在意工程名,而使用工程文件夾標(biāo)識(shí)工程,不同工程文件夾就區(qū)別不同工程。建議新工程文件夾使用手動(dòng)復(fù)制標(biāo)準(zhǔn)模板工程文件夾或復(fù)制功能更少的舊工程的方法來建立,這樣,復(fù)用的構(gòu)件已經(jīng)存在。2.工程文件夾內(nèi)的基本內(nèi)容工程文件夾內(nèi)共含8個(gè)下級(jí)文件夾,分別是Common、CPU、Doc、Drivers、FLASH、Project_Settings、Source、SwComponent。其簡(jiǎn)明功能及特點(diǎn)見下表。344.5.2鏈接文件“..\Project_Settings\Linker_Files”文件夾內(nèi)的intflash.ld文件被稱為鏈接腳本文件,簡(jiǎn)稱鏈接文件,可在工程環(huán)境下打開查看,一般不必更改。鏈接文件描述了相關(guān)文件按什么順序鏈接在一起,生成輸出機(jī)器碼文件.elf。給出了程序放在何地址、常數(shù)放在何地址、堆棧大小及地址范圍等信息。教材P85,表4-3給出了KL25-Light工程的intflash.ld文件的簡(jiǎn)要分析;P86中則有對(duì)此表內(nèi)容的說明。354.5.3機(jī)器碼文件CW10.3開發(fā)平臺(tái),針對(duì)KL系列MCU,運(yùn)行arm-elf-gcc編譯器,在編譯鏈接過程中生成針對(duì)ARMCPU的.elf格式可執(zhí)行代碼,同時(shí)也可生成.hex格式的機(jī)器碼。.hex(IntelHEX)文件是由一行行符合IntelHEX文件格式的文本所構(gòu)成的ASCII文本文件,在IntelHEX文件中,每一行包含一個(gè)HEX記錄,這些記錄由對(duì)應(yīng)機(jī)器語(yǔ)言碼(含常量數(shù)據(jù))的十六進(jìn)制編碼數(shù)字組成。在CW10.3環(huán)境下,直接雙擊可查看該文件。361.記錄格式

.hex文件中的語(yǔ)句有六種不同類型的語(yǔ)句,但總體格式是一樣的,如下表372.實(shí)例分析以KL25-Light工程中的KL25prg.hex為例,進(jìn)行簡(jiǎn)明分析。截取第一個(gè)實(shí)例工程的“.hex”文件的部分行進(jìn)行分解,

(1)分析第1行,以“:”開始,長(zhǎng)度為“0x10”(16個(gè)字節(jié)),“0000”表示相對(duì)地址,緊接著的“00”代表記錄類型為數(shù)據(jù)類型,接下來的就是數(shù)據(jù)段“0030002005060000550A00005D0A0000”,該數(shù)據(jù)段存放在偏移地址為“0000”的存儲(chǔ)區(qū)的機(jī)器操作碼,也就是說,只有這些數(shù)據(jù)被寫入到Flash存儲(chǔ)區(qū)。38這里的hex文件中,數(shù)據(jù)部分是以“小端”的方式存儲(chǔ)的,在這種格式中,字的低字節(jié)存儲(chǔ)在低地址中,而字?jǐn)?shù)據(jù)的高字節(jié)存放在高地址中,第1個(gè)4字節(jié)“00300020”,實(shí)際表示的數(shù)據(jù)內(nèi)容為“20003000”,就是堆棧棧頂(=RAM最高地址+1),這4個(gè)字節(jié)也就是中斷向量表中開始內(nèi)容(占用了0號(hào)中斷位置),其內(nèi)容在MCU啟動(dòng)時(shí)被放入堆棧寄存器SP中。接下來的4個(gè)字節(jié)“05060000”→“00000605”(參見第45行),占用中斷向量表1號(hào)中斷位置,其內(nèi)容其內(nèi)容在MCU啟動(dòng)時(shí)被放入程序堆棧計(jì)數(shù)器PC中,也就是開始執(zhí)行代碼的存放處,即為啟動(dòng)函數(shù)Startup在Flash中存放的開始地址(可以從“.map”文件、“.lst”文件找到相應(yīng)信息進(jìn)行理解)。(2)從第1行后半部開始至12行,是中斷向量表,從第13行開始是程序記錄。(3)第220行(最后一行)為文檔的結(jié)束記錄,記錄類型為“0x01”;“0xFF”為本記錄的校驗(yàn)和字段內(nèi)容。394.5.4其他相關(guān)文件功能簡(jiǎn)介1.中斷向量及服務(wù)例程文件(vector.h、vector.c、isr.h、isr.c)位于“..\CPU”文件夾下的vector.h、vector.c文件及“..\Sources”文件夾下的isr.h、isr.c文件是中斷處理相關(guān)文件.

2.啟動(dòng)文件(startup.c)啟動(dòng)文件一般不需修改。該文件位于“..\Project_Settings\Startup_Code”文件夾下,是CW10.3環(huán)境下KL25工程啟動(dòng)文件。在startup.c文件中給出了startup函數(shù)源代碼。403.總頭文件與主程序文件(includes.h、main.c)總頭文件includes.h是main.c使用的頭文件,內(nèi)含外部函數(shù)引用、常量、全局變量聲明以及外部變量引用。main.c文件是工程任務(wù)的核心文件,main函數(shù)即在該文件中實(shí)現(xiàn)。在main函數(shù)中包含了一個(gè)永久循環(huán),對(duì)具體事務(wù)過程的操作幾乎都是添加在該主循環(huán)中,含有操作系統(tǒng)下編程的調(diào)度作用。4.內(nèi)核及芯片頭文件(MKL25Z4.h)在MKL25Z4.h文件中,給出了KL25芯片專用的寄存器地址映射,由芯片廠家提供。需要注意的是,針對(duì)某一款芯片進(jìn)行開發(fā)時(shí),有專用的寄存器映射文件,由芯片設(shè)計(jì)人員提供,一般嵌入式應(yīng)用開發(fā)者不必修改該文件。

5..map文件、.lst文件.map文件與.lst文件位于“..\FLASH”文件夾,由編譯鏈接產(chǎn)生。.map文件提供了查看程序、堆棧設(shè)置、全局變量、常量等存放的地址信息。.lst文件提供了函數(shù)編譯后,機(jī)器碼與源代碼的對(duì)應(yīng)關(guān)系,用于程序分析。414.5.5芯片內(nèi)電啟動(dòng)執(zhí)行過程

1.中斷向量表存放位置的分析理解通過查看工程文件夾中“..\Project_Settings\Linker_Files\intflash.ld”文件及“..\CPU\vectors.c”文件可得出48個(gè)中斷向量的占位符號(hào)的存儲(chǔ)地址,具體分析請(qǐng)見教材P89-P91。

2.中斷向量表內(nèi)容的理解中斷向量表第1行“&__BOOT_STACK_ADDRESS”,即0x00000000-0x00000003地址內(nèi)容為:0x20003000(在鏈接文件中)。第2行“BOOT_START,”,即地址0x00000004-0x00000007地址內(nèi)容為:?jiǎn)?dòng)函數(shù)startup的首地址。隨后地址依次存放各中斷例程的起始地址。423.程序執(zhí)行過程分析1)芯片上電

2)SP=Flash中0x00000000地址的第一個(gè)表項(xiàng)內(nèi)容

3)PC=之后第二個(gè)表項(xiàng)內(nèi)容

4)startup.c(禁用看門狗、復(fù)制中斷向量表至RAM、清零未初始化BSS數(shù)據(jù)段、將ROM中的初始化數(shù)據(jù)拷貝到RAM中、初始化系統(tǒng)時(shí)鐘、使能端口時(shí)鐘、進(jìn)入主函數(shù)main)434.6第一個(gè)匯編語(yǔ)言工程:控制小燈閃爍匯編語(yǔ)言編程給人的第一種感覺就是難,相對(duì)于C語(yǔ)言編程,匯編在編程的直觀性、編程效率、以及可讀性等方面都有所欠缺,但掌

溫馨提示

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

評(píng)論

0/150

提交評(píng)論