STM32研究生教案[共85頁]

上傳人:1528****253 文檔編號:48085889 上傳時(shí)間:2022-01-01 格式:DOC 頁數(shù):87 大?。?.94MB
收藏 版權(quán)申訴 舉報(bào) 下載
STM32研究生教案[共85頁]_第1頁
第1頁 / 共87頁
STM32研究生教案[共85頁]_第2頁
第2頁 / 共87頁
STM32研究生教案[共85頁]_第3頁
第3頁 / 共87頁

下載文檔到電腦,查找使用更方便

12 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《STM32研究生教案[共85頁]》由會員分享,可在線閱讀,更多相關(guān)《STM32研究生教案[共85頁](87頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、 STM 32 初級學(xué)習(xí) 第一章 初識 Cortex-M3 3 1.1 ARM Cortex-M3 處理器初探 3 1.2 從Cortex-M3 處理器內(nèi)核到基于Cortex-M3的MCU 3 第二章 開發(fā)環(huán)境MDK、J-link的搭建及系統(tǒng)調(diào)試 7 2.1 JLINK驅(qū)動安裝 7 2.2 MDK環(huán)境搭建 7 2.3 MDK破解 11 第三章 如何新建工程 13 第四章 工程編譯及仿真、程序的下載 29 4.1 工程編譯 30 4.2 仿真環(huán)境的搭建 31 4.3 JLINK下載 37 第五章 了解stm32庫文件 42 第六章 簡單例程分析 44 6.1流

2、水燈介紹 44 6.1.1 STM32的地址映射 48 6.1.2 STM32庫對寄存器的封裝 53 6.1.3 STM32的時(shí)鐘系統(tǒng)(程序的心臟,每個(gè)例程公共的模塊) 55 6.1.4流水燈例程 60 6.1.5 仿真結(jié)果分析 64 6.1.6程序下載到開發(fā)板后的結(jié)果顯示 64 6.2系統(tǒng)滴答定時(shí)器SysTick 64 6.2.1實(shí)例分析 67 6.2.2仿真結(jié)果分析: 71 6.2.3程序下載 71 6.3 EXTI外部中斷 71 6.3.1 NVIC結(jié)構(gòu)體成員 74 6.3.2 搶占優(yōu)先級和響應(yīng)優(yōu)先級 74 6.3.3 NVIC的優(yōu)先級組 75 6.3.4

3、EXTI外部中斷 76 6.3.5例程程序 77 6.4串口部分 78 6.4.1波特率控制 79 6.4.2收發(fā)控制 80 6.4.3數(shù)據(jù)存儲轉(zhuǎn)移部分 80 6.4.4實(shí)例解析 81 6.5 ADC(DMA模式) 81 6.5.1 ADC簡介 81 6.5.2 STM32的ADC主要技術(shù)指標(biāo) 82 6.5.3 ADC工作過程分析 83 6.5.4 ADC采集例程分析 84 第一章 初識 Cortex-M3 1.1 ARM Cortex-M3 處理器初探 ARM Cortex-M3處理器,作為Cortex系

4、列的處女作,為了讓32位處理器入主作莊單片機(jī)市場,轟轟烈烈地誕生了!由于采用了最新的設(shè)計(jì)技術(shù),它的門數(shù)更低,性能卻更強(qiáng)。許多曾經(jīng)只能求助于高級32位處理器或DSP的軟件設(shè)計(jì),都能在CM3上跑得很快很歡。嵌入式處理器市場正在32位化,相信用不了多久,CM3就一定會在這美麗新世界中脫穎而出。 下面我們共同來了解一下CM3的優(yōu)勢: ? 性能強(qiáng)大。在相同的主頻下能做處理更多的任務(wù),全力支持勁爆的程序設(shè)計(jì)。 ? 功耗低。延長了電池的壽命——這簡直就是便攜式設(shè)備的命門(如無線網(wǎng)絡(luò)應(yīng)用)。 ? 實(shí)時(shí)性好。采用了前衛(wèi)甚至革命性的設(shè)計(jì)理念,使它能極速地響應(yīng)中斷,而且響應(yīng)中斷所需的周期數(shù)是確定的。 ?

5、代碼密度得到很大改善。一方面在大型應(yīng)用程序優(yōu)勢,另一方面為低成本設(shè)計(jì)而省吃儉用。 ? 使用更方便。現(xiàn)在從8位/16位處理器轉(zhuǎn)到32位處理器之風(fēng)刮得越來越猛,更簡單的編程模型和更透徹的調(diào)試系統(tǒng),為與時(shí)俱進(jìn)的人們大大減負(fù)。 ? 低成本的整體解決方案。讓32位系統(tǒng)比和8位/16位的還便宜,低端的Cortex-M3單片機(jī)甚至還賣不到1美元。 ? 遍地開花的優(yōu)秀開發(fā)工具。免費(fèi)的,便宜的,全能的開發(fā)環(huán)境。 值得一提的是,CM3并不是第一個(gè)被拿去做萬金油型處理器的內(nèi)核。那廉頗雖老卻依然驍勇的ARM7/ARM9處理器,在通用嵌入式處理器市場中德高望重,至今擁有無數(shù)鐵桿粉絲。半導(dǎo)體業(yè)界的群英們,像NXP

6、(philips)、TI、Atmel、OKI、ST等,都以ARM為內(nèi)核,做出了各自身懷絕技的32位MCU。ARM7作為最受歡迎的32位嵌入式處理器,被載入了亮煌煌的幾頁史冊——每年超過10億片出貨量,為各行各業(yè)的嵌入式設(shè)備中都找得到它們的身影。 1.2 從Cortex-M3 處理器內(nèi)核到基于Cortex-M3的MCU Cortex-M3處理器內(nèi)核是單片機(jī)的中央處理單元(CPU)。完整的基于CM3的MCU還需要很多其它組件。在芯片制造商得到CM3處理器內(nèi)核的使用授權(quán)后,它們就可以把CM3內(nèi)核用在自己的硅片設(shè)計(jì)中,添加存儲器,外設(shè),I/O以及其它功能塊。 Cortex-M3 是一款低功耗

7、處理器,具有門數(shù)目少,中斷延遲短,調(diào)試成本低的特點(diǎn),是為要求有快速中斷響應(yīng)能力的深度嵌入式應(yīng)用而設(shè)計(jì)的。該處理器采用ARMv7-M 架構(gòu)。 Cortex-M3 處理器整合了以下組件: Cortex-M3的一個(gè)簡化視圖 l 處理器內(nèi)核。這款門數(shù)目少,中斷延遲短的處理器具備以下特性: — ARMv7-M:Thumb-2 ISA 子集,包含所有基本的16 位和32 位Thumb-2 指令,用于多媒體,SIMD,E(DSP)和ARM 系統(tǒng)訪問的模塊除外。 — 只有分組的 SP — 硬件除法指令,SDIV 和UDIV(Thumb-2 指令) — 處理模式(handler mode)和線

8、程模式(thread mode) — Thumb 狀態(tài)和調(diào)試狀態(tài) — 可中斷-可繼續(xù)(interruptible-continued)的LDM/STM,PUSH/POP,實(shí)現(xiàn)低中 斷延遲。 — 自動保存和恢復(fù)處理器狀態(tài),可以實(shí)現(xiàn)低延遲地進(jìn)入和退出中斷服務(wù)程序(ISR)。 — 支持 ARMv6 架構(gòu)BE8/LE — ARMv6 非對齊訪問 l 嵌套向量中斷控制器(NVIC)。它與處理器內(nèi)核緊密結(jié)合實(shí)現(xiàn)低延遲中斷處理,并具有以下特性: — 外部中斷可配置為 1~240 個(gè) — 優(yōu)先級位可配置為 3~8 位 — 中斷優(yōu)先級可動態(tài)地重新配置 — 優(yōu)先級分組。分為占先中斷等級和非占

9、先中斷等級 — 支持末尾連鎖(tail-chaining)和遲來(late arrival)中斷。這樣,在兩個(gè)中斷之間沒有多余的狀態(tài)保存和狀態(tài)恢復(fù)指令的情況下,使能背對背中斷(back-to-back interrupt)處理。 — 處理器狀態(tài)在進(jìn)入中斷時(shí)自動保存,中斷退出時(shí)自動恢復(fù),不需要多余的指令。 l 存儲器保護(hù)單元(MPU)。MPU 功能可選,用于對存儲器進(jìn)行保護(hù),它具有以下特 性: — 8個(gè)存儲器區(qū) — 子區(qū)禁止功能(SRD),實(shí)現(xiàn)對存儲器區(qū)的有效使用。 — 可使能背景區(qū),執(zhí)行默認(rèn)的存儲器映射屬性。 l 總線接口 — AHBLite ICode、DCode 和系統(tǒng)總

10、線接口 — APB 專用外設(shè)總線(PPB)接口 — Bit band 支持,bit-band 的原子寫和讀訪問。 — 存儲器訪問對齊 — 寫緩沖區(qū),用于緩沖寫數(shù)據(jù)。 l 低成本調(diào)試解決方案,具有以下特性: — 當(dāng)內(nèi)核正在運(yùn)行、被中止、或處于復(fù)位狀態(tài)時(shí),能對系統(tǒng)中包括Cortex-M3 寄 存器組在內(nèi)的所有存儲器和寄存器進(jìn)行調(diào)試訪問。 — 串行線(SW-DP)或JTAG(JTAG-DP)調(diào)試訪問,或兩種都包括。 — Flash 修補(bǔ)和斷點(diǎn)單元(FPB),實(shí)現(xiàn)斷點(diǎn)和代碼修補(bǔ)。 — 數(shù)據(jù)觀察點(diǎn)和觸發(fā)單元(DWT),實(shí)現(xiàn)觀察點(diǎn),觸發(fā)資源和系統(tǒng)分析(system profiling

11、) — 儀表跟蹤宏單元(ITM),支持對printf 類型的調(diào)試。 — 跟蹤端口的接口單元(TPIU),用來連接跟蹤端口分析儀。 — 可選的嵌入式跟蹤宏單元(ETM),實(shí)現(xiàn)指令跟蹤。 第二章 開發(fā)環(huán)境MDK、J-link的搭建及系統(tǒng)調(diào)試 2.1 JLINK驅(qū)動安裝 在用JLINK下載和調(diào)試程序之前,我們需要線在電腦上安裝JLINK驅(qū)動,如果電腦上已經(jīng)安裝JLINK驅(qū)動,則可跳過這一步。在野火M3光盤目錄下:3-安裝軟件\1-JLINKV8驅(qū)動 點(diǎn)擊Setup_JLinkARM_V428c.exe ,完成JLINK驅(qū)動的安裝。安裝過程非常簡單,這里將跳過。在安裝完成后,我們

12、將JLINK插接到電腦的USB口,即可在我的電腦\管理\設(shè)備管理器\通用串行總線控制器中看到一個(gè)J-Link driver。要注意的是在安裝完JLINK驅(qū)動后,一定要將JLINK插接到電腦的USB口,否則在電腦的設(shè)備管理器中是查看不到J-Link driver的。當(dāng)你把JLINK拔出電腦的USB口時(shí)候,J-Link driver就會消失。 2.2 MDK環(huán)境搭建 在我們學(xué)習(xí)編寫代碼之前需要先要把MDK這個(gè)軟件安裝好,野火用的版本是V4.14,在安裝完成之后可以在工具欄help->about uVision選項(xiàng)卡中查看到版本信息。MDK是一個(gè)集代碼編輯,編譯,鏈接和下載于一體的集成開發(fā)環(huán)境

13、(KDE)。MDK這個(gè)名字我們可能不熟悉,但說到KEIL,學(xué)過51的朋友就再熟悉不過了。后來KEIL被ARM公司收購之后就改名為MDK了,所以學(xué)過51的朋友是很快就可以熟悉這個(gè)開發(fā)環(huán)境的。 在MDK安裝目錄下:3-安裝軟件\2-MDK 找到MDK414.exe,點(diǎn)擊MDK414.exe,在彈出MDK安裝界面后,按照如下步驟操作即可。 l 點(diǎn)擊 Next. l 把對勾上,點(diǎn)擊 Next。 l 點(diǎn)擊Next,默認(rèn)安裝在C:\keil 目錄下。 (選擇你想要安裝的路徑) l 在用戶名中填入名字(可隨便寫,可空格),在郵件地址那里填入郵件地址(可隨便寫,可空格),

14、點(diǎn)擊Next。 l 正在安裝,請耐心等待。 l 點(diǎn)擊 Finish,安裝完成。 l 此時(shí)就可在桌面看到MDK的快捷圖標(biāo),如下所示: 2.3 MDK破解 安裝完MDK開發(fā)環(huán)境后,在下載程序的時(shí)候會有40K的代碼限制,我們需要破解軟件即可完成大程序代碼的編譯,在軟件安裝目錄下:找到KEIL_Lic.exe,點(diǎn)擊KEIL_Lic.exe,如下圖所示 在彈出的界面中的CID選項(xiàng)框中填入MDK的CID(MDK的CID在MDK開發(fā)環(huán)境中的菜單欄File\License Managemant 中獲取到如下面兩幅圖所示),在Target下拉框中選擇ARM,然后

15、點(diǎn)擊Generate按鈕,復(fù)制產(chǎn)生的CID Code,然后回到MDK開發(fā)環(huán)境中的菜單欄File\License Managemant 中,把剛剛在注冊機(jī)復(fù)制到的CID Code粘貼到New License ID Code (LIC):框中,然后點(diǎn)擊 Add LIC,,點(diǎn)擊close,大功告成:)。 第三章 如何新建工程 l 首先在E盤下創(chuàng)建一個(gè)新工程文件夾,用來保存工程的文件,并在該文件夾下創(chuàng)建Project(用來保存工程生成的文件)Library,User,Start等子文件夾 。 l 新建工程 點(diǎn)擊桌面UVision4圖標(biāo),啟動軟件。如果是第

