版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
word文檔可自由復制編輯STM32初級學習第一章初識Cortex-M3 21.1ARMCortex-M3處理器初探 21.2從Cortex-M3處理器內(nèi)核到基于Cortex-M3的MCU 3第二章開發(fā)環(huán)境MDK、J-link的搭建及系統(tǒng)調(diào)試 72.1JLINK驅(qū)動安裝 72.2MDK環(huán)境搭建 72.3MDK破解 11第三章如何新建工程 13第四章工程編譯及仿真、程序的下載 184.1工程編譯 194.2仿真環(huán)境的搭建 204.3JLINK下載 23第五章了解stm32庫文件 26第六章簡單例程分析 286.1流水燈介紹 286.1.1STM32的地址映射 326.1.2STM32庫對寄存器的封裝 376.1.3STM32的時鐘系統(tǒng)(程序的心臟,每個例程公共的模塊) 396.1.4流水燈例程 446.1.5仿真結果分析 486.1.6程序下載到開發(fā)板后的結果顯示 486.2系統(tǒng)滴答定時器SysTick 486.2.1實例分析 516.2.2仿真結果分析: 556.2.3程序下載 556.3EXTI外部中斷 556.3.1NVIC結構體成員 586.3.2搶占優(yōu)先級和響應優(yōu)先級 586.3.3NVIC的優(yōu)先級組 596.3.4EXTI外部中斷 606.3.5例程程序 616.4串口部分 626.4.1波特率控制 636.4.2收發(fā)控制 646.4.3數(shù)據(jù)存儲轉(zhuǎn)移部分 646.4.4實例解析 656.5ADC(DMA模式) 656.5.1ADC簡介 656.5.2STM32的ADC主要技術指標 666.5.3ADC工作過程分析 676.5.4ADC采集例程分析 68第一章初識Cortex-M31.1ARMCortex-M3處理器初探ARMCortex-M3處理器,作為Cortex系列的處女作,為了讓32位處理器入主作莊單片機市場,轟轟烈烈地誕生了!由于采用了最新的設計技術,它的門數(shù)更低,性能卻更強。許多曾經(jīng)只能求助于高級32位處理器或DSP的軟件設計,都能在CM3上跑得很快很歡。嵌入式處理器市場正在32位化,相信用不了多久,CM3就一定會在這美麗新世界中脫穎而出。下面我們共同來了解一下CM3的優(yōu)勢:?性能強大。在相同的主頻下能做處理更多的任務,全力支持勁爆的程序設計。?功耗低。延長了電池的壽命——這簡直就是便攜式設備的命門(如無線網(wǎng)絡應用)。?實時性好。采用了前衛(wèi)甚至革命性的設計理念,使它能極速地響應中斷,而且響應中斷所需的周期數(shù)是確定的。?代碼密度得到很大改善。一方面在大型應用程序優(yōu)勢,另一方面為低成本設計而省吃儉用。?使用更方便?,F(xiàn)在從8位/16位處理器轉(zhuǎn)到32位處理器之風刮得越來越猛,更簡單的編程模型和更透徹的調(diào)試系統(tǒng),為與時俱進的人們大大減負。?低成本的整體解決方案。讓32位系統(tǒng)比和8位/16位的還便宜,低端的Cortex-M3單片機甚至還賣不到1美元。?遍地開花的優(yōu)秀開發(fā)工具。免費的,便宜的,全能的開發(fā)環(huán)境。值得一提的是,CM3并不是第一個被拿去做萬金油型處理器的內(nèi)核。那廉頗雖老卻依然驍勇的ARM7/ARM9處理器,在通用嵌入式處理器市場中德高望重,至今擁有無數(shù)鐵桿粉絲。半導體業(yè)界的群英們,像NXP(philips)、TI、Atmel、OKI、ST等,都以ARM為內(nèi)核,做出了各自身懷絕技的32位MCU。ARM7作為最受歡迎的32位嵌入式處理器,被載入了亮煌煌的幾頁史冊——每年超過10億片出貨量,為各行各業(yè)的嵌入式設備中都找得到它們的身影。1.2從Cortex-M3處理器內(nèi)核到基于Cortex-M3的MCUCortex-M3處理器內(nèi)核是單片機的中央處理單元(CPU)。完整的基于CM3的MCU還需要很多其它組件。在芯片制造商得到CM3處理器內(nèi)核的使用授權后,它們就可以把CM3內(nèi)核用在自己的硅片設計中,添加存儲器,外設,I/O以及其它功能塊。Cortex-M3是一款低功耗處理器,具有門數(shù)目少,中斷延遲短,調(diào)試成本低的特點,是為要求有快速中斷響應能力的深度嵌入式應用而設計的。該處理器采用ARMv7-M架構。Cortex-M3處理器整合了以下組件:Cortex-M3的一個簡化視圖處理器內(nèi)核。這款門數(shù)目少,中斷延遲短的處理器具備以下特性:—ARMv7-M:Thumb-2ISA子集,包含所有基本的16位和32位Thumb-2指令,用于多媒體,SIMD,E(DSP)和ARM系統(tǒng)訪問的模塊除外?!挥蟹纸M的SP—硬件除法指令,SDIV和UDIV(Thumb-2指令)—處理模式(handlermode)和線程模式(threadmode)—Thumb狀態(tài)和調(diào)試狀態(tài)—可中斷-可繼續(xù)(interruptible-continued)的LDM/STM,PUSH/POP,實現(xiàn)低中斷延遲?!詣颖4婧突謴吞幚砥鳡顟B(tài),可以實現(xiàn)低延遲地進入和退出中斷服務程序(ISR)?!С諥RMv6架構BE8/LE—ARMv6非對齊訪問嵌套向量中斷控制器(NVIC)。它與處理器內(nèi)核緊密結合實現(xiàn)低延遲中斷處理,并具有以下特性:—外部中斷可配置為1~240個—優(yōu)先級位可配置為3~8位—中斷優(yōu)先級可動態(tài)地重新配置—優(yōu)先級分組。分為占先中斷等級和非占先中斷等級—支持末尾連鎖(tail-chaining)和遲來(latearrival)中斷。這樣,在兩個中斷之間沒有多余的狀態(tài)保存和狀態(tài)恢復指令的情況下,使能背對背中斷(back-to-backinterrupt)處理。—處理器狀態(tài)在進入中斷時自動保存,中斷退出時自動恢復,不需要多余的指令。存儲器保護單元(MPU)。MPU功能可選,用于對存儲器進行保護,它具有以下特性:—8個存儲器區(qū)—子區(qū)禁止功能(SRD),實現(xiàn)對存儲器區(qū)的有效使用。可使能背景區(qū),執(zhí)行默認的存儲器映射屬性??偩€接口—AHBLiteICode、DCode和系統(tǒng)總線接口—APB專用外設總線(PPB)接口—Bitband支持,bit-band的原子寫和讀訪問?!鎯ζ髟L問對齊—寫緩沖區(qū),用于緩沖寫數(shù)據(jù)。低成本調(diào)試解決方案,具有以下特性:—當內(nèi)核正在運行、被中止、或處于復位狀態(tài)時,能對系統(tǒng)中包括Cortex-M3寄存器組在內(nèi)的所有存儲器和寄存器進行調(diào)試訪問?!芯€(SW-DP)或JTAG(JTAG-DP)調(diào)試訪問,或兩種都包括?!狥lash修補和斷點單元(FPB),實現(xiàn)斷點和代碼修補?!獢?shù)據(jù)觀察點和觸發(fā)單元(DWT),實現(xiàn)觀察點,觸發(fā)資源和系統(tǒng)分析(systemprofiling)—儀表跟蹤宏單元(ITM),支持對printf類型的調(diào)試?!櫠丝诘慕涌趩卧═PIU),用來連接跟蹤端口分析儀??蛇x的嵌入式跟蹤宏單元(ETM),實現(xiàn)指令跟蹤。第二章開發(fā)環(huán)境MDK、J-link的搭建及系統(tǒng)調(diào)試2.1JLINK驅(qū)動安裝在用JLINK下載和調(diào)試程序之前,我們需要線在電腦上安裝JLINK驅(qū)動,如果電腦上已經(jīng)安裝JLINK驅(qū)動,則可跳過這一步。在野火M3光盤目錄下:3-安裝軟件\1-JLINKV8驅(qū)動點擊Setup_JLinkARM_V428c.exe,完成JLINK驅(qū)動的安裝。安裝過程非常簡單,這里將跳過。在安裝完成后,我們將JLINK插接到電腦的USB口,即可在我的電腦\管理\設備管理器\通用串行總線控制器中看到一個J-Linkdriver。要注意的是在安裝完JLINK驅(qū)動后,一定要將JLINK插接到電腦的USB口,否則在電腦的設備管理器中是查看不到J-Linkdriver的。當你把JLINK拔出電腦的USB口時候,J-Linkdriver就會消失。2.2MDK環(huán)境搭建在我們學習編寫代碼之前需要先要把MDK這個軟件安裝好,野火用的版本是V4.14,在安裝完成之后可以在工具欄help->aboutuVision選項卡中查看到版本信息。MDK是一個集代碼編輯,編譯,鏈接和下載于一體的集成開發(fā)環(huán)境(KDE)。MDK這個名字我們可能不熟悉,但說到KEIL,學過51的朋友就再熟悉不過了。后來KEIL被ARM公司收購之后就改名為MDK了,所以學過51的朋友是很快就可以熟悉這個開發(fā)環(huán)境的。在MDK安裝目錄下:3-安裝軟件\2-MDK找到MDK414.exe,點擊MDK414.exe,在彈出MDK安裝界面后,按照如下步驟操作即可。點擊Next.把對勾上,點擊Next。點擊Next,默認安裝在C:\keil目錄下。(選擇你想要安裝的路徑)在用戶名中填入名字(可隨便寫,可空格),在郵件地址那里填入郵件地址(可隨便寫,可空格),點擊Next。正在安裝,請耐心等待。點擊Finish,安裝完成。此時就可在桌面看到MDK的快捷圖標,如下所示:2.3MDK破解安裝完MDK開發(fā)環(huán)境后,在下載程序的時候會有40K的代碼限制,我們需要破解軟件即可完成大程序代碼的編譯,在軟件安裝目錄下:找到KEIL_Lic.exe,點擊KEIL_Lic.exe,如下圖所示在彈出的界面中的CID選項框中填入MDK的CID(MDK的CID在MDK開發(fā)環(huán)境中的菜單欄File\LicenseManagemant中獲取到如下面兩幅圖所示),在Target下拉框中選擇ARM,然后點擊Generate按鈕,復制產(chǎn)生的CIDCode,然后回到MDK開發(fā)環(huán)境中的菜單欄File\LicenseManagemant中,把剛剛在注冊機復制到的CIDCode粘貼到NewLicenseIDCode(LIC):框中,然后點擊AddLIC,,點擊close,大功告成:)。第三章如何新建工程開始新建工程點擊桌面UVision4圖標,啟動軟件。如果是第一次使用的話會打開一個自帶的工程文件,我們可以通過工具欄Project->CloseProject選項把它關掉。在工具欄Project->NewμVisionProject…新建我們的工程文件,我們將新建的工程文件保存在桌面的STM32-Study\Project文件夾下,文件名可以任意取(按自己意愿選擇),點擊保存。接下來的窗口是讓我們選擇公司跟芯片的型號,我們用的芯片是ST公司的STM32F103ZET6,有64KSRAM,512KFlash,屬于高集成度的芯片。按如下選擇即可。接下來的窗口問我們是否需要拷貝STM32的啟動代碼到工程文件中,這份啟動代碼在M3系列中都是適用的,一般情況下我們都點擊否,我們這里用的是ST的庫,庫文件里面也自帶了這一份啟動代碼,所以為了保持庫的完整性,我們就不需要開發(fā)環(huán)境為我們自帶的啟動代碼了,稍后我們自己手動添加,這里我們點擊否。此時我們的工程新建成功,如下圖所示。但我們的工程中還沒有任何文件,接下來我們需要在我們的工程中添加所需文件在STM32Study文件夾下,我們新建User文件夾,用來存放用戶自己創(chuàng)建的文件,然后系統(tǒng)庫文件夾,和啟動文件復制到STM32Study下,以及STM32F10xR.LIB(以上這些文件在系統(tǒng)庫中查找),添加成功后如下圖所示。在Target1上右鍵選中ManageComponents…選項,新建四個組,分別命名為lib、user、start,從名字上字面上start文件夾下存放啟動文件,user文件夾下存放用戶創(chuàng)建文件,lib存放系統(tǒng)庫文件。接下來我們往我們這些新建的組中添加文件,雙擊哪個組就可以往哪個組里面添加文件。我們在start里面添加STM32F10x.s啟動文件,在user組里面添加main.c和stm32f10x_it.c這兩個文件,在lib組里面添加STM32F10xR.LIB。注意,這些組里面添加的都是匯編文件跟C文件,頭文件是不需要添加的。最終效果如下圖:到這里工程的創(chuàng)建就完成了,接下來就是對工程的編譯和仿真,來驗證工程創(chuàng)建的是否正確,以及程序是否是我們想要看到的效果。第四章工程編譯及仿真、程序的下載在MDK界面中,我們可以看到左邊的工具欄中有三個按鈕,現(xiàn)在我們從左往右來介紹下這三個按鈕的功能。第一個按鈕:Translate就是編譯當下修改過的文件,檢查下有沒有語法錯誤,并不會去鏈接庫文件,也不會生成可執(zhí)行文件。第二個按鈕:Build就是編譯當下修改過的文件,它包含了語法檢查,鏈接動態(tài)庫文件,生成可執(zhí)行文件。第三個按鈕:Rebuild重新編譯整個工程,跟Build這個按鈕實現(xiàn)的功能是一樣的,但有所不同的是它編譯的是整個工程的所有文件,耗時較大。因此:當我們編輯好我們的程序之后,只需要用第二個Build按鈕就可以,即方便又省時。第一個跟第三個按鈕用的比較少。4.1工程編譯點擊Build按鈕,MDK開始編譯我們創(chuàng)建的工程,編譯通過后會出現(xiàn)編譯通過,如果出現(xiàn)0個錯誤,0個警告,說明編譯程序編寫沒有語法上的錯誤,但程序是否正確,需要進一步驗證。(如下圖所示界面編譯通過)從上面界面中我們可以看到,Code編譯生成的代碼大小,RO是程序中的指令和常量,RW是程序中的已初始化變量,ZI是程序中的未初始化的變量。4.2仿真環(huán)境的搭建點擊Debug,選擇使用仿真器。接下來進行仿真驗證,點擊Start/StopDebugSession按鈕進入仿真環(huán)境仿真界面如下圖所示我們可以過觀測外圍設備觀測器來觀測程序的運行情況,也可以通過窗口分析窗口來觀測程序的運行狀態(tài)。下面我們還是以GPIO通用外部IO口程序來進行仿真驗證程序的運行狀態(tài),下面的章節(jié)會對GPIO的例程做更詳細的介紹。首先通過外設觀測器來觀測,如下圖所示:我們來觀測GPIOA口的狀態(tài),進入A口的外圍觀測界面。按下F5鍵,或者點擊工具欄中Run按鈕,程序開始運行,可以看到IO口引腳的變化情況。另外,我們可以通過窗口觀測器來觀測程序的運行情況。點擊窗口觀測器按鈕進入觀測器,然后點擊Setup添加觀測的IO口(例如觀測GPIOA口的6、7、8、9,輸入PORTA.6、PORTA.7、PORTA.8、PORTA.9),輸入完成后點擊運行Run,可以看到波形圖變化情況,如下所示。波形變化情況4.3JLINK下載插上DC-5V電源給開發(fā)板供電,再插上JLINK。點擊TargetOptions…->Debug進行設置,按如下所示進行設置。點擊TargetOptions…->Utilities進行設置,設置內(nèi)容如下圖所示點擊MDK工具欄中的Load按鈕就可將編譯好的程序下載到開發(fā)板中。下載成功之后,程序就會自動運行。如果發(fā)現(xiàn)程序沒有運行,則可按下開發(fā)板中的復位按鍵。這里要注意的是:程序在燒寫到開發(fā)板后是否自動運行,是可以在MDK開發(fā)環(huán)境:TargetOptions…->Debug->Setting->FalashDownLoad中設置的;按下面設置好后,程序下載完成后可自動運行,不需要手動復位。第五章了解stm32庫文件library2008文件夾下有inc(include的縮寫)跟src(source的簡寫)這兩個文件夾以及庫里帶的一個啟動文件文件夾,最新的庫官方網(wǎng)站上有的更詳細,大家可以去官網(wǎng)上下載,這里以library2008進行介紹。src里面是每個設備外設的驅(qū)動程序,這些外設是芯片制造商在Cortex-M3核外加進去的。進入librarie2008目錄如下圖所示:在src和inc文件夾里的就是ST公司針對每個STM32外設而編寫的庫函數(shù)文件,每個外設對應一個.c和.h后綴的文件。我們把這類外設文件統(tǒng)稱為:stm32f10x_ppp.c或stm32f10x_ppp.h文件,PPP表示外設名稱。如針對模數(shù)轉(zhuǎn)換(ADC)外設,在src文件夾下有一個stm32f10x_adc.c源文件,在inc文件夾下有一個stm32f10x_adc.h頭文件,若我們開發(fā)的工程中用到了STM32內(nèi)部的ADC,則至少要把這兩個文件包含到工程里。第六章簡單例程分析6.1流水燈介紹想要控制LED燈,當然是通過控制STM32芯片的I/O引腳電平的高低來實現(xiàn)。在STM32芯片上,I/O引腳可以被軟件設置成各種不同的功能,如輸入或輸出,所以被稱為GPIO(General-purposeI/O)。而GPIO引腳又被分為GPIOA、GPIOB??GPIOG不同的組,每組端口分為0~15,共16個不同的引腳,對于不同型號的芯片,端口的組和引腳的數(shù)量不同,具體請參考相應芯片型號的datasheet。于是,控制LED的步驟有:1.GPIO端口引腳多-->就要選定需要控制的特定引腳2.GPIO功能如此豐富-->配置需要的特定功能3.控制LED的亮和滅-->設置GPIO輸出電壓的高低要控制GPIO端口,就要涉及到控制相關的寄存器。這時我們就要查一查與GPIO相關的寄存器了,可以通過《STM32參考手冊》(最新版本)來查閱寄存器的定義方式。以上的7個寄存器,相應的功能在參考手冊上有詳細的說明??梢苑譃橐韵?類,其功能簡要概括如下:1.配置寄存器:選定GPIO的特定功能,最基本的如:選擇作為輸入還是輸出端口。2.數(shù)據(jù)寄存器:保存了GPIO的輸入電平或?qū)⒁敵龅碾娖健?.位控制寄存器:設置某引腳的數(shù)據(jù)為1或0,控制輸出的電平。4.鎖定寄存器:設置某鎖定引腳后,就不能修改其配置。注:要想知道其功能嚴謹、詳細的描述,請讀者養(yǎng)成習慣在正式使用時,要以官方的datasheet為準,在這里只是簡單地概括其功能進行說明。關于寄存器名稱上標號x的意義,如:GPIOx_CRL、GPIOx_CRH,這個x的取值可以為圖中括號內(nèi)的值(A??E),表示這些寄存器也跟GPIO一樣,也是分組的。也就是說,對于端口GPIOA和GPIOB,它們都有互不相干的一組寄存器,如控制GPIOA的寄存器名為GPIOA_CRL、GPIOA_CRH等,而控制GPIOB的則是不同的、被命名為GPIOB_CRL、GPIOB_CRH等寄存器。從這個圖我們可以知道STM32的功能,實際上也是通過配置寄存器來實現(xiàn)的。配置寄存器的具體參數(shù),需要參考《STM32參考手冊》的寄存器說明。見下圖。如圖,對于GPIO端口,每個端口有16個引腳,每個引腳的模式由寄存器的4個位控制,每四位又分為兩位控制引腳配置(CNFy[1:0]),兩位控制引腳的模式及最高速度(MODEy[1:0]),其中y表示第y個引腳。這個圖是GPIOx_CRH寄存器的說明,配置GPIO引腳模式的一共有兩個寄存器,CRH是高寄存器,用來配置高8位引腳:pin8~pin15。還有一個稱為CRL寄存器,如果我們要配置pin0~pin7引腳,則要在寄存器CRL中進行配置。舉例說明對CRH的寄存器的配置:當給GPIOx_CRH寄存器的第28至29位設置為參數(shù)“11”,并在第30至31位設置為參數(shù)“00”,則把x端口第15個引腳的模式配置成了“輸出的最大速度為50MHz的通用推挽輸出模式、”,其它引腳可通過其GPIOx_CRH或GPIOx_CRL的其它寄存器位來配置。至于x端口的x是指端口GPIOA還是GPIOB還要具體到不同的寄存器基址,這將在后面分析。接下來分析要控制引腳電平高低,需要對寄存器進行什么具體的操作。由寄存器說明圖可知,一個引腳y的輸出數(shù)據(jù)由GPIOx_BSRR寄存器位的2個位來控制分別為BRy(BitResety)和BSy(BitSety),BRy位用于寫1清零,使引腳輸出低電平,BSy位用來寫1置1,使引腳輸出高電平。而對這兩個位進行寫零都是無效的。(還可以通過設置寄存器ODR來控制引腳的輸出。)例如:對x端口的寄存器GPIOx_BSRR的第0位(BS0)進行寫1,則x端口的第0引腳被設置為1,輸出高電平,若要令第0引腳再輸出低電平,則需要向GPIOx_BSRR的第16位(BR0)寫1。6.1.1STM32的地址映射溫故而知新——stm32f10x_map.h文件首先請大家回顧一下在51單片機上點亮LED是怎樣實現(xiàn)的。這太簡單了,幾行代碼就搞定。以上代碼就可以點亮P0端口與LED陰極相連的LED燈了,當然,這里省略了啟動代碼。為什么這個P0=0;句子就能控制P0端口為低電平,關鍵之處在于這個代碼所包含的頭文件<reg52.h>。在這個文件下有以下的定義:這些定義被稱為地址映射。所謂地址映射,就是將芯片上的存儲器甚至I/O等資源與地址建立一一對應的關系。如果某地址對應著某寄存器,我們就可以運用c語言的指針來尋址并修改這個地址上的內(nèi)容,從而實現(xiàn)修改該寄存器的內(nèi)容。正是因為<reg52.h>頭文件中有了對于各種寄存器和I/O端口的地址映射,我們才可以在51單片機程序中方便地使用P0=0xFF;TMOD=0xFF等賦值句子對寄存器進行配置,從而控制單片機。Cortex-M3的地址映射也是類似的。Cortex-M3有32根地址線,所以它的尋址空間大小為2^32bit=4GB。ARM公司設計時,預先把這4GB的尋址空間大致地分配好了。它把地址從0x40000000至0x5FFFFFFF(512MB)的地址分配給片上外設。通過把片上外設的寄存器映射到這個地址區(qū),就可以簡單地以訪問內(nèi)存的方式,訪問這些外設的寄存器,從而控制外設的工作。結果,片上外設可以使用C語言來操作。M3存儲器映射見下圖。stm32f10x.h這個文件中重要的內(nèi)容就是把STM32的所有寄存器進行地址映射。如同51單片機的<reg52.h>頭文件一樣,stm32f10x.h像一個大表格,我們在使用的時候就是通過宏定義進行類似查表的操作,大家想像一下沒有這個文件的話,我們要怎樣訪問STM32的寄存器?有什么缺點?不進行這些宏定義的缺點有:1、地址容易寫錯2、我們需要查大量的手冊來確定哪個地址對應哪個寄存器3、看起來還不好看,且容易造成編程的錯誤,效率低,影響開發(fā)進度。當然,這些工作都是由ST的固件工程師來完成的,只有設計M3的人才是最了解M3的,才能寫出完美的庫。在這里我們以外接了LED燈的外設GPIOC為例,在這個文件中有這樣的一系列宏定義:這幾個宏定義是從文件中的幾個部分抽離出來的,具體的讀者可參考stm32f10x_map.h源碼。外設基地址首先看到PERIPH_BASE這個宏,宏展開為0x40000000,并把它強制轉(zhuǎn)換為uint32_t的32位類型數(shù)據(jù),這是因為地STM32的地址是32位的,是不是覺得0x40000000這個地址很熟?是的,這個是Cortex-M3核分配給片上外設的從0x40000000至0x5FFFFFFF的512MB尋址空間中的第一個地址,我們把0x40000000稱為外設基地址。總線基地址接下來是宏APB2PERIPH_BASE,宏展開為PERIPH_BASE(外設基地址)加上偏移地址0x10000,即指向的地址為0x40010000。這個APB2PERIPH_BASE宏是什么地址呢?STM32不同的外設是掛載在不同的總線上的,見圖5-8。有AHB總線、APB2總線、APB1總線,掛載在這些總線上的外設有特定的地址范圍。其中像GPIO、串口1、ADC及部分定時器是掛載這個被稱為APB2的總線上,掛載到APB2總線上的外設地址空間是從0x40010000至地址0x40013FFF。這里的第一個地址,也就是0x40010000,被稱為APB2PERIPH_BASE(APB2總線外設的基地址)。而APB2總線基地址相對于外設基地址的偏移量為0x10000個地址,即為APB2相對外設基地址的偏移地址。見表:地址范圍總線總線基地址總線基地址相對外設基地址(0x4000000)的偏移量0x40018000-0x5003FFFFAHB0x400180000x180000x40010000-0x40017FFFAPB20x400100000x100000x40000000-0x4000FFFFAPB10x400000000x00000由這個表我們可以知道,stm32f10x_map.h這個文件中必然還有以下的宏:因為偏移量為零,所以APB1的地址直接就等于外設基地址寄存器組基地址最后到了宏GPIOC_BASE,宏展開為APB2PERIPH_BASE(APB2總線外設的基地址)加上相對APB2總線基地址的偏移量0x1000得到了GPIOC端口的寄存器組的基地址。這個所謂的寄存器組又是什么呢?它包括什么寄存器?細看stm32f10x.h文件,我們還可以發(fā)現(xiàn)以下類似的宏:除了GPIOC寄存器組的地址,還有GPIOA、GPIOB、GPIOD的地址,并且這些地址是不一樣的。前面提到,每組GPIO都對應著獨立的一組寄存器,查看stm32的datasheet,看到寄存器說明如下圖:注意到這個說明中有一個偏移地址:0x04,這里的偏移地址的是相對哪個地址的偏移呢?下面進行舉例說明。對于GPIOC組的寄存器,GPIOC含有的端口配置高寄存器(GPIOC_CRH)寄存器地址為:GPIOC_BASE+0x04。假如是GPIOA組的寄存器,則GPIOA含有的端口配置高寄存器(GPIOA_CRH)寄存器地址為:GPIOA_BASE+0x04。也就是說,這個偏移地址,就是該寄存器相對所在寄存器組基地址的偏移量。于是,讀者可能會想,大概這個文件含有一個類似如下的宏(當初野火也是這么想的):這個宏,定義了GPIOC_CRH寄存器的具體地址,然而,在stm32f10x.h文件中并沒有這樣的宏。ST公司的工程師采用了更巧妙的方式來確定這些地址,請看下一小節(jié)——STM32庫對寄存器的封裝。6.1.2STM32庫對寄存器的封裝ST的工程師用結構體的形式,封裝了寄存器組,c語言結構體學的不好的同學,可以在這里補補課了。在stm32f10x_map.h文件中,有以下代碼:有了這些宏,我們就可以定位到具體的寄存器地址,在這里發(fā)現(xiàn)了一個陌生的類型GPIO_TypeDef,追蹤它的定義,可以在stm32f10x_map.h文件中找到如下代碼:GPIO_TypeDef這段代碼,這個代碼用typedef關鍵字聲明了名為GPIO_TypeDef的結構體類型,結構體內(nèi)又定義了7個vu32(volatileunsignedlong)類型的變量。這些變量每個都為32位,也就是每個變量占內(nèi)存空間4個字節(jié)。在c語言中,結構體內(nèi)變量的存儲空間是連續(xù)的,也就是說假如我們定義了一個GPIO_TypeDef,這個結構體的首地址(變量CRL的地址)若為0x40011000,那么結構體中第二個變量(CRH)的地址即為0x40011000+0x04,加上的這個0x04,正是代表4個字節(jié)地址的偏移量。細心的同學會發(fā)現(xiàn),這個0x04偏移量,正是GPIOx_CRH寄存器相對于所在寄存器組的偏移地址,見上圖。同理,GPIO_TypeDef結構體內(nèi)其它變量的偏移量,也和相應的寄存器偏移地址相符。于是,只要我們匹配了結構體的首地址,就可以確定各寄存器的具體地址了。有了這些準備,就可以分析本小節(jié)的第一段代碼了:GPIOA_BASE在上一小節(jié)已解析,是一個代表GPIOA組寄存器的基地址。(GPIO_TypeDef*)在這里的作用則是把GPIOA_BASE地址轉(zhuǎn)換為GPIO_TypeDef結構體指針類型。有了這樣的宏,以后我們寫代碼的時候,如果要修改GPIO的寄存器,就可以用以下的方式來實現(xiàn)。代碼分析見注釋。通過類似的方式,我們就可以給具體的寄存器寫上適當?shù)膮?shù),控制STM32了。實際上我們并不是這樣使用庫的,庫為我們提供了更簡單的開發(fā)方式。M3的庫可謂盡情綻放了c的魅力。6.1.3STM32的時鐘系統(tǒng)(程序的心臟,每個例程公共的模塊)首先,從整體上了解STM32的時鐘系統(tǒng)。見下圖。我們配置GPIO引腳以后,要想讓GPIO可以正常運行起來,需要有時鐘脈搏跳動來使他動起來,這就像人一樣,心臟是為我們提供一切運動的根源,同樣,單片機也需要他的心里讓他的各個外設運行起來,相信大家接觸過51單片機的同學這點比較清楚。時鐘樹&時鐘源這個圖說明了STM32的時鐘走向,從圖的左邊開始,從時鐘源一步步分配到外設時鐘。從時鐘頻率來說,又分為高速時鐘和低速時鐘,高速時鐘是提供給芯片主體的主時鐘,而低速時鐘只是提供給芯片中的RTC(實時時鐘)及獨立看門狗使用。從芯片角度來說,時鐘源分為內(nèi)部時鐘與外部時鐘源,內(nèi)部時鐘是在芯片內(nèi)部RC振蕩器產(chǎn)生的,起振較快,所以時鐘在芯片剛上電的時候,默認使用內(nèi)部高速時鐘。而外部時鐘信號是由外部的晶振輸入的,在精度和穩(wěn)定性上都有很大優(yōu)勢,所以上電之后我們再通過軟件配置,轉(zhuǎn)而采用外部時鐘信號。所以,STM32有以下4個時鐘源:高速外部時鐘(HSE):以外部晶振作時鐘源,晶振頻率可取范圍為4~16MHz,我們一般采用8MHz的晶振。高速內(nèi)部時鐘(HSI):由內(nèi)部RC振蕩器產(chǎn)生,頻率為8MHz,但不穩(wěn)定。低速外部時鐘(LSE):以外部晶振作時鐘源,主要提供給實時時鐘模塊,所以一般采用32.768KHz。低速內(nèi)部時鐘(LSI):由內(nèi)部RC振蕩器產(chǎn)生,也主要提供給實時時鐘模塊,頻率大約為40KHz。高速外部時鐘(HSE)我們以最常用的高速外部時鐘為例分析,首先假定我們在外部提供的晶振的頻率為8MHz的。1、從左端的OSC_OUT和OSC_IN開始,這兩個引腳分別接到外部晶振的兩端。2、8MHz的時鐘遇到了第一個分頻器PLLXTPRE(HSEdividerforPLLentry),在這個分頻器中,可以通過寄存器配置,選擇它的輸出。它的輸出時鐘可以是對輸入時鐘的二分頻或不分頻。本例子中,我們選擇不分頻,所以經(jīng)過PLLXTPRE后,還是8MHz的時鐘。3、8MHz的時鐘遇到開關PLLSRC(PLLentryclocksource),我們可以選擇其輸出,輸出為外部高速時鐘(HSE)或是內(nèi)部高速時鐘(HSI)。這里選擇輸出為HSE,接著遇到鎖相環(huán)PLL,具有倍頻作用,在這里我們可以輸入倍頻因子PLLMUL(PLLmultiplicationfactor),哥們,你要是想超頻,就得在這個寄存器上做手腳啦。經(jīng)過PLL的時鐘稱為PLLCLK。倍頻因子我們設定為9倍頻,也就是說,經(jīng)過PLL之后,我們的時鐘從原來8MHz的HSE變?yōu)?2MHz的PLLCLK。4、緊接著又遇到了一個開關SW,經(jīng)過這個開關之后就是STM32的系統(tǒng)時鐘(SYSCLK)了。通過這個開關,可以切換SYSCLK的時鐘源,可以選擇為HSI、PLLCLK、HSE。我們選擇為PLLCLK時鐘,所以SYSCLK就為72MHz了。5、PLLCLK在輸入到SW前,還流向了USB預分頻器,這個分頻器輸出為USB外設的時鐘(USBCLK)。6、回到SYSCLK,SYSCLK經(jīng)過AHB預分頻器,分頻后再輸入到其它外設。如輸出到稱為HCLK、FCLK的時鐘,還直接輸出到SDIO外設的SDIOCLK時鐘、存儲器控制器FSMC的FSMCCLK時鐘,和作為APB1、APB2的預分頻器的輸入端。本例子設置AHB預分頻器不分頻,即輸出的頻率為72MHz。7、GPIO外設是掛載在APB2總線上的,APB2的時鐘是APB2預分頻器的輸出,而APB2預分頻器的時鐘來源是AHB預分頻器。因此,把APB2預分頻器設置為不分頻,那么我們就可以得到GPIO外設的時鐘也等于HCLK,為72MHz了。HCLK、FCLK、PCLK1、PCLK2從時鐘樹的分析,看到經(jīng)過一系列的倍頻、分頻后得到了幾個與我們開發(fā)密切相關的時鐘。SYSCLK:系統(tǒng)時鐘,STM32大部分器件的時鐘來源。主要由AHB預分頻器分配到各個部件。HCLK:由AHB預分頻器直接輸出得到,它是高速總線AHB的時鐘信號,提供給存儲器,DMA及cortex內(nèi)核,是cortex內(nèi)核運行的時鐘,cpu主頻就是這個信號,它的大小與STM32運算速度,數(shù)據(jù)存取速度密切相關。FCLK:同樣由AHB預分頻器輸出得到,是內(nèi)核的“自由運行時鐘”?!白杂伞北憩F(xiàn)在它不來自時鐘HCLK,因此在HCLK時鐘停止時FCLK也繼續(xù)運行。它的存在,可以保證在處理器休眠時,也能夠采樣和到中斷和跟蹤休眠事件,它與HCLK互相同步。PCLK1:外設時鐘,由APB1預分頻器輸出得到,最大頻率為36MHz,提供給掛載在APB1總線上的外設。PCLK2:外設時鐘,由APB2預分頻器輸出得到,最大頻率可為72MHz,提供給掛載在APB2總線上的外設。為什么STM32的時鐘系統(tǒng)如此復雜,有倍頻、分頻及一系列的外設時鐘的開關。需要倍頻是考慮到電磁兼容性,如外部直接提供一個72MHz的晶振,太高的振蕩頻率可能會給制作電路板帶來一定的難度。分頻是因為STM32既有高速外設又有低速外設,各種外設的工作頻率不盡相同,如同pc機上的南北橋,把高速的和低速的設備分開來管理。最后,每個外設都配備了外設時鐘的開關,當我們不使用某個外設時,可以把這個外設時鐘關閉,從而降低STM32的整體功耗。所以,當我們使用外設時,一定要記得開啟外設的時鐘啊。時鐘配置程序(每個例程公共的模塊)voidRCC_Configuration(void){/*RCC系統(tǒng)時鐘按缺省值復位*/RCC_DeInit();/*使能高速外部時鐘HSE*/RCC_HSEConfig(RCC_HSE_ON);/*等待外部時鐘起震*/HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS){/*HCLK=SYSCLK*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);/*PCLK1最大為36MHz,*/RCC_PCLK1Config(RCC_HCLK_Div2);/*Flash2waitstate*/FLASH_SetLatency(FLASH_Latency_2);//FLASH時序延遲幾個周期,等待總線同步操作。推薦按照單片機系統(tǒng)運行頻率,0—24MHz時,取Latency=0;24—48MHz時,取Latency=1;48~72MHz時,取Latency=2。/*EnablePrefetchBuffer*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//開啟FLASH預讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法,位置:RCC初始化子函數(shù)里面,時鐘起振之后/*選擇外部的8MHz時鐘PLLCLK=(8MHz/1)*9=72MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/*使能PLL*/RCC_PLLCmd(ENABLE);/*等待PLL時鐘就緒*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}/*以PLL為系統(tǒng)時鐘源*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*等待有效*/while(RCC_GetSYSCLKSource()!=0x08){}}}//以下為開啟外設時鐘的操作////RCC_AHBPeriphClockCmd(AHB設備1|AHB設備2,ENABLE);//啟動AHB設備//RCC_APB2PeriphClockCmd(ABP2設備1|ABP2設備2,ENABLE);//啟動ABP2設備//RCC_APB1PeriphClockCmd(APB1設備1|APB1設備2,ENABLE);//啟動ABP1設備6.1.4流水燈例程6.1.5從圖中可以看出,PC3、PC4、PC5三個管腳的電平在交替的變化,在這種變化中,可以使得LED燈在交替的亮滅,從而實現(xiàn)了流水燈效果。6.1.6程序下載到開發(fā)板后的結果6.2系統(tǒng)滴答定時器SysTickSysTick定時器被捆綁在NVIC中,用于產(chǎn)生SysTick異常(異常號:15)。在以前,操作系統(tǒng)和有所有使用了時基的系統(tǒng),都必須要一個硬件定時器來產(chǎn)生需要的“滴答”中斷,作為整個系統(tǒng)的時基。滴答中斷對操作系統(tǒng)尤其重要。例如,操作系統(tǒng)可以為多個任務許以不同數(shù)目的時間片,確保沒有一個任務能霸占系統(tǒng);或者把每個定時器周期的某個時間范圍賜予特定的任務等,還有操作系統(tǒng)提供的各種定時功能,都與這個滴答定時器有關。因此,需要一個定時器來產(chǎn)生周期性的中斷,而且最好還讓用戶程序不能隨意訪問它的寄存器,以維持操作系統(tǒng)“心跳”的節(jié)律。Cortex-M3在內(nèi)核部分包含了一個簡單的定時器——SysTicktimer。因為所有的CM3芯片都帶有這個定時器,軟件在不同芯片生產(chǎn)廠商的CM3器件間的移植工作就得以化簡。該定時器的時鐘源可以是內(nèi)部時鐘(FCLK,CM3上的自由運行時鐘),或者是外部時鐘(CM3處理器上的STCLK信號)。不過,STCLK的具體來源則由芯片設計者決定,因此不同產(chǎn)品之間的時鐘頻率可能會大不相同。因此,需要閱讀芯片的使用手冊來確定選擇什么作為時鐘源。在STM32中SysTick以HCLK(AHB時鐘)或HCLK/8作為運行時鐘。見圖SysTick定時器能產(chǎn)生中斷,CM3為它專門開出一個異常類型,并且在向量表中有它的一席之地。它使操作系統(tǒng)和其它系統(tǒng)軟件在CM3器件間的移植變得簡單多了,因為在所有CM3產(chǎn)品間,SysTick的處理方式都是相同的。SysTick定時器除了能服務于操作系統(tǒng)之外,還能用于其它目的:如作為一個鬧鈴,用于測量時間等。Systick定時器屬于cortex內(nèi)核部件,可以參考《CortexM3權威指南》或《STM32xxx-Cortex編程手冊》來了解。6.2SysTicktimer工作分析SysTick是一個24位的定時器,即一次最多可以計數(shù)個時鐘脈沖,這個脈沖計數(shù)值被保存到當前計數(shù)值寄存器STK_VAL(SysTickcurrentvalueregister)中,只能向下計數(shù),每接收到一個時鐘脈沖STK_VAL的值就向下減1,直至0,當STK_VAL的值被減至0時,由硬件自動把重載寄存器STK_LOAD(SysTickreloadvalueregister)中保存的數(shù)據(jù)加載到STK_VAL,重新向下計數(shù)。當STK_VAL的值被計數(shù)至0時,觸發(fā)異常,就可以在中斷服務函數(shù)中處理定時事件了。當然,要使SysTick進行以上工作必須要進行SysTick進行配置。它的控制配置很簡單,只有三個控制位和一個標志位,都位于寄存器STK_CTRL(SysTickcontrolandstatusregister)中,見下圖。SystickCTRL寄存器Bit0:ENABLE為SysTicktimer的使能位,此位為1的時候使能SysTicktimer,此位為0的時候關閉SysTicktimer。Bit1:TICKINT為異常觸發(fā)使能位,此位為1的時候并且STK_VAL計數(shù)至0時會觸發(fā)SysTick異常,此位被配置為0的時候不觸發(fā)異常。Bit2:CLKSOURCE為SysTick的時鐘選擇位,此位為1的時候SysTick的時鐘為AHB時鐘,此位為0的時候SysTick時鐘為AHB/8(AHB的八分頻)。Bit16:COUNTFLAG為計數(shù)為0標志位,若STK_VAL計數(shù)至0,此標志位會被置1。與SysTick控制相關的所有寄存器如圖0-2,其中上面沒有介紹的STK_CALIB寄存器是用于校準的,不常用。前面的實驗例程中,當有延時需要的時候,我們都是利用內(nèi)核循環(huán)執(zhí)行變量自減的代碼來實現(xiàn),延時的時間無法精確測量,有很大的局限性,當我們需要精確延時時,就可以利用SysTicktimer實現(xiàn),理論上它的最小計時單位為AHB的時鐘周期,即1/72000000秒,72分之一微秒,足以滿足大部分極端應用需求。本小節(jié)以實例講解如何利用SysTick進行精確延時。6.2.1實例分析6.2.2仿真結果分析:6.2.3程序下載6.3EXTI外部中斷EXTI(Externalinterrupt)就是指外部中斷,通過GPIO檢測輸入脈沖,引起中斷事件,打斷原來的代碼執(zhí)行流程,進入到中斷服務函數(shù)中進行處理,處理完后,再返回到中斷之前的代碼中執(zhí)行。嵌套向量中斷控制器(NVIC)。它與處理器內(nèi)核緊密結合實現(xiàn)低延遲中斷處理,并具有以下特性:—外部中斷可配置為1~240個—優(yōu)先級位可配置為3~8位—中斷優(yōu)先級可動態(tài)地重新配置—優(yōu)先級分組。分為占先中斷等級和非占先中斷等級—支持末尾連鎖(tail-chaining)和遲來(latearrival)中斷。這樣,在兩個中斷之間沒有多余的狀態(tài)保存和狀態(tài)恢復指令的情況下,使能背對背中斷(back-to-backinterrupt)處理?!幚砥鳡顟B(tài)在進入中斷時自動保存,中斷退出時自動恢復,不需要多余的指令。Cortex內(nèi)核具有強大的異常響應系統(tǒng),它把能夠打斷當前代碼執(zhí)行流程的事件分為異常(exception)和中斷(interrupt),并把它們用一個表管理起來,編號為0~15的稱為內(nèi)核異常,而16以上的則稱為外部中斷(外,相對內(nèi)核而言),這個表就稱為中斷向量表。而STM32對這個表重新進行了編排,把編號從-3至6的中斷向量定義為系統(tǒng)異常,編號為負的內(nèi)核異常不能被設置優(yōu)先級,如復位(Reset)、不可屏蔽中斷(NMI)、硬錯誤(Hardfault)。從編號7開始的為外部中斷,這些中斷的優(yōu)先級都是可以自行設置的。詳細的STM32中斷向量表見圖8-1,STM32中斷向量表。6.3.1NVIC當我們要使用NVIC來配置中斷時。查找?guī)鞄椭臋n,發(fā)現(xiàn)在Modules->STM32F10x_StdPeriph_Driver->misc查找到一個NVIC_Init()函數(shù),對NVIC初始化,首先要定義并填充一個NVIC_InitTypeDef類型的結構體。這個結構體有四個成員前面兩個結構體成員都很好理解,首先要用NVIC_IRQChannel參數(shù)來選擇將要配置的中斷向量,用NVIC_IRQChannelCmd參數(shù)來進行使能(ENABLE)或關閉(DISABLE)該中斷。在NVIC_IRQChannelPreemptionPriority成員要配置中斷向量的搶占優(yōu)先級,在NVIC_IRQChannelSubPriority需要配置中斷向量的響應優(yōu)先級。對于中斷的配置,最重要的便是配置其優(yōu)先級,但STM32的同一個中斷向量為什么需要設置兩種優(yōu)先級?這兩種優(yōu)先級有什么區(qū)別?6.3.2STM32的中斷向量具有兩個屬性,一個為搶占屬性,另一個為響應屬性,其屬性編號越小,表明它的優(yōu)先級別越高。搶占,是指打斷其它中斷的屬性,即因為具有這個屬性,會出現(xiàn)嵌套中斷(在執(zhí)行中斷服務函數(shù)A的過程中被中斷B打斷,執(zhí)行完中斷服務函數(shù)B再繼續(xù)執(zhí)行中斷服務函數(shù)A),搶占屬性由NVIC_IRQChannelPreemptionPriority的參數(shù)配置。而響應屬性則應用在搶占屬性相同的情況下,當兩個中斷向量的搶占優(yōu)先級相同時,如果兩個中斷同時到達,則先處理響應優(yōu)先級高的中斷,響應屬性由NVIC_IRQChannelSubPriority的參數(shù)配置。例如,現(xiàn)在有三個中斷向量:中斷向量搶占優(yōu)先級響應優(yōu)先級A00B10C11若內(nèi)核正在執(zhí)行C的中斷服務函數(shù),則它能被搶占優(yōu)先級更高的中斷A打斷,由于B和C的搶占優(yōu)先級相同,所以C不能被B打斷。但如果B和C中斷是同時到達的,內(nèi)核就會首先響應響應優(yōu)先級別更高的B中斷。6.3.3NVIC在配置優(yōu)先級的時候,還要注意一個很重要的問題,中斷種類的數(shù)量。NVIC只可以配置16種中斷向量的優(yōu)先級,也就是說,搶占優(yōu)先級和響應優(yōu)先級的數(shù)量由一個4位的數(shù)字來決定,把這個4位數(shù)字的位數(shù)分配成搶占優(yōu)先級部分和響應優(yōu)先級部分。有5組分配方式:第0組:所有4位用來配置搶占優(yōu)先級,即NVIC配置的24=16種中斷向量都是只有搶占屬性,沒有響應屬性。第1組:最高1位用來配置搶占優(yōu)先級,低3位用來配置響應優(yōu)先級。表示有21=2種級別的搶占優(yōu)先級(0級,1級),有23=8種響應優(yōu)先級,即在16種中斷向量之中,有8種中斷,其搶占優(yōu)先級都為0級,而它們的響應優(yōu)先級分別為0~7,其余8種中斷向量的搶占優(yōu)先級則都為1級,響應優(yōu)先級別分別為0~7。第2組:2位用來配置搶占優(yōu)先級,2位用來配置響應優(yōu)先級。即=4種搶占優(yōu)先級,=4種響應優(yōu)先級。第3組:高3位用來配置搶占優(yōu)先級,最低1位用來配置響應優(yōu)先級。即有8種搶占優(yōu)先級,2種響應2優(yōu)先級。第4組:所有4位用來配置響應優(yōu)先級。即16種中斷向量具有都不相同的響應優(yōu)先級。要配置這些優(yōu)先級組,可以采用庫函數(shù)NVIC_PriorityGroupConfig(),可輸入的參數(shù)為NVIC_PriorityGroup_0~NVIC_PriorityGroup_4,分別為以上介紹的5種分配組。于是,有讀者覺得疑惑了,如此強大的STM32,所有GPIO都能夠配置成外部中斷,USART、ADC等外設也有中斷,而NVIC只能配置16種中斷向量,那在某個工程中使用了超過16個的中斷怎么辦呢?注意NVIC能配置的是16種中斷向量,而不是16個,當工程之中有超過16個中斷向量時,必然有2個以上的中斷向量是使用相同的中斷種類,而具有相同中斷種類的中斷向量不能互相嵌套。STM2單片機的所有I/O端口都可以配置為EXTI中斷模式,用來捕捉外部信號,可以配置為下降沿中斷,上升沿中斷和上升下降沿中斷這三種模式。它們以下圖的方式連接到16個外部中斷/事件線上6.3.4EXTI外部中斷STM32的所有GPIO都引入到EXTI外部中斷線上,使得所有的GPIO都能作為外部中斷的輸入源。GPIO與EXTI的連接方式見圖EXTI與GPIO連接圖觀察這個圖知道,PA0~PG0連接到EXTI0、PA1~PG1連接到EXTI1、……、PA15~PG15連接到EXTI15。這里大家要注意的是:PAx~PGx端口的中斷事件都連接到了EXTIx,即同一時刻EXTx只能相應一個端口的事件觸發(fā),不能夠同一時間響應所有GPIO端口的事件,但可以分時復用。它可以配置為上升沿觸發(fā),下降沿觸發(fā)或雙邊沿觸發(fā)。EXTI最普通的應用就是接上一個按鍵,設置為下降沿觸發(fā),用中斷來檢測按鍵。voidNVIC_Configuration(void){NVIC_InitTypeDefNVIC_InitStructure;//中斷管理恢復默認參數(shù)#ifdefVECT_TAB_RAM//如果C/C++Compiler\Preprocessor\Definedsymbols中的定義了VECT_TAB_RAM(見程序庫更改內(nèi)容的表格)NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);//則在RAM調(diào)試#else//如果沒有定義VECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//則在Flash里調(diào)試#endif//結束判斷語句//以下為中斷的開啟過程,不是所有程序必須的。//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置NVIC優(yōu)先級分組,方式。//注:一共16個優(yōu)先級,分為搶占式和響應式。兩種優(yōu)先級所占的數(shù)量由此代碼確定,NVIC_PriorityGroup_x可以是0、1、2、3、4,分別代表搶占優(yōu)先級有1、2、4、8、16個和響應優(yōu)先級有16、8、4、2、1個。規(guī)定兩種優(yōu)先級的數(shù)量后,所有的中斷級別必須在其中選擇,搶占級別高的會打斷其他中斷優(yōu)先執(zhí)行,而響應級別高的會在其他中斷執(zhí)行完優(yōu)先執(zhí)行。//NVIC_InitStructure.NVIC_IRQChannel=中斷通道名;//開中斷,中斷名稱見函數(shù)庫//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//搶占優(yōu)先級//NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//響應優(yōu)先級//NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//啟動此通道的中斷//NVIC_Init(&NVIC_InitStructure);//中斷初始化}6.3.5例程程序6.4串口部分為實現(xiàn)最迫切的需求,利用串口來幫助我們調(diào)試程序,本章介紹的為串口最基本、最常用的方法,全雙工、異步通訊方式。下圖為串口異步通訊協(xié)議。通過分析串口通訊協(xié)議,我們知道要配置串口通訊,至少要設置以下幾個參數(shù):字長(一次傳送的數(shù)據(jù)長度)、波特率(每秒傳輸?shù)臄?shù)據(jù)位數(shù))、奇偶校驗位、還有停止位。如果大家對ST庫函數(shù)的使用已經(jīng)有大致了解的同學應該知道,在初始化串口的時候,必然有一個串口初始化結構體,這個機構體的幾個成員就是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)業(yè)企業(yè)離任審計工作方案
- 工業(yè)機器人調(diào)試方案
- 吉林師范大學《電磁場與電磁波》2021-2022學年期末試卷
- 吉林大學《油畫靜物》2021-2022學年第一學期期末試卷
- 2024知識產(chǎn)權合同大全
- 2024實習生在合同沒到期時申請離職被扣工資我去仲裁告的勝算是多少啊
- 吉林大學《空間機構學》2021-2022學年第一學期期末試卷
- 吉林大學《環(huán)境科學進展》2021-2022學年第一學期期末試卷
- 信息技術行業(yè)風險管控與隱患排查制度
- 購物中心物業(yè)管理方案
- 湖南省長沙市雅禮集團2024-2025學年九年級上學期11月期中英語試題
- 2024年度采購合同管理程序指南
- GB/T 44693.1-2024危險化學品企業(yè)工藝平穩(wěn)性第1部分:管理導則
- 2024年銀行考試-征信人員考試近5年真題附答案
- 世界一流港口綜合評價報告
- 遼寧省盤錦市第一完全中學2023-2024學年八年級上學期期中數(shù)學試卷
- DB13-T 5958-2024 金屬非金屬露天礦山采場邊坡安全監(jiān)測技術規(guī)范
- 二年級數(shù)學看錯數(shù)字問題專項練習
- 七十歲老人換駕照考三力測試題庫
- 醫(yī)院康復科培訓課件:《平衡功能評定及訓練》
- 2025屆高三數(shù)學一輪復習策略講座
評論
0/150
提交評論