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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

I/O接口,即輸入輸出接口,是微控制器同外界進行交互的重要通道,實現MCU與外部設備的數據交換。

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

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

作為通用輸出引腳,MCU內部程序向該引腳輸出高電平或低電平來驅動器件工作,即開關量輸出。如圖所示。其中O1引腳是發光二極管LED的驅動引腳,當O1引腳輸出高電平時,LED不亮;當O1引腳輸出低電平時,LED點亮。O2引腳接蜂鳴器驅動電路,當O2腳輸出高電平時,蜂鳴器響;O2腳輸出低電平時,蜂鳴器不響。44.2.1端口控制模塊

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

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

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

80引腳封裝的KL25芯片的GPIO引腳分別記為PORTA、PORTB、PORTC、PORTD、PORTE共5個端口,共含61個引腳。端口作為GPIO引腳時,邏輯1對應高電平,邏輯0對應著低電平。

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

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

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

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

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

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

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

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

舉例說明:設PORTB口的19腳接一個發光二極管,低電平點亮?,F在要點亮這個發光二極管,步驟如下:(1)計算給出PORTB19引腳控制寄存器地址從4.2.1節的端口控制模塊可知,PORTB端口的引腳控制寄存器基地址為0x4004A000u,其中后綴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相當于地址加4。portB_ptr加19代表了portB_ptr地址加上19*4。16(2)計算給出PORTB的數據方向寄存器、輸出寄存器的地址PORTB端口(作為GPIO功能)的基地址為0x400FF040u:

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

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

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

*portB_PDO&=~(1<<19);174.3.1制作GPIO驅動構件的必要性及GPIO驅動構件封裝要點分析

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

4.3GPIO驅動構件封裝方法與驅動構件封裝規范182.GPIO驅動構件封裝要點分析

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

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

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

uint_8gpio_get(uint_8port,uint_8pin)4)引腳狀態反轉(voidgpio_reverse)類似的分析,可以設計引腳狀態反轉函數的原型為:

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

1.底層驅動構件封裝規范概要1)底層驅動構件的組成、存放位置與內容所有底層驅動構件放在工程文件夾的“Drivers”文件夾中,以構件名命名。每個構件由頭文件(.h)與源文件(.c)文件兩個獨立文件組成,放在以構件名命名的文件夾中。驅動構件頭文件(.h)中僅包含對外接口函數的聲明,是構件的使用指南。基本要求是調用者只看頭文件即可使用構件。對外接口函數及內部函數的實現在構件源程序文件(.c)中。同時應注意,頭文件聲明對外接口函數的順序與源程序文件實現對外接口函數的順序應保持一致。源程序文件中內部函數的聲明,放在外接口函數代碼的前面,內部函數的實現放在全部外接口函數代碼的后面,以便提高可閱讀性與可維護性。21

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

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

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

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

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

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

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

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

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

5..map文件、.lst文件.map文件與.lst文件位于“..\FLASH”文件夾,由編譯鏈接產生。.map文件提供了查看程序、堆棧設置、全局變量、常量等存放的地址信息。.lst文件提供了函數編譯后,機器碼與源代碼的對應關系,用于程序分析。414.5.5芯片內電啟動執行過程

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

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

2)SP=Flash中0x00000000地址的第一個表項內容

3)PC=之后第二個表項內容

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

溫馨提示

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

評論

0/150

提交評論