16、一次使用的話會打開一個(gè)自帶的工程文件,我們可以通過工具欄Project->Close Project選項(xiàng)把它關(guān)掉。 在工具欄Project->New μVision Project…新建我們的工程文件,我們將新建的工程保存在E:\新工程\Project路徑下,文件名可以任意?。ò醋约阂庠高x擇),點(diǎn)擊保存。 l 接下來的窗口是讓我們選擇公司和芯片的型號,我們用的芯片是ST公司的STM32F103ZET6,有64K SRAM,512K Flash,屬于高集成度的芯片。按如下選擇即可。 l 接下來的窗口問我們是否需要拷貝STM32的啟動代碼到工程文件中,這份啟動

17、代碼在M3系列中都是適用的,一般情況下我們都點(diǎn)擊否,我們這里用的是ST的庫,庫文件里面也自帶了這一份啟動代碼,所以為了保持庫的完整性,我們就不需要開發(fā)環(huán)境為我們自帶的啟動代碼了,稍后我們自己手動添加,這里我們點(diǎn)擊否。 l 將E:\STM3教程+實(shí)驗(yàn)\①創(chuàng)建工程+編程教程\創(chuàng)建工程所需工程文件下的啟動文件STM32F10x.s拷貝到E:\新工程\Start文件夾Start下。 l 將E:\STM3教程+實(shí)驗(yàn)\①創(chuàng)建工程+編程教程\創(chuàng)建工程所需工程文件下的固件庫文件STM32F10xR.LIB拷貝到E:\新工程\Library文件夾library下。 l

