![微控制器原理5_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-7/3/e13c2fc5-9d57-41c5-8fbc-3b718acc2b62/e13c2fc5-9d57-41c5-8fbc-3b718acc2b621.gif)
![微控制器原理5_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-7/3/e13c2fc5-9d57-41c5-8fbc-3b718acc2b62/e13c2fc5-9d57-41c5-8fbc-3b718acc2b622.gif)
![微控制器原理5_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-7/3/e13c2fc5-9d57-41c5-8fbc-3b718acc2b62/e13c2fc5-9d57-41c5-8fbc-3b718acc2b623.gif)
![微控制器原理5_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-7/3/e13c2fc5-9d57-41c5-8fbc-3b718acc2b62/e13c2fc5-9d57-41c5-8fbc-3b718acc2b624.gif)
![微控制器原理5_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-7/3/e13c2fc5-9d57-41c5-8fbc-3b718acc2b62/e13c2fc5-9d57-41c5-8fbc-3b718acc2b625.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、通用通用I/OI/O接口基本概念及連接方法接口基本概念及連接方法 1. I/O1. I/O接口的概念接口的概念 I/O接口,即輸入輸出接口,是微控制器同外界進(jìn)行交互的重要通道,實(shí)現(xiàn)MCU與外部設(shè)備的數(shù)據(jù)交換。I/O接口實(shí)質(zhì)是把微處理器同外圍設(shè)備(簡(jiǎn)稱(chēng)外設(shè))連接起來(lái)實(shí)現(xiàn)數(shù)據(jù)傳送的控制電路,又稱(chēng)為“外設(shè)接口”或“外設(shè)接口電路”。各種I/O卡都是I/O接口。如“顯卡”、“聲卡”、打印卡“等。 在嵌入式系統(tǒng)中,接口種類(lèi)繁多,有顯而易見(jiàn)的人機(jī)交互接口,如操縱桿、鍵盤(pán)、顯示器;也有無(wú)人介入的接口,如網(wǎng)絡(luò)接口、機(jī)器設(shè)備接口。 2 I/OI/O接口接口MCU并行口并行口GPIOGPIO串行口串行口UARTUA
2、RTLEDMODEM計(jì)算機(jī)兩部件之間的界面稱(chēng)之為接口。接口的主要功能是:(1)數(shù)據(jù)緩沖及輸入、輸出(2)尋址功能(3)命令譯碼(4)同步、聯(lián)絡(luò)和控制功能v輸入/輸出 站在處理器或主機(jī)立場(chǎng)上而言的輸入/輸出處理器訪(fǎng)問(wèn)(存?。┙涌谏系奶囟ǖ囊唤M寄存器I/O端口的定義I/O接口與外設(shè)之間傳送三種信息數(shù)據(jù)信息、控制信息和狀態(tài)信息,這三種信息實(shí)際上是CPU通過(guò)接口同外設(shè)之間相互傳送的信息,因此,在接口中必須存放并傳送這三種信息的寄存器。系統(tǒng)給這些寄存器分配專(zhuān)門(mén)的存取地址,這樣的地址稱(chēng)為I/O端口地址。2.2.通用通用I/OI/O(GPIOGPIO) 所謂通用I/O,也記為GPIO(General Pur
3、pose I/O),即基本的輸入/輸出,有時(shí)也稱(chēng)并行I/O,或普通I/O,它是I/O的最基本形式。MCU內(nèi)部程序可以對(duì)通用I/O的端口寄存器進(jìn)行讀寫(xiě)來(lái)實(shí)現(xiàn)開(kāi)關(guān)量的輸入輸出操作,且大多數(shù)通用I/O引腳可以通過(guò)編程來(lái)設(shè)定其工作方式為輸入或輸出,稱(chēng)之為雙向通用I/O。 3.3.上拉下拉電阻與輸入引腳的基本接法上拉下拉電阻與輸入引腳的基本接法 輸入引腳有三種不同的連接方式:帶上拉電阻的連接、帶下拉電阻的連接和“懸空”連接。 必須與TTL電平兼容 (低電平0.0V-0.8V,高電平 2.0-5.0V)。 若MCU的某個(gè)引腳通過(guò)一個(gè)電阻接到電源(Vcc),這個(gè)電阻被稱(chēng)為“上拉電阻”。與之相對(duì)應(yīng),若MCU的
4、某個(gè)引腳通過(guò)一個(gè)電阻接到地(GND)上,則相應(yīng)的電阻被稱(chēng)為“下拉電阻”。懸空的芯片引腳被上拉電阻或下拉電阻初始化為高電平或低電平。 4.4.輸出引腳的基本接法輸出引腳的基本接法 作為通用輸出引腳,MCU內(nèi)部程序向該引腳輸出高電平或低電平來(lái)驅(qū)動(dòng)器件工作,即開(kāi)關(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í),蜂鳴器不響。其中,R1稱(chēng)為限流電阻,R2稱(chēng)為基極電阻。 標(biāo)準(zhǔn)TTL兼容輸出:邏輯“0”為 電壓0V-0.4V、電流0-2.0mA ;
5、邏輯“1”為電壓2.4V-5.0V、電流0-400uA。91 1 端口控制模塊端口控制模塊 KL25的大部分引腳具有復(fù)用功能(可編程的引腳定義),可以通過(guò)端口控制模塊(Port control and interrupts,PORT)提供的寄存器編程指定其為某一具體功能。PORT模塊內(nèi)含3類(lèi)寄存器,分別是:引腳控制寄存器(Pin Control Register),全局引腳控制寄存器(Global Pin Control Register)、中斷狀態(tài)標(biāo)志寄存器(Interrupt Status Flag Register)。端口控制模塊與端口控制模塊與GPIO模塊的編程結(jié)構(gòu)模塊的編程結(jié)構(gòu)11
6、寄存器映像地址分析寄存器映像地址分析 KL25芯片有5個(gè)端口A(yíng)E。每個(gè)端口有32個(gè)引腳控制寄存器PORTx_PCRn(其中x=AE,n=031),2個(gè)全局引腳控制寄存器(PORTx_GPCLR、PORTx_GPCHR)、1個(gè)中斷狀態(tài)標(biāo)志寄存器(PORTx_ISFR)。以下地址分析計(jì)算均為16進(jìn)制,略去十六進(jìn)制前綴“0 x”不寫(xiě)。 121 1)引腳控制寄存器端口地址)引腳控制寄存器端口地址 每個(gè)端口有32個(gè)引腳控制寄存器PORTx_PCRn。端口x的基地址=4004_9000+x*1000(x=AE,對(duì)應(yīng)04)。端口x的每個(gè)引腳控制寄存器PORTx_PCRn的地址為=4004_9000+x*10
7、00+n*4(x=AE,對(duì)應(yīng)04,n=031)。例如PORTA_PCR1的地址為:4004_9000+0*1000+1*4=4004_9004。構(gòu)件解釋?zhuān)簶?gòu)件解釋?zhuān)篗KL25Z4.h中給出AE端口的基地址/ /* * PORT - Peripheral instance base addresses PORT - Peripheral instance base addresses * */ /#define PORTA_BASE_PTR (PORT_MemMapPtr)0 x40049000u)#define PORTA_BASE_PTR (PORT_MemMapPtr)0 x4004900
8、0u)#define PORTB_BASE_PTR (PORT_MemMapPtr)0 x4004A000u)#define PORTB_BASE_PTR (PORT_MemMapPtr)0 x4004A000u)#define PORTC_BASE_PTR (PORT_MemMapPtr)0 x4004B000u)#define PORTC_BASE_PTR (PORT_MemMapPtr)0 x4004B000u)#define PORTD_BASE_PTR (PORT_MemMapPtr)0 x4004C000u)#define PORTD_BASE_PTR (PORT_MemMapPt
9、r)0 x4004C000u)#define PORTE_BASE_PTR (PORT_MemMapPtr)0 x4004D000u)#define PORTE_BASE_PTR (PORT_MemMapPtr)0 x4004D000u)/ /* * * Array initializer of PORT peripheral base pointers Array initializer of PORT peripheral base pointers * */ /#define PORT_BASE_PTRS PORTA_BASE_PTR, #define PORT_BASE_PTRS PO
10、RTA_BASE_PTR, PORTB_BASE_PTR, PORTC_BASE_PTR, PORTD_BASE_PTR, PORTB_BASE_PTR, PORTC_BASE_PTR, PORTD_BASE_PTR, PORTE_BASE_PTR PORTE_BASE_PTR Gpio.c中定義各端口基地址的常數(shù)數(shù)組(P.74)const PORT_MemMapPtr const PORT_MemMapPtr PORT_ARR=PORTA_BASE_PTR,PORTB_BASE_PTR, PORT_ARR=PORTA_BASE_PTR,PORTB_BASE_PTR, PORTC_BASE_P
11、TR,PORTD_BASE_PTR,PORTE_BASE_PTR;PORTC_BASE_PTR,PORTD_BASE_PTR,PORTE_BASE_PTR;KL25-Light(Simple)例之 main.c 中(P.69)給出不優(yōu)化的32位指針變量portB_ptr: volatile uint_32 *portB_ptr = (uint_32*)0 x4004A000u; PORTB19引腳控制寄存器地址=基地址+偏移量: volatile uint_32 *portB_PCR_19 = portB_ptr + 19; 這里是19,而不是19*4,由于定義了32位指針,portB_ptr
12、加19代表了portB_ptr地址加上19*4。2 2)全局引腳控制寄存器端口地址)全局引腳控制寄存器端口地址 每個(gè)端口有2個(gè)全局引腳控制寄存器。全局引腳控制寄存器(低)PORTx_GPCLR,地址=4004_9080+x*1000(x=AE,對(duì)應(yīng)04);全局引腳控制寄存器(高)PORTx_GPCHR,地址=4004_9084+x*1000(x=AE,對(duì)應(yīng)04)。3 3)中斷狀態(tài)標(biāo)志寄存器)中斷狀態(tài)標(biāo)志寄存器 每個(gè)端口的有1個(gè)中斷狀態(tài)標(biāo)志寄存器。地址=4004_90A0+x*1000(x=AE,對(duì)應(yīng)04)。在工程文件夾的芯片頭文件CPUMKL25Z4.h中,定義端口寄存器結(jié)構(gòu)體,把端口模塊的編
13、程寄存器用一個(gè)結(jié)構(gòu)體類(lèi)型(PORT_MemMap)封裝起來(lái)。(P.76)Typedef struct PORT_MemMap uint32_t PCR32; /引腳控制寄存器(引腳控制寄存器(031),偏移:),偏移: 0 x0,間隔:,間隔: 0 x4 uint32_t GPCLR; /全局引腳控制寄存器(全局引腳控制寄存器(L),偏移:),偏移:0 x80 uint32_t GPCHR; /全局引腳控制寄存器(全局引腳控制寄存器(H),偏移:),偏移:0 x84 uint8_t RESERVED_024; /保留(占位)(保留(占位)(023) uint32_t ISFR; /中斷狀態(tài)標(biāo)志
14、寄存器,偏移:中斷狀態(tài)標(biāo)志寄存器,偏移:0 xA0 volatile *PORT_MemMapPtr;同時(shí)定義了不優(yōu)化的PORT模塊寄存器結(jié)構(gòu)體指針(PORT_MemMapPtr),這樣,只要給出端口基地址,就可以使用該結(jié)構(gòu)體的成員變量,確定各寄存器的端口地址。2.2. 引腳控制寄存器(引腳控制寄存器(PORTx_PCRnPORTx_PCRn) 每個(gè)端口的每個(gè)引腳均有一個(gè)對(duì)應(yīng)的引腳控制寄存器,可以配置引腳中斷或DMA傳輸請(qǐng)求,可以配置引腳為GPIO功能或其他功能,可以配置是否啟用上拉或下拉,可以配置選擇輸出引腳的驅(qū)動(dòng)強(qiáng)度,可以配置選擇輸入引腳是否使用內(nèi)部濾波等。 18其中“X”表示復(fù)位后狀態(tài)不
15、確定。 相關(guān)基礎(chǔ)術(shù)語(yǔ)知識(shí):相關(guān)基礎(chǔ)術(shù)語(yǔ)知識(shí):(1)模擬引腳指不能夠配置成GPIO的引腳叫做模擬引腳(Analog pin),如RESET、EXTAL及XTAL等引腳。(見(jiàn)P.56 表3-7)(2)數(shù)字引腳是指能夠被配置成GPIO的引腳叫做數(shù)字引腳(Digital pin)。 (見(jiàn)P.56 表3-7)(3)無(wú)源濾波器(Passive filter)是由電容器、電抗器和電阻器適當(dāng)組合而成,并兼有無(wú)功補(bǔ)償和調(diào)壓功能的濾波器。(D4(PEE)位控制)20(4)引腳驅(qū)動(dòng)能力(Drive Strength)是指引腳輸出電流的驅(qū)動(dòng)能力,一般用mA單位度量。又習(xí)慣稱(chēng)為扇出系數(shù),以驅(qū)動(dòng)TTL門(mén)電路個(gè)數(shù)為單位。(
16、D6(DSE)位控制)(5)轉(zhuǎn)換速率(Slew rate)是指電壓在高低電平間轉(zhuǎn)換的時(shí)間間隔,一般用ns單位度量。(D2(SRE)位控制)(6)數(shù)字輸入/輸出(Digital input/output)是指芯片引腳只能輸入/輸出高電平(邏輯1)和低電平(邏輯0)兩個(gè)電壓值。(7)引腳復(fù)用槽(Pin muxing slot)是指信號(hào)復(fù)用裝置與引腳之間的接口,引腳通過(guò)連接不同的信號(hào)復(fù)用槽可以配置成不同的功能。多功能引腳通過(guò)MUX進(jìn)行選擇(D8D10)。例如:設(shè)置PORTB19引腳為GPIO引腳使相應(yīng)引腳控制寄存器的10-8位(MUX字段)為0b001,其他位使用默認(rèn)0: *portB_PCR_19
17、=0 x00000100;(8)W1C是指對(duì)某位寫(xiě)1而使得該位清0,俗稱(chēng)寫(xiě)1清0。用于清除中斷標(biāo)志(D24(ISF)位)。是通常中斷結(jié)束的方式,特別對(duì)于電平觸發(fā)的中斷。此外,還有自動(dòng)結(jié)束中斷方式。(9)DMA/中斷觸發(fā)方式可以電平觸發(fā)或沿觸發(fā),其中,沿觸發(fā)可靠性高。(D16D19(IRQC)位控制)。DMA只能采用沿觸發(fā)。 3 .3 .全局引腳控制寄存器全局引腳控制寄存器 1)每個(gè)端口的全局引腳控制寄存器有兩個(gè),分別為PORTx_GPCLR、PORTx_GPCHR,為只寫(xiě)寄存器,讀出總為0。 2)每個(gè)寄存器的高16位被稱(chēng)為全局引腳寫(xiě)使能字段(Global Pin Write Enable,GP
18、WE),定義對(duì)應(yīng)引腳是否可批量配置(“1”可用)。低16位被稱(chēng)為全局引腳寫(xiě)數(shù)據(jù)字段(Global Pin Write Data,GPWD),可以實(shí)現(xiàn)一次配置16個(gè)功能相同的引腳,提高了編程效率。全局引腳控制寄存器不能配置引腳控制寄存器的高16位。 24 3)KL25芯片每個(gè)端口有32個(gè)引腳控制寄存器,分為兩組:低引腳控制寄存器組(150)和高引腳控制寄存器組(3116),全局引腳控制寄存器PORTx_GPCLR配置低引腳控制寄存器組(150),而全局引腳控制寄存器PORTx_GPCHR配置高引腳控制寄存器組(3116)。 4.4.中斷狀態(tài)標(biāo)志寄存器中斷狀態(tài)標(biāo)志寄存器(PORTx_ISFR)(P
19、ORTx_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è)到,反之沒(méi)有(讀操作)。各位具有寫(xiě)1清0特性(寫(xiě)操作),非自動(dòng)結(jié)束中斷方式下,清除該位表示中斷處理完成。GPIOGPIO模塊模塊1.1.基本輸入基本輸入/ /輸出電路輸出電路輸入設(shè)備是一組三態(tài)緩沖器撥動(dòng)開(kāi)關(guān)(toggle switch)是數(shù)據(jù)源,74
20、LS244-三態(tài)輸出的8組緩沖器和總線(xiàn)驅(qū)動(dòng)器 基本輸入接口電路基本輸入接口電路輸出設(shè)備是一組數(shù)據(jù)鎖存器一組發(fā)光二極管表示輸出數(shù)據(jù),當(dāng)一個(gè)Q輸出低電平(“0”)時(shí),對(duì)應(yīng)的發(fā)光二極管導(dǎo)通,LED亮。74LS374-三態(tài)輸出的8D上升沿觸發(fā)器將8個(gè)輸入鎖存到輸出,當(dāng)OE=0,G為高電平,輸出Q=輸入Q; 當(dāng)OE=0,G由高到低,輸出Q=Q0(原狀態(tài),鎖定);OE=1,Q為高阻抗?fàn)顟B(tài)。In this case, the data from the OUT instruction is latched using SEL. 基本輸出接口電路基本輸出接口電路 2.2. KL25KL25的的GPIOGPIO
21、引腳引腳 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è)引腳,分別為PTA12、PTA45、PTA1217; (2)PORTB口有12個(gè)引腳,分別為PTB03、PTB811、PTB1619; (3)PORTC口有16個(gè)引腳,分別為PTC013、PTC1617; (4)PORTD口有8個(gè)引腳,分別為PTD07; (5)PORTE口有15個(gè)引腳,分別為PTE05、PTE2025、PTE2931。32
22、 3.3. GPIOGPIO寄存器寄存器 每個(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。33其他各口功能與編程方式完
23、全一致,只是相應(yīng)寄存器名與寄存器地址不同,其中寄存器名只要把其中的PORTA口“A”子字母分別改為B、C、D、E即可獲得,地址按上述給出的規(guī)律計(jì)算。數(shù)據(jù)輸出寄存器對(duì)應(yīng)一組數(shù)據(jù)鎖存器,數(shù)據(jù)輸入寄存器對(duì)應(yīng)一組三態(tài)緩沖器,數(shù)據(jù)方向寄存器使得每個(gè)口的GPIO引腳可編程定義。4.GPIO4.GPIO基本編程步驟基本編程步驟要使芯片某一引腳為GPIO功能,并定義為輸入/輸出,隨后進(jìn)行應(yīng)用,基本編程步驟如下:(1)通過(guò)端口控制模塊(PORT)的引腳控制寄存器PORTx_PCRn的引腳復(fù)用控制字段(MUX)設(shè)定其為GPIO功能(即令MUX=0b001);(2)通過(guò)GPIO模塊相應(yīng)口的“數(shù)據(jù)方向寄存器”來(lái)指定相
24、應(yīng)引腳為輸入或輸出功能。若指定位為0,則為對(duì)應(yīng)引腳輸入;若指定位為1,則為對(duì)應(yīng)引腳輸出。36 (3)若是輸出引腳,則通過(guò)設(shè)置“數(shù)據(jù)輸出寄存器”來(lái)指定相應(yīng)引腳輸出低電平或高電平,對(duì)應(yīng)值為0或1。亦可通過(guò)“輸出置位寄存器”、“輸出清位寄存器”、“輸出取反寄存器”改變引腳狀態(tài),參見(jiàn)表4-1中關(guān)于寄存器的說(shuō)明。(4)若是輸入引腳,則通過(guò)“數(shù)據(jù)輸入寄存器”獲得引腳的狀態(tài)。若指定位為0,表示當(dāng)前該引腳上為低電平;若為1,則為高電平。 5 5GPIOGPIO基本編程步驟舉例基本編程步驟舉例設(shè)PORTB口的19腳接一個(gè)發(fā)光二極管,低電平點(diǎn)亮?,F(xiàn)在要點(diǎn)亮這個(gè)發(fā)光二極管,步驟如下: (1)計(jì)算給出PORTB19引
25、腳控制寄存器地址 從4.2.1節(jié)的端口控制模塊可知,PORTB端口的引腳控制寄存器基地址為0 x4004A000u,其中后綴u表示無(wú)符號(hào)數(shù),給出不優(yōu)化的32位指針變量portB_ptr: volatile uint_32 *portB_ptr = (uint_32*)0 x4004A000u; PORTB19引腳控制寄存器地址=基地址+偏移量: volatile uint_32 *portB_PCR_19 = portB_ptr + 19; 這里是19,而不是19*4,由于定義了32位指針,portB_ptr加1相當(dāng)于地址加4。portB_ptr加19代表了portB_ptr地址加上19*4。
26、38 (2)計(jì)算給出PORTB的數(shù)據(jù)方向寄存器、輸出寄存器的地址。PORTB端口(作為GPIO功能)的基地址為0 x400FF040u: volatile uint_32 *gpioB_ptr = (uint_32*)0 x400FF040u; 參考表4-1,PORTB的數(shù)據(jù)方向寄存器地址=基地址+偏移量,PORTB的數(shù)據(jù)輸出寄存器地址=基地址+偏移量: volatile uint_32 *portB_PDDR =gpioB_ptr+5; volatile uint_32 *portB_PDO =gpioB_ptr+0; (3)設(shè)置PORTB19引腳為GPIO引腳。即令相應(yīng)引腳控制寄存器的10
27、-8位(MUX字段)為0b001,其他位使用默認(rèn)0: *portB_PCR_19=0 x00000100;39(4)通過(guò)令PORTB的方向寄存器相應(yīng)位為1,定義PORTB19引腳為輸出 *portB_PDDR |= (119);(5)通過(guò)PORTB的輸出寄存器相應(yīng)位賦0,使PORTB19引腳輸出低電平 *portB_PDO &= (119);制作制作GPIO驅(qū)動(dòng)構(gòu)件的必要性驅(qū)動(dòng)構(gòu)件的必要性 將軟件構(gòu)件技術(shù)應(yīng)用到嵌入式軟件開(kāi)發(fā)中,可以大大提高嵌入式開(kāi)發(fā)的開(kāi)發(fā)效率與穩(wěn)定性,可以使軟件具有更好的開(kāi)放性、通用性和適應(yīng)性。特別是對(duì)于底層硬件的驅(qū)動(dòng)編程,只有封裝成底層驅(qū)動(dòng)構(gòu)件,才能減少重復(fù)勞動(dòng),使
28、開(kāi)發(fā)者專(zhuān)注于應(yīng)用軟件穩(wěn)定性與功能設(shè)計(jì)上。 以KL25的GPIO為例,它有61個(gè)引腳可以作為GPIO,分布在5個(gè)端口,使用直接地址去操作相關(guān)寄存器無(wú)法實(shí)現(xiàn)軟件移植與復(fù)用。應(yīng)該把對(duì)GPIO引腳的操作封裝成構(gòu)件,通過(guò)函數(shù)調(diào)用與傳參的方式實(shí)現(xiàn)對(duì)引腳的干預(yù)與狀態(tài)獲取,這樣的軟件才便于維護(hù)與移植。同時(shí),底層驅(qū)動(dòng)構(gòu)件的封裝,也為在操作系統(tǒng)下對(duì)底層硬件的操作提供了基礎(chǔ)。GPIOGPIO驅(qū)動(dòng)構(gòu)件封裝方法與驅(qū)動(dòng)構(gòu)件封裝規(guī)范驅(qū)動(dòng)構(gòu)件封裝方法與驅(qū)動(dòng)構(gòu)件封裝規(guī)范41 2.GPIO驅(qū)動(dòng)構(gòu)件封裝要點(diǎn)分析驅(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è)
29、文件組成,如要使用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ì)為:void gpio_init(uint_8 port, uint_8 pin, uint_8 dir, uint_8 state)422)設(shè)置引腳狀態(tài)(gpio_set)
30、,輸出數(shù)據(jù)對(duì)于輸出,希望通過(guò)函數(shù)設(shè)置引腳是高電平(邏輯1)還是低電平(邏輯0),入口參數(shù)應(yīng)該是哪個(gè)端口、端口的哪個(gè)引腳,函數(shù)不必有返回值。這樣設(shè)置引腳狀態(tài)的函數(shù)原型可以設(shè)計(jì)為:void gpio_set(uint_8 port, uint_8 pin, uint_8 state)3)獲得引腳狀態(tài)(gpio_get),讀入數(shù)據(jù)對(duì)于輸入,希望通過(guò)函數(shù)獲得引腳的狀態(tài)是高電平(邏輯1)還是低電平(邏輯0),入口參數(shù)應(yīng)該是哪個(gè)端口、端口的哪個(gè)引腳,函數(shù)需要返回值引腳狀態(tài)。這樣設(shè)置引腳狀態(tài)的函數(shù)原型可以設(shè)計(jì)為:uint_8 gpio_get(uint_8 port, uint_8 pin)4)引腳狀態(tài)反轉(zhuǎn)
31、(void gpio_reverse),開(kāi)關(guān)切換類(lèi)似的分析,可以設(shè)計(jì)引腳狀態(tài)反轉(zhuǎn)函數(shù)的原型為:void gpio_reverse(uint_8 port, uint_8 pin)5)引腳上下拉使能函數(shù)(void gpio_pull) 若引腳被設(shè)置成輸入,還可以設(shè)定內(nèi)部上下拉,KL25內(nèi)部上下拉電阻大小為2050K。引腳上下拉使能函數(shù)的原型為: void gpio_pull(uint_8 port,uint_8 pin, uint_8 pullselect)443. 底層驅(qū)動(dòng)構(gòu)件封裝規(guī)范概要底層驅(qū)動(dòng)構(gòu)件封裝規(guī)范概要1)底層驅(qū)動(dòng)構(gòu)件的組成、存放位置與內(nèi)容 所有底層驅(qū)動(dòng)構(gòu)件放在工程文件夾的“Driv
32、ers”文件夾中,以構(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ù)性。45 2)制作構(gòu)件的最基本要求 (1)考慮使用與移植方便。 (2)要有統(tǒng)一、規(guī)范的編碼風(fēng)格與注釋。
33、(3)宏的使用限制。 (4)不使用全局變量。 464 4構(gòu)件封裝的前期準(zhǔn)備構(gòu)件封裝的前期準(zhǔn)備 具體內(nèi)容見(jiàn)構(gòu)件公共要素文件。該文件放在工程文件夾的“Common”文件夾下,分別名為common.h和common.c。 1)KL25芯片寄存器映射文件 2)位操作宏函數(shù) 3)重定義基本數(shù)據(jù)類(lèi)型下章節(jié)詳細(xì)敘述5. KL255. KL25的的GPIOGPIO驅(qū)動(dòng)構(gòu)件及解析驅(qū)動(dòng)構(gòu)件及解析 GPIO驅(qū)動(dòng)構(gòu)件存放于“ SD-FSL-KL25-Componentgpio”文件夾 1)GPIO驅(qū)動(dòng)構(gòu)件頭文件(gpio.h) 在GPIO驅(qū)動(dòng)構(gòu)件的頭文件(gpio.h)中包含的內(nèi)容有:頭文件說(shuō)明;防止重復(fù)包含的條件編
34、譯代碼結(jié)構(gòu)“#ifndef .#define .#endif”;用宏定義方式統(tǒng)一了使用的端口名稱(chēng)(PORTA、PORTB、PORTC、PORTD、PORTE);給出5個(gè)對(duì)外服務(wù)函數(shù)的接口說(shuō)明及聲明,函數(shù)包括引腳初始化函數(shù)(gpio_init)、設(shè)定引腳狀態(tài)函數(shù)(gpio_set)、獲取引腳狀態(tài)函數(shù)(gpio_get)、反轉(zhuǎn)引腳狀態(tài)函數(shù)(gpio_ reverse)、引腳上下拉使能函數(shù)(void gpio_pull)。具體代碼見(jiàn)教材P72-P74或 “. SD-FSL-KL25-Componentgpiogpio.h” 文件。48 2)GPIO驅(qū)動(dòng)構(gòu)件源程序文件(gpio.c)GPIO驅(qū)動(dòng)構(gòu)件的
35、源程序文件中實(shí)現(xiàn)的對(duì)外接口函數(shù),主要是對(duì)相關(guān)寄存器進(jìn)行配置,從而完成構(gòu)件的基本功能。構(gòu)件內(nèi)部使用的函數(shù)也在構(gòu)件源程序文件中定義。具體代碼見(jiàn)教材P74-P76或“. SD-FSL-KL25-Componentgpiogpio.c” 文件。 3)GPIO驅(qū)動(dòng)構(gòu)件解析 兩個(gè)結(jié)構(gòu)體類(lèi)型兩個(gè)結(jié)構(gòu)體類(lèi)型 在工程文件夾的芯片頭文件“.CPUMKL25Z4.h”)中,有端口寄存器結(jié)構(gòu)體,把端口模塊的編程寄存器用一個(gè)結(jié)構(gòu)體類(lèi)型(PORT_MemMap)封裝起來(lái):Typedef struct PORT_MemMap uint32_t PCR32; /引腳控制寄存器(031), 偏移: 0 x0,間隔: 0 x4
36、uint32_t GPCLR; /全局引腳控制寄存器(L), 偏移:0 x80 uint32_t GPCHR; /全局引腳控制寄存器(H), 偏移:0 x84 uint8_t RESERVED_024;/保留(占位)(023) uint32_t ISFR; /中斷狀態(tài)標(biāo)志寄存器, 偏移:0 xA0 volatile *PORT_MemMapPtr; 50同時(shí)定義了不優(yōu)化的PORT模塊寄存器結(jié)構(gòu)體指針(PORT_MemMapPtr),這樣,只要給出端口基地址,就可以使用該結(jié)構(gòu)體的成員變量,實(shí)現(xiàn)對(duì)各寄存器的訪(fǎng)問(wèn)。例如: KL25-Light例之 gpio.c 中(P.76)詳見(jiàn)C語(yǔ)言結(jié)構(gòu)體指針對(duì)結(jié)
37、構(gòu)體成員訪(fǎng)問(wèn)例類(lèi)似,給出了GPIO模塊結(jié)構(gòu)體類(lèi)型(GPIO_MemMap)及其指針:Typedef struct GPIO_MemMap uint32_t PDOR; /數(shù)據(jù)輸出寄存器, 偏移:0 x0 uint32_t PSOR; /輸出置1寄存器, 偏移:0 x4 uint32_t PCOR; /輸出清0寄存器, 偏移:0 x8 uint32_t PTOR; / 輸出取反寄存器, 偏移:0 xC uint32_t PDIR; /數(shù)據(jù)輸入寄存器, 偏移:0 x10 uint32_t PDDR; /數(shù)據(jù)方向寄存器, 偏移:0 x14 volatile *GPIO_MemMapPtr; 52端口
38、模塊及端口模塊及GPIOGPIO模塊各口基地址模塊各口基地址 KL25的端口(PORT)模塊各口基地址: PORTA_BASE_PTR、PORTB_BASE_PTR、 PORTC_BASE_PTR、PORTD_BASE_PTR、PORTE_BASE_PTR在芯片頭文件中以宏常數(shù)方式給出。MKL25Z4.h中給出AE端口的基地址/ /* * PORT - Peripheral instance base addresses PORT - Peripheral instance base addresses * */ /#define PORTA_BASE_PTR (PORT_MemMapPtr)
39、0 x40049000u)#define PORTA_BASE_PTR (PORT_MemMapPtr)0 x40049000u)#define PORTB_BASE_PTR (PORT_MemMapPtr)0 x4004A000u)#define PORTB_BASE_PTR (PORT_MemMapPtr)0 x4004A000u)#define PORTC_BASE_PTR (PORT_MemMapPtr)0 x4004B000u)#define PORTC_BASE_PTR (PORT_MemMapPtr)0 x4004B000u)#define PORTD_BASE_PTR (POR
40、T_MemMapPtr)0 x4004C000u)#define PORTD_BASE_PTR (PORT_MemMapPtr)0 x4004C000u)#define PORTE_BASE_PTR (PORT_MemMapPtr)0 x4004D000u)#define PORTE_BASE_PTR (PORT_MemMapPtr)0 x4004D000u) 同樣,KL25的GPIO模塊各口基地址PTA_BASE_PTR、PTB_BASE_PTR、 PTC_BASE_PTR、PTD_BASE_PTR、PTE_BASE_PTR也在芯片頭文件中以宏常數(shù)方式給出,本程序直接作為指針常量。 編程與注
41、釋風(fēng)格編程與注釋風(fēng)格 仔細(xì)分析本構(gòu)件的編程與注釋風(fēng)格,盡量規(guī)范起來(lái),逐步鍛煉起良好的編程習(xí)慣。特別是,不要編寫(xiě)令人難以看懂的程序,不要把簡(jiǎn)單問(wèn)題復(fù)雜化,不要使用不必要的宏54第一個(gè)第一個(gè)C語(yǔ)言工程:控制小燈閃爍語(yǔ)言工程:控制小燈閃爍 用KL25控制發(fā)光二極管指示燈的例子開(kāi)始程序之旅,程序中使用了GPIO驅(qū)動(dòng)構(gòu)件來(lái)編寫(xiě)指示燈程序。當(dāng)指示燈兩端引腳上有足夠高的正向壓降時(shí),它就會(huì)發(fā)光。在工程實(shí)例中,燈的正端引腳接KL25的GPIO口,負(fù)端引腳通過(guò)電阻接地。當(dāng)在I/O引腳上輸出高或低電平時(shí),指示燈就會(huì)亮或暗。SD-FSL-KL25-EVB硬件板上有個(gè)三色燈,分別是PORTB19=紅燈、PORTB18=
42、 綠燈、PORTB9= 藍(lán)燈LightLight構(gòu)件設(shè)計(jì)與測(cè)試工程主程序構(gòu)件設(shè)計(jì)與測(cè)試工程主程序 1Light構(gòu)件的頭文件light.h(P78-P79)2Light構(gòu)件的程序文件light.c(P79) 3Light構(gòu)件測(cè)試工程主程序(P79-P80)55Codewarrior開(kāi)發(fā)環(huán)境(開(kāi)發(fā)環(huán)境(CW10.3)簡(jiǎn)介)簡(jiǎn)介 1 1CW10.3CW10.3的簡(jiǎn)介與安裝的簡(jiǎn)介與安裝 本書(shū)使用的嵌入式軟件集成開(kāi)發(fā)平臺(tái)件平臺(tái)是:飛思卡爾公司的CodeWarrior Development Studio v10.3集成開(kāi)發(fā)環(huán)境(以下簡(jiǎn)稱(chēng)CW10.3)。CW10.3提供了工程管理、源程序編輯、編譯、連接、
43、下載調(diào)試等功能。為了快速進(jìn)入CW10.3,可閱讀“. 相關(guān)閱讀材料”文件夾中提供的“CW10.3簡(jiǎn)明操作指南.pdf”,同時(shí)該文件夾中還提供了硬件評(píng)估板的“SD-FSL-KL25-EVB用戶(hù)手冊(cè).pdf”,希望初次使用CW10.3進(jìn)行KL25的實(shí)踐讀者,務(wù)必認(rèn)真閱讀后再進(jìn)行實(shí)踐操作,可以避免不少的困惑。CW 10.3環(huán)境的運(yùn)行界面如圖:5657 2 2相關(guān)驅(qū)動(dòng)的安裝相關(guān)驅(qū)動(dòng)的安裝 使用SD-FSL-KL25-EVB,在安裝好CW10.3后,還需安裝“. SD-FSL-KL25-CD(V2.3)20140505Tools”內(nèi)的相關(guān)驅(qū)動(dòng)程序: (1)TTL-USB串口線(xiàn)的驅(qū)動(dòng) (2)SD-FSL-
44、KL25-EVB評(píng)估板上的KL25編程器驅(qū)動(dòng)程序 (3)KL25編程器補(bǔ)丁安裝包 58 3 3初次在初次在CW10.3CW10.3環(huán)境下快速導(dǎo)入工程、編譯、環(huán)境下快速導(dǎo)入工程、編譯、下載程序下載程序 4 4運(yùn)行程序運(yùn)行程序 5 5遇到問(wèn)題的解決辦法遇到問(wèn)題的解決辦法 6 6幾個(gè)常用操作幾個(gè)常用操作 參見(jiàn)教材P82-P83或“SD-FSL-KL25-EVB用戶(hù)手冊(cè).pdf”第三、第四章的內(nèi)容。工程文件組織框架與第一個(gè)工程文件組織框架與第一個(gè)C語(yǔ)言工程分語(yǔ)言工程分析析 嵌入式系統(tǒng)工程包含若干文件,包括程序文件、頭文件、與編譯調(diào)試相關(guān)的文件、工程說(shuō)明文件、開(kāi)發(fā)環(huán)境生成文件等,文件眾多,合理組織這些文
45、件,規(guī)范工程組織,可以提高項(xiàng)目的開(kāi)發(fā)效率、提高閱讀清晰度、提高可維護(hù)性、降低維護(hù)難度。工程組織應(yīng)體現(xiàn)嵌入式軟件工程的基本原則與基本思想。60 CW10.3CW10.3開(kāi)發(fā)環(huán)境下工程文件組織框架開(kāi)發(fā)環(huán)境下工程文件組織框架以L(fǎng)ight工程為例的樹(shù)形工程結(jié)構(gòu)模板 1)工程名與新建工程 不必在意工程名,可以使用工程文件夾標(biāo)識(shí)工程,不同工程文件夾就區(qū)別不同工程。 建議新工程文件夾使用手動(dòng)復(fù)制標(biāo)準(zhǔn)模板工程文件夾或復(fù)制功能更少的舊工程的方法來(lái)建立,這樣,復(fù)用的構(gòu)件已經(jīng)存在。 2)工程文件夾內(nèi)的基本內(nèi)容 工程文件夾內(nèi)共含8個(gè)下級(jí)文件夾,分別是Common、CPU、Doc、Drivers、FLASH、Proje
46、ct_Settings、Source、SwComponent。其簡(jiǎn)明功能及特點(diǎn)見(jiàn)下表。 622.2.鏈接文件鏈接文件 “. Project_Settings Linker_Files”文件夾內(nèi)的intflash.ld文件被稱(chēng)為鏈接腳本文件,簡(jiǎn)稱(chēng)鏈接文件,可在工程環(huán)境下打開(kāi)查看,一般不必更改。鏈接文件描述了相關(guān)文件按什么順序鏈接在一起,生成輸出機(jī)器碼文件.elf。給出了程序放在何地址、常數(shù)放在何地址、堆棧大小及地址范圍等信息。 KL25-Light工程的intflash.ld文件的簡(jiǎn)要分析如P.85表4-3 所示。643. 機(jī)器碼文件機(jī)器碼文件 CW10.3開(kāi)發(fā)平臺(tái),針對(duì)KL系列MCU,運(yùn)行ar
47、m-elf-gcc編譯器,在編譯鏈接過(guò)程中生成針對(duì)ARM CPU的.elf格式可執(zhí)行代碼,同時(shí)也可生成.hex格式的機(jī)器碼。 .hex(Intel HEX)文件是由一行行符合Intel HEX文件格式的文本所構(gòu)成的ASCII文本文件,在Intel HEX文件中,每一行包含一個(gè)HEX記錄,這些記錄由對(duì)應(yīng)機(jī)器語(yǔ)言碼(含常量數(shù)據(jù))的十六進(jìn)制編碼數(shù)字組成。在CW10.3環(huán)境下,直接雙擊可查看該文件。65 1)記錄格式 .hex文件中的語(yǔ)句有六種不同類(lèi)型的語(yǔ)句,但總體格式是一樣的,如下表66 2)實(shí)例分析 以KL25-Light工程中的KL25prg.hex為例,進(jìn)行簡(jiǎn)明分析。截取第一個(gè)實(shí)例工程的“.h
48、ex”文件的部分行進(jìn)行分解,67 分析第1行,以“:”開(kāi)始,長(zhǎng)度為“0 x10”(16個(gè)字節(jié)),“0000”表示相對(duì)地址,緊接著的“00”代表記錄類(lèi)型為數(shù)據(jù)類(lèi)型,接下來(lái)的就是數(shù)據(jù)段“0030002005060000550A00005D0A0000”,該數(shù)據(jù)段存放在偏移地址為“0000”的存儲(chǔ)區(qū)的機(jī)器操作碼,也就是說(shuō),只有這些數(shù)據(jù)被寫(xiě)入到Flash存儲(chǔ)區(qū)。這里的hex文件中,數(shù)據(jù)部分是以“小端”的方式存儲(chǔ)的,在這種格式中,字的低字節(jié)存儲(chǔ)在低地址中,而字?jǐn)?shù)據(jù)的高字節(jié)存放在高地址中,第1個(gè)4字節(jié)“00 30 00 20”,實(shí)際表示的數(shù)據(jù)內(nèi)容為“20 00 30 00”,就是堆棧棧頂(=RAM最高地址
49、+1),這4個(gè)字節(jié)也就是中斷向量表中開(kāi)始內(nèi)容(占用了0號(hào)中斷位置),其內(nèi)容在MCU啟動(dòng)時(shí)被放入堆棧寄存器SP中。接下來(lái)的4個(gè)字節(jié) “05 06 00 00” “00 00 06 05”(參見(jiàn)第45行),占用中斷向量表1號(hào)中斷位置,其內(nèi)容其內(nèi)容在MCU啟動(dòng)時(shí)被放入程序堆棧計(jì)數(shù)器PC中,也就是開(kāi)始執(zhí)行代碼的存放處,即為啟動(dòng)函數(shù)Startup在Flash中存放的開(kāi)始地址(可以從“.map”文件、“.lst”文件找到相應(yīng)信息進(jìn)行理解)。 從第1行后半部開(kāi)始至12行,是中斷向量表,從第13行開(kāi)始是程序記錄。 第220行(最后一行)為文檔的結(jié)束記錄,記錄類(lèi)型為“0 x01”;“0 xFF”為本記錄的校驗(yàn)和
50、字段內(nèi)容。694. 其他相關(guān)文件其他相關(guā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_SettingsStartup_Code”文件夾下,是CW10.3環(huán)境下KL25工程啟動(dòng)文件。在startup.c文件中給出了startup函數(shù)源代碼。70 3)總頭文件與主程序文件(includes.h、main.c) 總頭文件
51、includes.h是main.c使用的頭文件,內(nèi)含外部函數(shù)引用、常量、全局變量聲明以及外部變量引用。main.c文件是工程任務(wù)的核心文件,main函數(shù)即在該文件中實(shí)現(xiàn)。在main函數(shù)中包含了一個(gè)永久循環(huán),對(duì)具體事務(wù)過(guò)程的操作幾乎都是添加在該主循環(huán)中,含有操作系統(tǒng)下編程的調(diào)度作用。 4)內(nèi)核及芯片頭文件(MKL25Z4.h) 在MKL25Z4.h文件中,給出了KL25芯片專(zhuān)用的寄存器地址映射,由芯片廠(chǎng)家提供。需要注意的是,針對(duì)某一款芯片進(jìn)行開(kāi)發(fā)時(shí),有專(zhuān)用的寄存器映射文件,由芯片設(shè)計(jì)人員提供,一般嵌入式應(yīng)用開(kāi)發(fā)者不必修改該文件。 725).map文件、.lst文件 .map文件與.lst文件位于
52、“.FLASH”文件夾,由編譯鏈接產(chǎn)生。.map文件提供了查看程序、堆棧設(shè)置、全局變量、常量等存放的地址信息。 .lst文件提供了函數(shù)編譯后,機(jī)器碼與源代碼的對(duì)應(yīng)關(guān)系,用于程序分析。5.芯片內(nèi)電啟動(dòng)執(zhí)行過(guò)程芯片內(nèi)電啟動(dòng)執(zhí)行過(guò)程中斷類(lèi)型號(hào)中斷類(lèi)型號(hào) 每一個(gè)中斷都有一個(gè)中斷類(lèi)型號(hào)(從047),一個(gè)中斷類(lèi)型號(hào)對(duì)應(yīng)一個(gè)中斷服務(wù)程序。中斷向量中斷向量 中斷服務(wù)程序的入口地址稱(chēng)為中斷向量。中斷向量表中斷向量表 中斷向量存放在內(nèi)存中從地址0 x000000000 x000000C0的連續(xù)的單元中,該區(qū)域稱(chēng)為中斷向量表。查找中斷向量查找中斷向量 中斷類(lèi)型號(hào)乘4就是中斷向量在中斷向量表中的開(kāi)始地址。CPU響應(yīng)中
53、斷時(shí),根據(jù)中斷類(lèi)型號(hào)n,找到中斷服務(wù)程序的入口地址4n。然后將4n、4n+1、 4n+2和4n+3單元中的內(nèi)容送程序堆棧計(jì)數(shù)器PC中從而轉(zhuǎn)向中斷服務(wù)程序的入口地址。(PC)= (中斷類(lèi)型*4+3)(中斷類(lèi)型*4+2)(中斷類(lèi)型*4+1)(中斷類(lèi)型*4) 1)中斷向量表存放位置的分析理解 通過(guò)查看工程文件夾中“.Project_SettingsLinker_Filesintflash.ld”文件及“.CPUvectors.c”文件可得出48個(gè)中斷向量的占位符號(hào)的存儲(chǔ)地址(中斷向量表)。 2)中斷向量表內(nèi)容的理解 中斷向量表第1行“&_BOOT_STACK_ADDRESS ”,即0 x00
54、000000-0 x00000003地址內(nèi)容為:0 x20003000(在鏈接文件中)。第2行“BOOT_START,”,即地址0 x00000004-0 x00000007地址內(nèi)容為:?jiǎn)?dòng)函數(shù)startup的首地址。隨后地址依次存放各中斷例程的起始地址。 3)程序執(zhí)行過(guò)程分析 芯片上電 SP=Flash中0 x00000000地址的第一個(gè)表項(xiàng)內(nèi)容 PC=之后第二個(gè)表項(xiàng)內(nèi)容 startup.c(禁用看門(mén)狗、復(fù)制中斷向量表至RAM、清零未初始化BSS數(shù)據(jù)段、將ROM中的初始化數(shù)據(jù)拷貝到RAM中、初始化系統(tǒng)時(shí)鐘、使能端口時(shí)鐘、進(jìn)入主函數(shù)main)774.6 第一個(gè)匯編語(yǔ)言工程:控制小燈閃爍第一個(gè)匯
55、編語(yǔ)言工程:控制小燈閃爍 匯編語(yǔ)言編程給人的第一種感覺(jué)就是難,相對(duì)于匯編語(yǔ)言編程給人的第一種感覺(jué)就是難,相對(duì)于C語(yǔ)言語(yǔ)言編程,匯編在編程的直觀(guān)性、編程效率、以及可讀性等方面編程,匯編在編程的直觀(guān)性、編程效率、以及可讀性等方面都有所欠缺,但掌握基本的匯編語(yǔ)言編程方法是嵌入式學(xué)習(xí)都有所欠缺,但掌握基本的匯編語(yǔ)言編程方法是嵌入式學(xué)習(xí)的基本功,可以增加嵌入式編程者的的基本功,可以增加嵌入式編程者的“內(nèi)力內(nèi)力”。 匯編工程通常包含芯片相關(guān)的程序框架文件、軟件構(gòu)件匯編工程通常包含芯片相關(guān)的程序框架文件、軟件構(gòu)件文件、工程設(shè)置文件、主程序文件及抽象構(gòu)件文件等。文件、工程設(shè)置文件、主程序文件及抽象構(gòu)件文件等。
56、784.6.1 匯編工程文件的組織匯編工程文件的組織 本匯編工程類(lèi)似本匯編工程類(lèi)似C工程,工程,仍然按構(gòu)件方式進(jìn)行組織。仍然按構(gòu)件方式進(jìn)行組織。匯編工程僅包含一個(gè)匯編主程匯編工程僅包含一個(gè)匯編主程序文件,該文件名固定為序文件,該文件名固定為main.s。匯編程序的主體要盡。匯編程序的主體要盡可能簡(jiǎn)潔、清晰、明了,程序可能簡(jiǎn)潔、清晰、明了,程序中的其余功能,盡量由子程序中的其余功能,盡量由子程序去完成,主程序主要完成對(duì)子去完成,主程序主要完成對(duì)子程序的循環(huán)調(diào)用。主程序文件程序的循環(huán)調(diào)用。主程序文件main.s,包含有:,包含有: (1)工程描述)工程描述 (2)總頭文件)總頭文件 (3)主程序)主程序 (4)內(nèi)部直接調(diào)用子程序)內(nèi)部直接調(diào)用子程序 (5)外部子程序)外部子程序794.6.2 Light構(gòu)件匯編程序構(gòu)件匯編程序light.s Light構(gòu)件用于控制指示燈的亮或暗。包括小燈初始化程構(gòu)件用于控制指示燈的亮
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)品買(mǎi)賣(mài)合同書(shū)
- 康雙的離婚協(xié)議書(shū)
- 三農(nóng)村生態(tài)建設(shè)實(shí)施指南
- 工程監(jiān)理承包合同
- 云計(jì)算在企業(yè)IT架構(gòu)中應(yīng)用教程
- 運(yùn)動(dòng)訓(xùn)練方法與技巧指南
- 軟件測(cè)試流程與質(zhì)量保障作業(yè)指導(dǎo)書(shū)
- 臨設(shè)工程勞務(wù)分包合同
- 網(wǎng)絡(luò)安全威脅防范與應(yīng)對(duì)作業(yè)指導(dǎo)書(shū)
- 鋼渣購(gòu)銷(xiāo)合同
- 無(wú)錫商業(yè)職業(yè)技術(shù)學(xué)院雙高建設(shè)申報(bào)書(shū)
- 2024年秋新北師大版七年級(jí)上冊(cè)數(shù)學(xué)教學(xué)課件 3.1.1 代數(shù)式
- 環(huán)境檢測(cè)實(shí)驗(yàn)室分析人員績(jī)效考核方案
- 全過(guò)程工程咨詢(xún)管理服務(wù)方案
- YYT 0681.4-2010 無(wú)菌醫(yī)療器械包裝試驗(yàn)方法 第4部分 染色液穿透法測(cè)定透氣包裝的密封泄漏
- 《麻風(fēng)病防治知識(shí)》課件
- 經(jīng)典誦讀演講稿6篇
- 鄉(xiāng)村醫(yī)生返聘協(xié)議書(shū)
- 2024機(jī)械買(mǎi)賣(mài)協(xié)議
- 當(dāng)代世界經(jīng)濟(jì)與政治 第八版 課件 第四章 發(fā)展中國(guó)家的經(jīng)濟(jì)與政治
- 2024-2030年中國(guó)汽車(chē)安全氣囊行業(yè)發(fā)展形勢(shì)分析及投資規(guī)劃分析報(bào)告
評(píng)論
0/150
提交評(píng)論