嵌入式系統(tǒng)復(fù)習(xí)資料解讀_第1頁
嵌入式系統(tǒng)復(fù)習(xí)資料解讀_第2頁
嵌入式系統(tǒng)復(fù)習(xí)資料解讀_第3頁
嵌入式系統(tǒng)復(fù)習(xí)資料解讀_第4頁
嵌入式系統(tǒng)復(fù)習(xí)資料解讀_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第1章嵌入式系統(tǒng)導(dǎo)論嵌入式系統(tǒng)的概念:是以現(xiàn)代計(jì)算機(jī)技術(shù)為基礎(chǔ),以應(yīng)用為中心,可以根據(jù)系統(tǒng)或用戶需求(功能、可靠性、成本、體積、功耗、環(huán)境等),靈活裁剪軟硬件模塊的專用計(jì)算機(jī)系統(tǒng)。嵌入式系統(tǒng)的分類及分類依據(jù):嵌入式系統(tǒng)由硬件和軟件兩大部分組成,用于實(shí)現(xiàn)對(duì)其他設(shè)備的控制、監(jiān)視或管理等功能。前者是整個(gè)系統(tǒng)的物理基礎(chǔ),它提供軟件運(yùn)行平臺(tái)和通信接口;后者實(shí)際控制系統(tǒng)的運(yùn)行。硬件:嵌入式微處理器、外圍電路、外圍硬件設(shè)備。軟件:BootLoader、嵌入式操作系統(tǒng)、用戶的應(yīng)用程序等。幾種典型嵌入式操作系統(tǒng):(1)uC/OSII(2)uCLinux(3)WindowsCE(4)嵌入式Linux等任務(wù)調(diào)度:任務(wù)的調(diào)度有三種方式:可搶占式、不可搶占式和時(shí)間片輪轉(zhuǎn)?!静豢蓳屨际秸{(diào)度是指一個(gè)任務(wù)一旦獲得CPU就獨(dú)占其運(yùn)行,除非由于某種原因使它決定放棄CPU的使用權(quán);可搶占式調(diào)度是基于任務(wù)優(yōu)先級(jí)的,當(dāng)前正在運(yùn)行的任務(wù)可以隨時(shí)讓位給優(yōu)先級(jí)更高的處于就緒態(tài)的其他任務(wù);當(dāng)兩個(gè)或兩個(gè)以上任務(wù)有同樣的優(yōu)先級(jí)時(shí),不同任務(wù)輪轉(zhuǎn)使用CPU,直到系統(tǒng)分配的CPU時(shí)間片用完,這就是時(shí)間片輪轉(zhuǎn)調(diào)度?!磕壳?,大多數(shù)嵌入式操作系統(tǒng)對(duì)不同優(yōu)先級(jí)的任務(wù)采用基于優(yōu)先級(jí)的可搶占式調(diào)度法,對(duì)相同優(yōu)先級(jí)的任務(wù)則米用時(shí)間片輪轉(zhuǎn)調(diào)度法。針對(duì)有內(nèi)存管理單元(MMU,MemoryManagementUnit)的處理器而設(shè)計(jì)的一些桌面操作系統(tǒng),如Windows.Linux,使用了虛擬存儲(chǔ)器的概念。計(jì)算機(jī)的發(fā)展:馮諾依曼架構(gòu):將指令和數(shù)據(jù)存放在同一存儲(chǔ)空間中,統(tǒng)一編址,指令和數(shù)據(jù)通過同一總線訪問。哈佛結(jié)構(gòu)(馮諾依曼架構(gòu)的擴(kuò)展):主要特點(diǎn)是程序和數(shù)據(jù)存儲(chǔ)在不同的存儲(chǔ)空間中,即程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器是兩個(gè)相互獨(dú)立的存儲(chǔ)器,每個(gè)存儲(chǔ)器獨(dú)立編制、獨(dú)立訪問。CortexM3Cortex系列按嵌入式系統(tǒng)的典型應(yīng)用分類:Cortex-A:高性能(HighPerformance),[針對(duì)日益增長(zhǎng)的運(yùn)行Linux、WinCE、Symbian等操作系統(tǒng)在內(nèi)的消費(fèi)者娛樂和無線產(chǎn)品設(shè)計(jì)與實(shí)現(xiàn)?!緾ortex-M:微控制器類(Microcontroller),【針對(duì)應(yīng)用系統(tǒng)對(duì)功耗、成本敏感,同時(shí)對(duì)微處理器性能要求較高的工業(yè)領(lǐng)域(汽車、家電、醫(yī)療器械等)?!緾ortex-R:【實(shí)時(shí)類(RealTime),針對(duì)實(shí)時(shí)性要求較高的領(lǐng)域,可以運(yùn)行RTOS?!緾ortex-W:【W(wǎng)ireless】Cortex指令完全采用Thumb-2體系架構(gòu)。第2章Cortex-M3內(nèi)核原理Cortex-M3是ARM公司推出的新一代32位低成本、高性能通用微控制器內(nèi)核。Cortex-M3體系結(jié)構(gòu):Cortex-M3處理器主要由兩大部分組成:Cortex-M3內(nèi)核:中央處理器核心(Cortex-M3Core嵌套向量中斷控制器(NVIC)系統(tǒng)時(shí)鐘(SYSTICK)存儲(chǔ)器保護(hù)單元(MPU)總線調(diào)試系統(tǒng)AMBA總線:(1)AHB:AdvancedHighPerformanceBus,用于高性能系統(tǒng)模塊的連接,支持突發(fā)模式數(shù)據(jù)傳輸和事務(wù)(ACID:原子性、一致性、隔離性和持久性)分割;(2)ASB:AdvancedSystemBus,也用于高性能系統(tǒng)模塊的連接,支持突發(fā)模式數(shù)據(jù)傳輸,這是較老的系統(tǒng)總線格式,后來由AHB總線替代;(3)APB:AdvancedPeriPheralBus,用于較低性能外設(shè)的簡(jiǎn)單連接,一般是接在AHB或ASB系統(tǒng)總線上的第二級(jí)總線。(4)Cortex-M3內(nèi)核是典型的32位處理器內(nèi)核:內(nèi)部數(shù)據(jù)路徑寬度為32位,寄存器寬度為32位,存儲(chǔ)器接口寬度也是32位,-Cortex-M3內(nèi)核擁有獨(dú)立的指令總線和數(shù)據(jù)總線,其尋址能力均為4G,且共享同一個(gè)存儲(chǔ)器空間,取指與數(shù)據(jù)訪問可同時(shí)進(jìn)行。Cortex-M3寄存器:(1).低組寄存器(R0?R7)【所有指令均能訪問,字長(zhǎng)為32位,復(fù)位后的初始值是隨機(jī)的。絕大多數(shù)16位Thumb指令只能訪問R0~R7?!浚?).高組寄存器(R8~R12)【只有很少的16位Thumb指令能訪問,32位指令則不受限制,復(fù)位后的初始值是隨機(jī)的?!浚?).堆棧寄存器(R13)又稱“堆棧指針SP”【Cortex-M3處理器內(nèi)核有兩個(gè)堆棧,但這兩個(gè)寄存器不會(huì)同時(shí)生效,根據(jù)系統(tǒng)運(yùn)行狀態(tài)進(jìn)行堆棧切換,以保證程序運(yùn)行的快速性、安全性等要求?!恐鞫褩V羔槪∕SP),或?qū)懽鱏P_main?!救笔《褩V羔?,它由OS內(nèi)核、異常服務(wù)例程以及所有需要特權(quán)訪問的應(yīng)用程序代碼來使用?!窟M(jìn)程堆棧指針(PSP),或?qū)懽鱏P_process?!居糜诔R?guī)的應(yīng)用程序代碼(不處于異常服務(wù)例程中時(shí))?!吭谙到y(tǒng)連接結(jié)構(gòu)中,通常借助AHB-APB橋?qū)崿F(xiàn)內(nèi)核內(nèi)部高速總線到外部低速總線的數(shù)據(jù)緩沖和轉(zhuǎn)換。Cortex-M3是一個(gè)32位處理器,支持4GB存儲(chǔ)空間,與ARM架構(gòu)相比,有很多優(yōu)點(diǎn):預(yù)定義存儲(chǔ)器映射和總線配置;支持"位帶(bit-band)”操作;支持非對(duì)齊訪問和互斥訪問;支持小端和大端兩種存儲(chǔ)格位帶操作:概念:位帶操作,只適用于數(shù)據(jù)訪問,不適用于取指。通過位帶的功能,可以把多個(gè)布爾型數(shù)據(jù)打包在單一的字中,卻依然可以從位帶別名區(qū)中,像訪問普通內(nèi)存一樣地使用它們。位帶別名區(qū)中的訪問操作是原子的,消滅了傳統(tǒng)的“讀一改一寫”三步曲以及由此產(chǎn)生的被中斷的可能。為什么采用位帶操作?可以顯著提高位操作的效率和安全性,對(duì)許多底層軟件開發(fā)特別是操作系統(tǒng)和驅(qū)動(dòng)程序具有重要意義。片內(nèi)外設(shè)區(qū)(Peripheral,0x40000000~0x5FFFFFFF,512MB)外部RAM區(qū)(ExternalRam,0x60000000~0x9FFFFFFF,256KB)外部設(shè)備區(qū)(ExternalDevice,0xA0000000~0xDFFFFFFF,768KB)(4)映射公式:bit_word_addr=bit_band_alias_base+(byte_offsetX32)+(bit_numberX4)-bit_word_addr是別名存儲(chǔ)器區(qū)中字的地址,它映射到某個(gè)目標(biāo)位。-bit_band_alias_base是別名區(qū)的基址,即起始地址。-byte_offset是包含目標(biāo)位的字節(jié)在位帶區(qū)里的序號(hào)。-bit_number是位帶區(qū)目標(biāo)位所在字節(jié)中的位置(0-7)。(5)例題:例1:位帶區(qū)SRAM地址為0x20000300的字節(jié)中的位2,其位帶別名區(qū)的映射地?【答案】?=0x22000000+(0x300*32)+(2*4).0x22006008=0x22000000+(0x300*32)+(2*4).?對(duì)0x22006008地址的寫操作和對(duì)SRAM中地址0x20000300字節(jié)的位2執(zhí)行“讀一改一寫”操作有著相同的效果。例2:地址?的別名字映射為0x200FFFFF的bit-band字節(jié)的位0:地址?的別名字映射為0x200FFFFF的bit-band字節(jié)的位7:地址?的別名字映射為0x20000000的bit-band字節(jié)的位0:地址?的別名字映射為0x20000000的bit-band字節(jié)的位7:【答案】地址0x23FFFFE0的別名字映射為0x200FFFFF的bit-band字節(jié)的位0:0x23FFFFE0=0x22000000+(0xFFFFF*32)+0*4地址0x23FFFFEC的別名字映射為0x200FFFFF的bit-band字節(jié)的位7:0x23FFFFEC=0x22000000+(0xFFFFF*32)+7*4地址0x22000000的別名字映射為0x20000000的bit-band字節(jié)的位0:0x22000000=0x22000000+(0*32)+0*4地址0x220001C的別名字映射為0x20000000的bit-band字節(jié)的位7:0x2200001C=0x22000000+(0*32)+7*4例2圖示:S2MBaliasregion|血二;卜卜卜卜卜相心.;卜11卜7〔心阡卜卜卜口(心泗心4心FFF心iy:"FFW