18、 將E:\STM3教程+實(shí)驗(yàn)\①創(chuàng)建工程+編程教程\創(chuàng)建工程所需工程文件下的用戶文件main.c和stm32f10x_it.c拷貝到E:\新工程\User文件夾User下。 l 在Target 1上右鍵選中Manage Components …選項(xiàng),新建四個(gè)組,分別命名為lib、user、start,從名字上字面上start文件夾下存放啟動文件,user文件夾下存放用戶創(chuàng)建文件,lib存放系統(tǒng)庫文件。 l 修改文件夾名稱和添加相應(yīng)的文件。 l 添加并修改文件夾名為:Start,User,Library,如圖。 l 接下來我們往我們這些新建的組中添加文件,雙擊哪個(gè)組就可以

19、往哪個(gè)組里面添加文件。首先向Start文件夾添加STM32F10x.s文件,選中Start,單擊Add Files彈出下圖對話框,文件類型選擇All file(*.*)找到E:\新工程\Start下的STM32F10x.s文件,單擊add ,然后單擊close完成,在右側(cè)Files欄會看到STM32F10x.s已添加到目錄下 l 向Library文件夾添加STM32F10xR.LIB文件,選中Library,單擊Add Files彈出下圖對話框,文件類型選擇All file(*.*),找到E:\新工程\Library下的STM32F10xR.LIB文件并選中,單擊add,然后單擊c

20、lose完成。在右側(cè)Files欄會看到STM32F10xR.LIB已添加到目錄下。 l 向User文件夾添加main.c和stm32f10x_it.c文件,選中User,單擊Add Files彈出下圖對話框,文件類型選擇All file(*.*),找到E:\新工程\User下的main.c和stm32f10x_it.c文件并選中,單擊add ,然后單擊close完成。在右側(cè)Files欄會看到main.c和stm32f10x_it.c已添加到目錄下。 l 單擊對話框中的OK,完成添加,結(jié)果如圖所示 l 雙擊右側(cè)目錄下main.c,將其打開空白的main.c,一般

21、main.c編寫必要的程序,實(shí)現(xiàn)想要的功能。其中頭文件、變量聲明、硬件初始化、程序主體、其他函數(shù)實(shí)體等是必不可少的。為了便于入門,這里暫時(shí)不需要自己去編程,只需拷貝下面附的程序到main.c,然后單擊保存。 附: /******************************************************************************* * File Name : main.c * Author : * Date First Issued : * Description : M

22、ain program body ********************************************************************************/ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x_lib.h" //加載庫文件 extern vu32 TimingDelay; u16 count; /* Private function prototypes -

23、------初始化----------------------------------------*/ void RCC_Configuration(void); //配置各系統(tǒng)時(shí)鐘 void NVIC_Configuration(void); //配置各中斷 void GPIO_Configuration(void); //配置各I/O端口性能 void Delay(vu32 nTime); //延時(shí)程序 void SysTick_Configuration(void); //配置每1ms產(chǎn)生一次中斷 /* Private functions ----

24、-----------------------------------------------------*/ /******************************************************************************* * Function Name : main * Description : Main program. * Input : None * Output : None * Return : None *************************

25、******************************************************/ int main(void) //主函數(shù) { #ifdef DEBUG debug(); #endif /* Configure the system clocks */ //調(diào)用各初始化函數(shù) /* RCC Configuration */ RCC_Configuration(); SysTick_Configuration(); /* NVIC Configuration */

26、 NVIC_Configuration(); GPIO_Configuration(); while(1) { GPIO_SetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_6); Delay(200); GPIO_ResetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_6); Delay(200); count++; } } /**************

27、***************************************************************** * Function Name : RCC_Configuration * Description : Configures the different system clocks. * Input : None * Output : None * Return : None ************************************************************

28、*******************/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON); /* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSE

29、StartUpStatus == SUCCESS) { /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2)

30、; /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 選擇外部的8MHz時(shí)鐘 PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /*使能 PLL */ RCC_PLLCmd(ENABLE); /* 等待PLL有效 */ while(RCC_GetFlagStatu

31、s(RCC_FLAG_PLLRDY) == RESET) { } /*以PLL為系統(tǒng)時(shí)鐘源 */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 等待有效 */ while(RCC_GetSYSCLKSource() != 0x08) { } } } /******************************************************************************* * Function

32、 Name : NVIC_Configuration * Description : Configures Vector Table base location. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_Configuration(void) { // NVIC_InitTypeDef N

33、VIC_InitStructure; #ifdef VECT_TAB_RAM //編譯選擇中斷跳轉(zhuǎn)存儲區(qū)類型 /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_Vec

34、tTab_FLASH, 0x0); #endif /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); } /******************************************************************************* * Function Name : GPIO_Configuration * Description : Configures the

35、different GPIO ports. * Input : None * Output : None * Return : None *******************************************************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* 定義1個(gè)結(jié)構(gòu)體變量 */ /* 打開GPIOC */ RCC_APB2Per