-怎樣利用“位帶操作”進(jìn)行位帶區(qū)的“讀一改一寫”呢?例3:欲設(shè)置地址0x20000000中的比特2。不使用位帶功能讀取皈MODOOOO處前值到寄停箸中>16善存者的d寫回到OxWOOJJg。使用位帶功就讀取脆0。0_016善存者的d寫回到OxWOOJJg。使用位帶功就讀取脆0。0_0。0。處的值到內(nèi)畝繾沖區(qū)位蘇Bit?后.再把值與回睥。。。_。0。0【答案】WithoutBit-BandWithBit-BandLDRR0,=0x20000000;SetupaddressLDRR1,[R0];ReadORR.WR1,#0x4;ModifybitSTRR1,[R0];WritebackresultLDRR0,=0x22000008;SetupaddressMOVR1,#1;SetupdataSTRR1,[R0];Write假如在(位帶區(qū))地址0x20000000處的字為0x3355AACC,要求對(duì)bit2清零。【答案】-無位帶LDRR0,=0x20000000;建立地址LDRR1,[R0];ReadAND.WR1,#0xFFFFFFFB;bit2清零STRR1,[R0];writebackresult-有位帶LDRR0,=0x22000008;建立地址MoveR1,0;SetupDataSTRR1,[R0];writebackresult【解答】①讀取地址0x22000008。本次讀訪問將讀取0x20000000,并提取比特2,值為1。往地址0x22000008處寫0。本次操作將被映射成對(duì)地址0x20000000的“讀一改一寫”操作(原子操作),把比特2清0?,F(xiàn)在再讀取0x20000000,將返回0x3355AAC8(bit[2]已清零)。