36、iphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE); /* 可以對PC3 - PC5 一起初始化 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4| GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); /* 調(diào)用庫函數(shù)初始化G

37、PIO */ } /******************************************************************************* * Function Name : SysTick_Configuration * Description : Configures the SysTick to generate an interrupt each 1 millisecond. * Input : None * Output : None * Return : None

38、*******************************************************************************/ void SysTick_Configuration(void) { /*選用 系統(tǒng)時(shí)鐘/8 時(shí)鐘為 時(shí)鐘源*/ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //72M/8 =9M; /* 中斷優(yōu)先級為 3 */ NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0);

39、 /*每1ms產(chǎn)生一次中斷*/ SysTick_SetReload(9000); /* 使能 SysTick 中斷*/ SysTick_ITConfig(ENABLE); } /******************************************************************************* * Function Name : Delay * Description : Inserts a delay time.精確延時(shí) * Input : nTime: specifies t

40、he delay time length, in milliseconds. * Output : None * Return : None *******************************************************************************/ void Delay(u32 nTime) { /* 使能SysTick 中斷 */ SysTick_CounterCmd(SysTick_Counter_Enable); TimingDelay = nTime; //延時(shí)時(shí)間

41、付系統(tǒng)滴答變量 while(TimingDelay != 0); //延時(shí)到? /* 關(guān)閉SysTick中斷 */ SysTick_CounterCmd(SysTick_Counter_Disable); /* 清SysTick計(jì)數(shù)*/ SysTick_CounterCmd(SysTick_Counter_Clear); } 到這里工程的創(chuàng)建就完成了,接下來就是對工程的編譯和仿真,來驗(yàn)證工程創(chuàng)建的是否正確,以及程序是否是我們想要看到的效果。 第四章 工程編譯及仿真、程序的下載 在MDK界面中,我們可以看到左邊的工具欄中有三個(gè)按鈕,現(xiàn)在我們

42、從左往右來介紹下這三個(gè)按鈕的功能。 l 第一個(gè)按鈕:Translate 就是編譯當(dāng)下修改過的文件,檢查下有沒有語法錯誤,并不會去鏈接庫文件,也不會生成可執(zhí)行文件。 l 第二個(gè)按鈕:Build 就是編譯當(dāng)下修改過的文件,它包含了語法檢查,鏈接動態(tài)庫文件,生成可執(zhí)行文件。 l 第三個(gè)按鈕:Rebuild 重新編譯整個(gè)工程,跟 Build 這個(gè)按鈕實(shí)現(xiàn)的功能是一樣的,但有所不同的是它編譯的是整個(gè)工程的所有文件,耗時(shí)較大。 因此:當(dāng)我們編輯好我們的程序之后,只需要用第二個(gè)Build 按鈕就可以,即方便又省時(shí)。第一個(gè)跟第三個(gè)按鈕用的比較少。 4.1 工程編譯 點(diǎn)擊Build按鈕

43、,MDK開始編譯我們創(chuàng)建的工程,編譯通過后會出現(xiàn)編譯通過,如果出現(xiàn)0個(gè)錯誤,0個(gè)警告,說明編譯程序編寫沒有語法上的錯誤,但程序是否正確,需要進(jìn)一步驗(yàn)證。(如下圖所示界面編譯通過) 從上面界面中我們可以看到,Code編譯生成的代碼大小,RO是程序中的指令和常量,RW是程序中的已初始化變量,ZI是程序中的未初始化的變量。 如果編譯后提示有錯誤或警告,向上找到錯誤信息并雙擊,編譯會定位到錯誤處附近,分析錯誤信息修改程序,直至編譯無錯誤或警告。如下圖,第049缺少一個(gè)“;”號。 4.2 仿真環(huán)境的搭建 l 點(diǎn)擊Debug,選擇使用仿真器。 l 接下來進(jìn)行仿真驗(yàn)證,點(diǎn)擊Star

44、t/Stop Debug Session按鈕進(jìn)入仿真環(huán)境 l 仿真界面如下圖所示 l 我們可以過觀測外圍設(shè)備觀測器來觀測程序的運(yùn)行情況,也可以通過窗口分析窗口來觀測程序的運(yùn)行狀態(tài)。下面我們還是以GPIO通用外部IO口程序來進(jìn)行仿真驗(yàn)證程序的運(yùn)行狀態(tài),下面的章節(jié)會對GPIO的例程做更詳細(xì)的介紹。 首先通過外設(shè)觀測器來觀測,如下圖所示: 我們來觀測GPIOA口的狀態(tài),進(jìn)入A口的外圍觀測界面。 另外,我們可以通過窗口觀測器來觀測程序的運(yùn)行情況。點(diǎn)擊窗口觀測器按鈕進(jìn)入觀測器,然后點(diǎn)擊Setup添加觀測的IO口(例如觀測GPIOC口的4、5、6、7,輸入POR

45、TC.4、PORTC.5、PORTC.6、PORTC.7),輸入完成后點(diǎn)擊運(yùn)行Run,可以看到波形圖變化情況,如下所示。 波形變化情況 l 點(diǎn)擊View-> Symbol Window,打開Symbol 窗口,通過圖示方法,在變量上或寄存器單擊右鍵,在程序運(yùn)行過程中觀察變量或寄存器值。此方法適用于在線調(diào)試。 按下F5鍵,或者點(diǎn)擊工具欄中Run按鈕,程序開始運(yùn)行,可以看到IO口引腳的變化情況。 4.3 JLINK下載 l 插上DC-5V電源給開發(fā)板供電,再插上JLINK。 點(diǎn)擊Target Options…->Debug進(jìn)行設(shè)置,按如下所示進(jìn)行設(shè)置。

46、 點(diǎn)擊Target Options…->Utilities 進(jìn)行設(shè)置,設(shè)置內(nèi)容如下圖所示 點(diǎn)擊Target Options…->Utilities->Settings 進(jìn)行設(shè)置,設(shè)置內(nèi)容如下圖所示 檢查下圖配置是否正確,若不正確按下圖方法修改。 l 點(diǎn)擊MDK工具欄中的Load 按鈕就可將編譯好的程序下載到開發(fā)板中。 l 下載成功之后,程序就會自動運(yùn)行。如果發(fā)現(xiàn)程序沒有運(yùn)行,則可按下開發(fā)板中的復(fù)位按鍵。 l 這里要注意的是:程序在燒寫到開發(fā)板后是否自動運(yùn)行,是可以在MDK開發(fā)環(huán)境:Target Options…->D

47、ebug->Setting->Falash DownLoad 中設(shè)置的;按下面設(shè)置好后,程序下載完成后可自動運(yùn)行,不需要手動復(fù)位。 第五章 了解stm32庫文件 stm32庫文件有兩種library2008文件夾和STM32F10xR.LIB,兩種實(shí)際上內(nèi)容是一樣的,創(chuàng)建工程時(shí)只需添加其中一種,不同的是library2008文件夾是開源的,我們可以看到所有庫函數(shù)的原型,而STM32F10xR.LIB不是開源的。前面創(chuàng)建工程時(shí)使用的后者,后者編程時(shí)更快。下面以library2008為例講解stm32庫文件結(jié)構(gòu)和組成。 library2008文件夾下有inc(include的縮寫)跟

48、src(source的簡寫)這兩個(gè)文件夾以及庫里帶的一個(gè)啟動文件文件夾,最新的庫官方網(wǎng)站上有的更詳細(xì),大家可以去官網(wǎng)上下載,這里以library2008進(jìn)行介紹。src里面是每個(gè)設(shè)備外設(shè)的驅(qū)動程序,這些外設(shè)是芯片制造商在Cortex-M3核外加進(jìn)去的。 進(jìn)入librarie2008目錄如下圖所示: 在src 和inc文件夾里的就是ST公司針對每個(gè)STM32外設(shè)而編寫的庫函數(shù)文件,每個(gè)外設(shè)對應(yīng)一個(gè) .c 和 .h 后綴的文件。我們把這類外設(shè)文件統(tǒng)稱為:stm32f10x_ppp.c 或stm32f10x_ppp.h文件,PPP表示外設(shè)名稱。 如針對模數(shù)轉(zhuǎn)換(ADC)外設(shè),在sr

49、c文件夾下有一個(gè)stm32f10x_adc.c源文件,在inc文件夾下有一個(gè)stm32f10x_adc.h頭文件,若我們開發(fā)的工程中用到了STM32內(nèi)部的ADC,則至少要把這兩個(gè)文件包含到工程里。 第六章 簡單例程分析 6.1流水燈介紹 想要控制LED燈,當(dāng)然是通過控制STM32芯片的I/O引腳電平的高低來實(shí)現(xiàn)。在STM32芯片上,I/O引腳可以被軟件設(shè)置成各種不同的功能,如輸入或輸出,所以被稱為GPIO (General-purpose I/O)。而GPIO引腳又被分為GPIOA、GPIOB??GPIOG不同的組,每組端口分為0~15,共16個(gè)不同的引腳,對于不同型號的芯片,端口的

50、組和引腳的數(shù)量不同,具體請參考相應(yīng)芯片型號的datasheet。 于是,控制LED的步驟有: 1. GPIO端口引腳多 --> 就要選定需要控制的特定引腳 2. GPIO功能如此豐富 --> 配置需要的特定功能 3. 控制LED的亮和滅 --> 設(shè)置GPIO輸出電壓的高低 要控制GPIO端口,就要涉及到控制相關(guān)的寄存器。這時(shí)我們就要查一查與GPIO相關(guān)的寄存器了,可以通過《STM32參考手冊》(最新版本)來查閱寄存器的定義方式。 以上的7個(gè)寄存器,相應(yīng)的功能在參考手冊上有詳細(xì)的說明。可以分為以下4類,其功能簡要概括如下: 1. 配置寄存器:選定GPIO的特定功能,最基本的

51、如:選擇作為輸入還是輸出端口。 2. 數(shù)據(jù)寄存器:保存了GPIO的輸入電平 或 將要輸出的電平。 3. 位控制寄存器:設(shè)置某引腳的數(shù)據(jù) 為1或0,控制輸出的電平。 4. 鎖定寄存器:設(shè)置某鎖定引腳后,就不能修改其配置。 注:要想知道其功能嚴(yán)謹(jǐn)、詳細(xì)的描述,請讀者養(yǎng)成習(xí)慣在正式使用時(shí),要以官方的datasheet為準(zhǔn),在這里只是簡單地概括其功能進(jìn)行說明。 關(guān)于寄存器名稱上標(biāo)號x 的意義,如:GPIOx_CRL、GPIOx_CRH ,這個(gè)x的取值可以為圖中括號內(nèi)的值(A??E),表示這些寄存器也跟GPIO一樣,也是分組的。也就是說,對于端口GPIOA和GPIOB,它們都有互不相干的一組寄

52、存器,如控制GPIOA的寄存器名為GPIOA_CRL、GPIOA_CRH等,而控制GPIOB的則是不同的、被命名為GPIOB_CRL、GPIOB_CRH等寄存器。 從這個(gè)圖我們可以知道STM32的功能,實(shí)際上也是通過配置寄存器來實(shí)現(xiàn)的。配置寄存器的具體參數(shù),需要參考《STM32參考手冊》的寄存器說明。見下圖。 如圖,對于GPIO端口,每個(gè)端口有16個(gè)引腳,每個(gè)引腳 的模式由寄存器的4個(gè)位控制,每四位又分為兩位控制引腳配置(CNFy[1:0]),兩位控制引腳的 模式及最高速度(MODEy[1:0]),其中y表示第y個(gè)引腳。這個(gè)圖是GPIOx_CRH寄存器的說明,配置GPIO引腳模

53、式的一共有兩個(gè)寄存器,CRH是高寄存器,用來配置高8位引腳:pin8~pin15。還有一個(gè)稱為CRL寄存器,如果我們要配置pin0~pin7引腳,則要在寄存器CRL中進(jìn)行配置。 舉例說明對CRH的寄存器的配置:當(dāng)給GPIOx_CRH寄存器的第28至29位設(shè)置為參數(shù)“11”,并在第30至31位 設(shè)置為參數(shù)“00”,則把x端口第15個(gè)引腳 的模式配置成了“輸出的最大速度為50MHz的 通用推挽輸出模式、”,其它引腳可通過其GPIOx_CRH或GPIOx_CRL的其它寄存器位來配置。至于x端口的x是指端口GPIOA還是GPIOB還要具體到不同的寄存器基址,這將在后面分析。 接下來分析要控制引腳電

54、平高低,需要對寄存器進(jìn)行什么具體的操作。 由寄存器說明圖可知,一個(gè)引腳y的輸出數(shù)據(jù)由GPIOx_BSRR寄存器位的2個(gè)位來控制分別為BRy (Bit Reset y)和BSy (Bit Set y),BRy位用于寫1清零,使引腳輸出低電平,BSy位用來寫1置1,使引腳輸出高電平。而對這兩個(gè)位進(jìn)行寫零都是無效的。(還可以通過設(shè)置寄存器ODR來控制引腳的輸出。) 例如:對x端口的寄存器GPIOx_BSRR的第0位(BS0) 進(jìn)行寫1,則x端口的第0引腳被設(shè)置為1,輸出高電平,若要令第0引腳再輸出低電平,則需要向GPIOx_BSRR的第16位(BR0) 寫1。 6.1.1 STM32的地址

55、映射 溫故而知新——stm32f10x_map.h文件 首先請大家回顧一下在51單片機(jī)上點(diǎn)亮LED是怎樣實(shí)現(xiàn)的。這太簡單了,幾行代碼就搞定。 以上代碼就可以點(diǎn)亮P0端口與LED陰極相連的LED燈了,當(dāng)然,這里省略了啟動代碼。為什么這個(gè)P0 =0; 句子就能控制P0端口為低電平,關(guān)鍵之處在于這個(gè)代碼所包含的頭文件。 在這個(gè)文件下有以下的定義: 這些定義被稱為地址映射。 所謂地址映射,就是將芯片上的存儲器 甚至I/O等資源與地址建立一一對應(yīng)的關(guān)系。如果某地址對應(yīng)著某寄存器,我們就可以運(yùn)用c語言的指針來尋址并修改這個(gè)地址上的內(nèi)容,從而實(shí)現(xiàn)修改該寄存器的內(nèi)容。

56、 正是因?yàn)?reg52.h>頭文件中有了對于各種寄存器和I/O端口的地址映射,我們才可以在51單片機(jī)程序中方便地使用P0 =0xFF; TMOD =0xFF等賦值句子對寄存器進(jìn)行配置,從而控制單片機(jī)。 Cortex-M3的地址映射也是類似的。Cortex-M3有32根地址線,所以它的尋址空間大小為2^32 bit=4GB。ARM公司設(shè)計(jì)時(shí),預(yù)先把這4GB的尋址空間大致地分配好了。它把地址從0x4000 0000至0x5FFF FFFF( 512MB )的地址分配給片上外設(shè)。通過把片上外設(shè)的寄存器映射到這個(gè)地址區(qū),就可以簡單地以訪問內(nèi)存的方式,訪問這些外設(shè)的寄存器,從而控制外設(shè)的工作。結(jié)果,

57、片上外設(shè)可以使用 C 語言來操作。M3存儲器映射見下圖。 stm32f10x.h這個(gè)文件中重要的內(nèi)容就是把STM32的所有寄存器進(jìn)行地址映射。如同51單片機(jī)的頭文件一樣,stm32f10x.h像一個(gè)大表格,我們在使用的時(shí)候就是通過宏定義進(jìn)行類似查表的操作,大家想像一下沒有這個(gè)文件的話,我們要怎樣訪問STM32的寄存器?有什么缺點(diǎn)? 不進(jìn)行這些宏定義的缺點(diǎn)有: 1、地址容易寫錯 2、我們需要查大量的手冊來確定哪個(gè)地址對應(yīng)哪個(gè)寄存器 3、看起來還不好看,且容易造成編程的錯誤,效率低,影響開發(fā)進(jìn)度。 當(dāng)然,這些工作都是由ST的固件工程師來完成的,只有設(shè)計(jì)M3的人才是

58、最了解M3的,才能寫出完美的庫。 在這里我們以外接了LED燈的外設(shè)GPIOC為例,在這個(gè)文件中有這樣的一系列宏定義: 這幾個(gè)宏定義是從文件中的幾個(gè)部分抽離出來的,具體的讀者可參考stm32f10x_map.h源碼。 l 外設(shè)基地址 首先看到PERIPH_BASE這個(gè)宏,宏展開為0x4000 0000,并把它強(qiáng)制轉(zhuǎn)換為uint32_t的32位類型數(shù)據(jù),這是因?yàn)榈豐TM32的地址是32位的,是不是覺得0x4000 0000這個(gè)地址很熟?是的,這個(gè)是Cortex-M3核分配給片上外設(shè)的從0x4000 0000至0x5FFF FFFF的512MB尋址空間中 的第一個(gè)地址,我們把0x4000