工作模式-Cortex-M3支持兩種模式和兩個(gè)特權(quán)等級(jí)。異常handler代碼主應(yīng)用程序代碼異常handler代碼主應(yīng)用程序代碼處理模式(handlermode)用法錯(cuò)誤線程模式(threadmode)線程模式(threadmode)特權(quán)級(jí)用戶級(jí)RESETCortex-M3處理器的工作模式和特權(quán)等級(jí)共有三種配合。線程模式+用戶級(jí)線程模式+特權(quán)級(jí)Handler模式+特權(quán)級(jí)中斷:中斷的概念:所謂中斷,是指CPU對(duì)系統(tǒng)內(nèi)、外發(fā)生的某個(gè)事件的一種響應(yīng)過程,或者說“一種機(jī)制”,即CPU暫時(shí)停止現(xiàn)行程序的執(zhí)行,自動(dòng)轉(zhuǎn)去執(zhí)行預(yù)先安排好的處理該事件的服務(wù)子程序;當(dāng)處理結(jié)束后,再返回到被暫停的程序的斷點(diǎn)處,繼續(xù)執(zhí)行原來的程序。什么是中斷向量表?Cortex-M3擁有一張向量表,用于在發(fā)生中斷并作出響應(yīng)時(shí),從表中查詢與中斷對(duì)應(yīng)的處理例程的入口地址向量。Cortex-M3內(nèi)核集成了中斷控制器——嵌套向量中斷控制器NVIC(NestedVectoredInterruptController)o中斷優(yōu)先級(jí):Cortex-M3除配置優(yōu)先級(jí)外,還通過把256級(jí)優(yōu)先級(jí)分為搶占優(yōu)先級(jí)和亞優(yōu)先級(jí)支持最多128個(gè)搶占級(jí)。優(yōu)先級(jí)分組規(guī)定:亞優(yōu)先級(jí)至少是1位,因此搶占優(yōu)先級(jí)最多是7位,128級(jí)搶占優(yōu)先級(jí)。第3章STM32固件庫介紹CMSIS-外設(shè)訪問層的文件獨(dú)立于編譯器的文件:?Cortex-M3內(nèi)核及其設(shè)備文件(core_cm3.h+core_cm3.c)-訪問Cortex-M3內(nèi)核及其設(shè)備:NVIC,SysTick等-訪問Cortex-M3的CPU寄存器和內(nèi)核外設(shè)的函數(shù)?微控制器專用頭文件(device.h)-指定中斷號(hào)碼(與啟動(dòng)文件一致)-外設(shè)寄存器定義(寄存器的基地址和布局)-控制微控制器其他特有的功能的函數(shù)(可選)?微控制器專用系統(tǒng)文件(system_device.c)-函數(shù)SystemInit,用來初始化微控制器-函數(shù)Sysem_ExtMemCtl,用來配置外部存儲(chǔ)器控制器。它位于文件startup_stm32f10x_xx.s/.c,在跳轉(zhuǎn)到main前調(diào)用-SystemFrequncy,該值代表系統(tǒng)時(shí)鐘頻率-微控制器的其他功能(可選)編譯器供應(yīng)商+微控制器專用啟動(dòng)文件-編譯器啟動(dòng)代碼(匯編或者C)(startup_device.s)-微控制器專用的中斷處理程序列表(與頭文件一致)-弱定義(Weak)的中斷處理程序默認(rèn)函數(shù)(可以被用戶代碼覆蓋)CMSIS文件名的定義標(biāo)準(zhǔn)core_cm3.hCortex-M3globaldeclarationsanddefinitions,staticfunctiondefinitionscore_cm3.cCortex-M3globaldefinitions-<device>.hTop-levelheaderfile(devicespecific).Tobeincludedbyapplicationcode.Includescore_cm3.handsystem_<device>.h-system_<device>.hDevicespecificdeclarations-system_<device>.cDevicespecificdefinitions,e.g.SystemInit()【我也不知道上面到底哪個(gè)是要考的-_-|||】第4章基于Cortex-M3的STM32F10X“最小系統(tǒng)”最小系統(tǒng):(1)“最小系統(tǒng)”的概念:在盡可能減少上層應(yīng)用的情況下,能夠使系統(tǒng)運(yùn)行的最小化模塊配置。對(duì)于當(dāng)前的大多數(shù)微控制器而言,“最小系統(tǒng)”稱為“嵌入式核心控制模塊”似乎更貼切一些。(2)最小系統(tǒng)的組成:電源、②時(shí)鐘、③復(fù)位電路、④存儲(chǔ)系統(tǒng)、⑤調(diào)試系統(tǒng)?時(shí)鐘模塊一一通常經(jīng)ARM內(nèi)部鎖相環(huán)進(jìn)行相應(yīng)的倍頻,以提供系統(tǒng)各模塊運(yùn)行所需的時(shí)鐘頻率輸入Flash存儲(chǔ)模塊——存放啟動(dòng)代碼、操作系統(tǒng)和用戶應(yīng)用程序代碼SDRAM模塊一一為系統(tǒng)運(yùn)行提供動(dòng)態(tài)存儲(chǔ)空間,是系統(tǒng)代碼運(yùn)行的主要區(qū)域JTAG模塊一一實(shí)現(xiàn)對(duì)程序代碼的下載和調(diào)試UART模塊一一實(shí)現(xiàn)對(duì)調(diào)試信息的終端顯示?復(fù)位模塊一一實(shí)現(xiàn)對(duì)系統(tǒng)的復(fù)位(3)嵌入式最小系統(tǒng)的核心部分:Cortex-M3微處理器、FLASH和SDRAM模塊STM32F103處理器系統(tǒng)頻率為72MHz,處理器性能可達(dá)到90DMIPS,此時(shí)Cortex-M3功耗約14W左右。系統(tǒng)復(fù)位:系統(tǒng)復(fù)位將清除時(shí)鐘控制器CSR中的復(fù)位標(biāo)志和備用域寄存器之外的所有寄存器。STM32內(nèi)含復(fù)位電路支持,當(dāng)任意一個(gè)下列事件發(fā)生時(shí)都將引起系統(tǒng)自動(dòng)復(fù)位:NRST引腳出現(xiàn)低電平(外部復(fù)位);看門狗計(jì)時(shí)器計(jì)時(shí)終止(WWDG復(fù)位);獨(dú)立看門狗計(jì)數(shù)終止(IWDG復(fù)位);軟件復(fù)位(SW復(fù)位);低功耗管理復(fù)位??赏ㄟ^查詢控制/狀態(tài)寄存器RCC_CSR中的復(fù)位標(biāo)志來識(shí)別復(fù)位源。電壓調(diào)壓器電壓調(diào)壓器的三種操作模式:主模式(MR):又稱“運(yùn)行模式(RunMode)”或“調(diào)節(jié)模式”,用于CPU正常的運(yùn)行操作,以正常功耗模式,向內(nèi)核、內(nèi)存、外設(shè)供給1.8V電源。低功耗模式(LPR):又稱“停止(機(jī))模式(StopMode)?”,當(dāng)CPU無任務(wù)需要處理時(shí),以低功耗模式供1.8V電源,以保持SRAM、寄存器等的內(nèi)容。一般可以根據(jù)最低電源消耗、最快速啟動(dòng)時(shí)間和可用的喚醒源等條件,選定最佳低功耗模式。掉電(關(guān)斷)模式:用于CPU"待機(jī)模式(StandbyMode)”,調(diào)壓器的輸出為高阻狀態(tài),停止內(nèi)核電路供電,調(diào)壓器處于零消耗狀態(tài),除待機(jī)電路和備份域外,寄存器和SRAM的內(nèi)容將丟失。有時(shí),該模式被歸為“低功耗模式”的一種。GPIO模塊(1)GPIO(GeneralPurposeInputOutput,通用I/O)接口模塊,可以為CPU提供數(shù)字輸入輸出功能。(2)可以對(duì)通過軟件對(duì)GPIO接口進(jìn)行靈活配置和操縱,包括:①輸入輸出的方向配置②引腳功能復(fù)用引腳的重新映射④是否可以申請(qǐng)中斷⑤PWM輸出等(3)STM32F10X系列產(chǎn)品的GPIO模塊,可以進(jìn)行輸入輸出等功能的配置。共8種模式:①入浮空輸入:In_Floating②上拉入輸入:IPU(InPush_Up)下拉入輸入:IPD(InPush_Down)④入模擬輸入:AIN(AnalogIn)開漏出輸出:OUT_OD(OD:Open-Drain)推挽出輸出:OUT_PP(PP:Push-Pull)復(fù)用功能推挽出輸出:AF_PP⑧復(fù)用功能開漏出輸出:AF_OD(4)通過I/O端口配置方式降低功耗?:?如果需要減小I/O端曰的電流消耗,可以根據(jù)具體情況配置I/。端曰的狀態(tài):>輸入端11今配置為浮空輸入>帶外部上拉的輸出端II9配置為推挽輸出并輸出T>帶外部下拉的輸出端II今配置為推挽輸出并輸出O>未用的懸空端II今配置為推挽輸出并輸出T?:?未用的內(nèi)部外設(shè):>保持為關(guān)閉和默認(rèn)的復(fù)位狀態(tài):ON=、人□不要進(jìn)行重映射IpiLp□復(fù)位寄存器|UrRV?RCC_APB1RSTR和RCC_APB2RSTR|||\1>關(guān)閉對(duì)應(yīng)的時(shí)鐘OFF□時(shí)鐘使能寄存器:RCC_AHBENR、RCC_APB2ENRfnRCC_APB1ENRGPIO復(fù)用功能為了使不同器件封裝的外設(shè)I/O功能的數(shù)量達(dá)到最優(yōu),可以把一些復(fù)用功能重新映射到其他一些引腳上。這可以通過軟件配置相應(yīng)的寄存器來完成(參考AFIO寄存器描述)。這時(shí),復(fù)用功能就不再映射到它們的原始引腳上了。GPIO的配置?先看GPIO.h文件typedefenum(GPIO_Speed_10MHz=1,GPIO_Speed_2MHz,GPIO_Speed_50MHz}GPIOSpeed_TypeDef;#defineIS_GPIO_SPEED(SPEED)(((SPEED)==GPIO_Speed_10MHz)||((SPEED)==GPIO_Speed_2MHz)||\((SPEED)==GPIO_Speed_50MHz))typedefenum(GPIO_Mode_AIN=0x0,GPIO_Mode_IN_FLOATING=0x04,GPIO_Mode_IPD=0x28,GPIO_Mode_IPU=0x48,GPIO_Mode_Out_OD=0x14,GPIO_Mode_Out_PP=0x10,GPIO_Mode_AF_OD=0x1C,GPIO_Mode_AF_PP=0x18}GPIOMode_TypeDef;#defineIS_GPIO_MODE(MODE)(((MODE)==GPIO_Mode_AIN)||((MODE)==GPIO_Mode_IN_FLOATING)||\((MODE)==GPIO_Mode_IPD)||((MODE)==GPIO_Mode_IPU)||\((MODE)==GPIO_Mode_Out_OD)||((MODE)==GPIO_Mode_Out_PP)||\((MODE)==GPIO_Mode_AF_OD)||((MODE)==GPIO_Mode_AF_PP))typedefstruct(uint16_tGPIO_Pin;/*!<SpecifiestheGPIOpinstobeconfigured.Thisparametercanbeanyvalueof@refGPIO_pins_define*/GPIOSpeed_TypeDefGPIO_Speed;/*!<Specifiesthespeedfortheselectedpins.Thisparametercanbeavalueof@refGPIOSpeed_TypeDef*/GPIOMode_TypeDefGPIO_Mode;/*!<Specifiestheoperatingmodefortheselectedpins.Thisparametercanbeavalueof@refGPIOMode_TypeDef*/}GPIO_InitTypeDef;typedefenum(Bit_RESET=0,Bit_SET}BitAction;voidGPIO_DeInit(GPIO_TypeDef*GPIOx);voidGPIO_AFIODeInit(void);voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct);uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);uint16_tGPIO_ReadInputData(GPIO_TypeDef*GPIOx);uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);uint16_tGPIO_ReadOutputData(GPIO_TypeDef*GPIOx);voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal);voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal);voidGPIO_PinLockConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);voidGPIO_EventOutputConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);voidGPIO_EventOutputCmd(FunctionalStateNewState);voidGPIO_PinRemapConfig(uint32_tGPIO_Remap,FunctionalStateNewState);voidGPIO_EXTILineConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);voidGPIO_ETH_MediaInterfaceConfig(uint32_tGPIO_ETH_MediaInterface);?再看GPIO.C文件voidGPIO_DeInit(GPIO_TypeDef*GPIOx)(/*Checktheparameters*/assert_param(IS_GPIO_ALL_PERIPH(GPIOx));if(GPIOx==GPIOA)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,DISABLE);}elseif(GPIOx==GPIOB)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB,DISABLE);}elseif(GPIOx==GPIOC)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC,DISABLE);}elseif(GPIOx==GPIOD)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD,DISABLE);}elseif(GPIOx==GPIOE)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE,DISABLE);}elseif(GPIOx==GPIOF)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF,DISABLE);}else(if(GPIOx==GPIOG)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG,DISABLE);}}}?最后看GPIO_test工程的main.c文件#include"stm32f10xlib.h"GPIO_InitTypeDefGPIO_InitStructure;ADC_InitTypeDefADC_InitStructure;DMA_InitTypeDefDMA_InitStructure;EXTI_InitTypeDefEXTI_InitStructure;ErrorStatusHSEStartUpStatus;externvu32TimingDelay;/*Privatefunctionprototypes*/voidRCC_Configuration(void);voidNVIC_Configuration(void);voidGPIO_Configuration(void);voidDelay(vu32nTime);voidSysTick_Configuration(void);voidSetupLED(void);externvoidSetupADC(void);intmain(void)(/*ConfiguretheGPIOports*/GPIO_Configuration();for(;;)(GPIOC->ODR=0xfffffc4f;Delay(800);GPIOC->ODR=0xfffffc8f;Delay(800);GPIOC->ODR=0xfffffd0f;Delay(800);GPIOC->ODR=0xfffffe0f;Delay(800);}}voidGPIO_Configuration(void)(GPIO_InitTypeDefGPIO_InitStructure;/*ConfigurePC.asOutputpush-pull*/GPIO_InitStructure.GPIO_PinGPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOC,&GPIO_InitStructure);/*ConfigurePB9asinputfloating(EXTILine9)*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB,&GPIO_InitStructure);}NVIC中斷程序配置-硬件中斷選擇:通過下面的過程來配置19個(gè)線路做為中斷源:(1)配置19個(gè)中斷線的屏蔽位((EXTI_IMR));(2)配置所選中斷線的觸發(fā)選擇位((EXTI_RTSR和EXTI_FTSR));(3)配置那些控制映像到外部中斷控制器(EXTI)的NVIC中斷通道的使能和屏蔽位,使得19個(gè)中斷線中的請(qǐng)求可以被正確地響應(yīng)。-硬件事件選擇:通過下面的過程,可以配置19個(gè)線路為事件源(1)配置19個(gè)事件線的屏蔽位((EXTI_EMR)(2)配置事件線的觸發(fā)選擇位((EXTI_RTSRandEXTI_FTSR)-軟件中斷/事件的選擇:19個(gè)線路可以被配置成軟件中斷/事件線。下面是產(chǎn)生軟件中斷的過程:配置19個(gè)中斷/事件線屏蔽位((EXTI_IMR,EXTI_EMR)設(shè)置軟件中斷寄存器的請(qǐng)求位((EXTI_SWIER)總中斷控制函數(shù).身在STM32固件庫中(stm32flOx_nvic.cfustm32flOx_nvic.h)定義了四個(gè)函數(shù)操作PRIMASKR和FAULTMASK位,改變CPU的當(dāng)前優(yōu)先級(jí),從而達(dá)到控制所有中斷的目的。皆下面兩個(gè)函數(shù)等效于關(guān)閉總中斷:voidNVIC_SETPRIMASK(void):voidNVIC_SETFAULTMASK(void);宙下面兩個(gè)函數(shù)等效于開放總中斷:voidNVIC_RESETPRIMASK(void);voidNVIC_RESETFAULTMASK(void):宙注意事項(xiàng)國上面兩組函數(shù)要成對(duì)使用,不能交又伯管STM32中的中斷源很多,最好能夠安排好分頭控制,不建議這樣控制.在STM32F103中,三個(gè)不同的時(shí)鐘源可以用來驅(qū)動(dòng)系統(tǒng)時(shí)鐘(SYSCLK):HSI晶振時(shí)鐘(高速內(nèi)部時(shí)鐘信號(hào));HSE晶振時(shí)鐘(高速外部時(shí)鐘信號(hào));PLL時(shí)鐘。內(nèi)部8個(gè)定時(shí)器,分三類:通用定時(shí)器(GeneralPurposeTimers):TIM2-TIM5基本定時(shí)器(BasicTimers):TIM6、TIM7高級(jí)定時(shí)器(AdvancedControlTimers)TIM1、TIM8(大容量STM32F103/107獨(dú)有)定時(shí)器可以作為計(jì)數(shù)器使用,區(qū)別在于:定時(shí)器使用微控制器的時(shí)鐘來計(jì)數(shù)計(jì)數(shù)器使用的是外部信號(hào)計(jì)數(shù)【從功能上來看:基本定時(shí)器是通用定時(shí)器的子集,通用定時(shí)器又是高級(jí)定時(shí)器的子集?!慷〞r(shí)器的計(jì)數(shù)模式:向上計(jì)數(shù)模式:從0遞增,計(jì)到TIMx_ARR計(jì)數(shù)器的自動(dòng)裝載值,并產(chǎn)生計(jì)數(shù)溢出脈沖;向下計(jì)數(shù)模式:從TIMx_ARR計(jì)數(shù)器的自動(dòng)裝載值遞減,計(jì)到0,并產(chǎn)生計(jì)數(shù)溢出脈沖;中心對(duì)稱計(jì)數(shù)模式:從0遞增,計(jì)到TIMx_ARR計(jì)數(shù)器的自動(dòng)裝載值,并產(chǎn)生計(jì)數(shù)溢出脈沖;然后,從TIMx_ARR計(jì)數(shù)器的自動(dòng)裝載值遞減,計(jì)到0,又產(chǎn)生計(jì)數(shù)溢出脈沖;之后又從0開始循環(huán)計(jì)數(shù)。定時(shí)器的設(shè)置:#include"stm32f10x_heads.h"#include"HelloRobot.h"voidTimx_Init(void);intmain(void)(BSP_Init();Timx_Init();//定時(shí)器初始化函數(shù)while(1);}voidTimx_Init(void)(TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_DeInit(TIM2);//復(fù)位TIM2定時(shí)器TIM_TimeBaseStructure.TIM_Period=35999;TIM_TimeBaseStructure.TIM_Prescaler=1999;TIM_TimeBaseStructure.TIM_ClockDivision=0x0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);TIM_ClearFlag(TIM2,TIM_FLAG_Update);/*ClearTIM2updatependingflag[清除TIM2溢出中斷標(biāo)志]*/TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);/*EnableTIM2Updateinterrupt[TIM2溢出中斷允許]*/TIM_Cmd(TIM2,ENABLE);/*TIM2enablecounter[允許tim2計(jì)數(shù)]*/在stm32f10x_it.c文件里,添加TIM2_IRQHandler(void)中斷函數(shù)即可實(shí)現(xiàn)中斷計(jì)時(shí)響應(yīng)。voidTIM2_IRQHandler(void)(if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==0)GPIO_SetBits(GPIOC,GPIO_Pin_13);elseGPIO_ResetBits(GPIOC,GPIO_Pin_13);TIM_ClearFlag(TIM2,TIM_FLAG_Update);/*ClearTIM2updatependingflag[清除TIM2溢出中斷標(biāo)志]*/}第5章STM32F10X主要模塊ADC:模擬/數(shù)字轉(zhuǎn)換(A/D變換)負(fù)責(zé)將連續(xù)的模擬信號(hào)變?yōu)閷?duì)應(yīng)的離散數(shù)值表示,以方便CPU的處理,完成這一功能的部件因此也就被稱為模擬/數(shù)字轉(zhuǎn)換器ADC(AnalogtoDigitalConvertor)。ADC的A/D轉(zhuǎn)換方式:查詢式AD中斷式AD外部觸發(fā)式AD【查詢式AD:在查詢方式下,軟件可通過讀取ADC模塊轉(zhuǎn)換完畢引腳EOC的狀態(tài)或狀態(tài)寄存器中的轉(zhuǎn)換完成標(biāo)志位判斷本次A/D是否結(jié)束;若結(jié)束則從數(shù)據(jù)總線或數(shù)據(jù)寄存器中讀取A/D結(jié)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論