59、 0000稱為外設(shè)基地址。 l 總線基地址 接下來是宏APB2PERIPH_BASE,宏展開為PERIPH_BASE(外設(shè)基地址)加上偏移地址0x1 0000,即指向的地址為0x4001 0000。這個(gè)APB2PERIPH_BASE宏是什么地址呢?STM32不同的外設(shè)是掛載在不同的總線上的,見圖 5-8。有AHB總線、APB2總線、APB1總線,掛載在這些總線上的外設(shè)有特定的地址范圍。 其中像GPIO、串口1、ADC及部分定時(shí)器是掛載這個(gè)被稱為APB2的總線上,掛載到APB2總線上的外設(shè)地址空間是從0x4001 0000至地址0x4001 3FFF。這里的第一個(gè)地址,也就是0x400

60、1 0000,被稱為APB2PERIPH_BASE (APB2總線外設(shè)的基地址)。 而APB2總線基地址相對于外設(shè)基地址的偏移量為0x1 0000個(gè)地址,即為APB2相對外設(shè)基地址的偏移地址。 見表: 地址范圍 總線 總線基地址 總線基地址相對外設(shè)基地址(0x4000 000)的偏移量 0x40018000-0x5003 FFFF AHB 0x4001 8000 0x1 8000 0x4001 0000 - 0x4001 7FFF APB2 0x4001 0000 0x1 0000 0x4000 0000 - 0x4000FFFF AP

61、B1 0x4000 0000 0x0 0000 由這個(gè)表我們可以知道,stm32f10x_map.h這個(gè)文件中必然還有以下的宏: 因?yàn)槠屏繛榱?,所以APB1的地址直接就等于外設(shè)基地址 寄存器組基地址 最后到了宏GPIOC_BASE,宏展開為APB2PERIPH_BASE (APB2總線外設(shè)的基地址)加上相對APB2總線基地址的偏移量0x1000得到了GPIOC端口的寄存器組的基地址。這個(gè)所謂的寄存器組又是什么呢?它包括什么寄存器? 細(xì)看stm32f10x.h文件,我們還可以發(fā)現(xiàn)以下類似的宏: 除了GPIOC寄存器組的地址,還有GPIOA、GPIOB、GPI

62、OD的地址,并且這些地址是不一樣的。 前面提到,每組GPIO都對應(yīng)著獨(dú)立的一組寄存器,查看stm32的datasheet,看到寄存器說明如下圖: 注意到這個(gè)說明中有一個(gè)偏移地址:0x04,這里的偏移地址的是相對哪個(gè)地址的偏移呢?下面進(jìn)行舉例說明。 對于GPIOC組的寄存器,GPIOC含有的 端口配置高寄存器(GPIOC_CRH) 寄存器地址為:GPIOC_BASE +0x04。 假如是GPIOA組的寄存器,則GPIOA含有的 端口配置高寄存器(GPIOA_CRH)寄存器地址為:GPIOA_BASE+0x04。 也就是說,這個(gè)偏移地址,就是該寄存器 相對所在寄存器組基地址的偏移量。

63、 于是,讀者可能會想,大概這個(gè)文件含有一個(gè)類似如下的宏( 當(dāng)初野火也是這么想的 ): 這個(gè)宏,定義了GPIOC_CRH寄存器的具體地址,然而,在stm32f10x.h文件中并沒有這樣的宏。ST公司的工程師采用了更巧妙的方式來確定這些地址,請看下一小節(jié)——STM32庫對寄存器的封裝。 6.1.2 STM32庫對寄存器的封裝 ST的工程師用結(jié)構(gòu)體的形式,封裝了寄存器組,c語言結(jié)構(gòu)體學(xué)的不好的同學(xué),可以在這里補(bǔ)補(bǔ)課了。在stm32f10x_map.h文件中,有以下代碼: 有了這些宏,我們就可以定位到具體的寄存器地址,在這里發(fā)現(xiàn)了一個(gè)陌生的類型GPIO_TypeDef ,追蹤它的定義

64、,可以在stm32f10x_map.h 文件中找到如下代碼: GPIO_TypeDef 這段代碼,這個(gè)代碼用typedef 關(guān)鍵字聲明了名為GPIO_TypeDef的結(jié)構(gòu)體類型,結(jié)構(gòu)體內(nèi)又定義了7個(gè) vu32(volatile unsigned long)類型的變量。這些變量每個(gè)都為32位,也就是每個(gè)變量占內(nèi)存空間4個(gè)字節(jié)。在c語言中,結(jié)構(gòu)體內(nèi)變量的存儲空間是連續(xù)的,也就是說假如我們定義了一個(gè)GPIO_TypeDef ,這個(gè)結(jié)構(gòu)體的首地址(變量CRL的地址)若為0x4001 1000, 那么結(jié)構(gòu)體中第二個(gè)變量(CRH)的地址即為0x4001 1000 +0x04 ,加上的這個(gè)0x04 ,

65、正是代表4個(gè)字節(jié)地址的偏移量。 細(xì)心的同學(xué)會發(fā)現(xiàn),這個(gè)0x04偏移量,正是GPIOx_CRH寄存器相對于所在寄存器組的偏移地址,見上圖 。同理,GPIO_TypeDef 結(jié)構(gòu)體內(nèi)其它變量的偏移量,也和相應(yīng)的寄存器偏移地址相符。于是,只要我們匹配了結(jié)構(gòu)體的首地址,就可以確定各寄存器的具體地址了。 有了這些準(zhǔn)備,就可以分析本小節(jié)的第一段代碼了: GPIOA_BASE 在上一小節(jié)已解析,是一個(gè)代表GPIOA組寄存器的基地址。(GPIO_TypeDef *) 在這里的作用則是把GPIOA_BASE 地址轉(zhuǎn)換為GPIO_TypeDef 結(jié)構(gòu)體指針類型。 有了這樣的宏,以后我們寫代碼的時(shí)候

66、,如果要修改GPIO的寄存器,就可以用以下的方式來實(shí)現(xiàn)。代碼分析見注釋。 通過類似的方式,我們就可以給具體的寄存器寫上適當(dāng)?shù)膮?shù),控制STM32了。實(shí)際上我們并不是這樣使用庫的,庫為我們提供了更簡單的開發(fā)方式。M3的庫可謂盡情綻放了c的魅力。 6.1.3 STM32的時(shí)鐘系統(tǒng)(程序的心臟,每個(gè)例程公共的模塊) 首先,從整體上了解STM32的時(shí)鐘系統(tǒng)。見下圖。 我們配置GPIO引腳以后,要想讓GPIO可以正常運(yùn)行起來,需要有時(shí)鐘脈搏跳動來使他動起來,這就像人一樣,心臟是為我們提供一切運(yùn)動的根源,同樣,單片機(jī)也需要他的心里讓他的各個(gè)外設(shè)運(yùn)行起來,相信大家接觸過51單片機(jī)的同學(xué)這點(diǎn)比較清楚。 時(shí)鐘樹&時(shí)鐘源 這個(gè)圖說明了STM32的時(shí)鐘走向,從圖的左邊開始,從時(shí)鐘源一步步分配到外設(shè)時(shí)鐘。 從時(shí)鐘頻率來說,又分為高速時(shí)鐘和低速時(shí)鐘,高速時(shí)鐘是提供給芯片主體的主時(shí)鐘,而低速時(shí)鐘只是提供給芯片中的RTC(實(shí)時(shí)時(shí)鐘)及獨(dú)立看門狗使用。 從芯片角度來說,時(shí)鐘源分為內(nèi)部時(shí)鐘與外部時(shí)鐘源 ,內(nèi)部時(shí)鐘是在芯片內(nèi)部RC振蕩器產(chǎn)生的,起振較快,所以時(shí)鐘在芯片剛

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!