STM32 研究生教案_第1頁
STM32 研究生教案_第2頁
STM32 研究生教案_第3頁
STM32 研究生教案_第4頁
STM32 研究生教案_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、STM 32 初級(jí)學(xué)習(xí)第一章 初識(shí) Cortex-M331.1 ARM Cortex-M3 處理器初探31.2 從Cortex-M3 處理器內(nèi)核到基于Cortex-M3的MCU3第二章 開發(fā)環(huán)境MDK、J-link的搭建及系統(tǒng)調(diào)試72.1 JLINK驅(qū)動(dòng)安裝72.2 MDK環(huán)境搭建72.3 MDK破解11第三章 如何新建工程13第四章 工程編譯及仿真、程序的下載294.1 工程編譯304.2 仿真環(huán)境的搭建314.3 JLINK下載37第五章 了解stm32庫文件42第六章 簡單例程分析446.1流水燈介紹446.1.1 STM32的地址映射486.1.2 STM32庫對寄存器的封裝536.1

2、.3 STM32的時(shí)鐘系統(tǒng)(程序的心臟,每個(gè)例程公共的模塊)556.1.4流水燈例程606.1.5 仿真結(jié)果分析646.1.6程序下載到開發(fā)板后的結(jié)果顯示646.2系統(tǒng)滴答定時(shí)器SysTick646.2.1實(shí)例分析676.2.2仿真結(jié)果分析:716.2.3程序下載716.3 EXTI外部中斷716.3.1 NVIC結(jié)構(gòu)體成員746.3.2 搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)746.3.3 NVIC的優(yōu)先級(jí)組756.3.4 EXTI外部中斷766.3.5例程程序776.4串口部分786.4.1波特率控制796.4.2收發(fā)控制806.4.3數(shù)據(jù)存儲(chǔ)轉(zhuǎn)移部分806.4.4實(shí)例解析816.5 ADC(DMA模式)

3、816.5.1 ADC簡介816.5.2 STM32的ADC主要技術(shù)指標(biāo)826.5.3 ADC工作過程分析836.5.4 ADC采集例程分析84第一章 初識(shí) Cortex-M31.1 ARM Cortex-M3 處理器初探ARM Cortex-M3處理器,作為Cortex系列的處女作,為了讓32位處理器入主作莊單片機(jī)市場,轟轟烈烈地誕生了!由于采用了最新的設(shè)計(jì)技術(shù),它的門數(shù)更低,性能卻更強(qiáng)。許多曾經(jīng)只能求助于高級(jí)32位處理器或DSP的軟件設(shè)計(jì),都能在CM3上跑得很快很歡。嵌入式處理器市場正在32位化,相信用不了多久,CM3就一定會(huì)在這美麗新世界中脫穎而出。下面我們共同來了解一下CM3的優(yōu)勢:

4、性能強(qiáng)大。在相同的主頻下能做處理更多的任務(wù),全力支持勁爆的程序設(shè)計(jì)。 功耗低。延長了電池的壽命這簡直就是便攜式設(shè)備的命門(如無線網(wǎng)絡(luò)應(yīng)用)。 實(shí)時(shí)性好。采用了前衛(wèi)甚至革命性的設(shè)計(jì)理念,使它能極速地響應(yīng)中斷,而且響應(yīng)中斷所需的周期數(shù)是確定的。 代碼密度得到很大改善。一方面在大型應(yīng)用程序優(yōu)勢,另一方面為低成本設(shè)計(jì)而省吃儉用。 使用更方便?,F(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)的

5、,便宜的,全能的開發(fā)環(huán)境。值得一提的是,CM3并不是第一個(gè)被拿去做萬金油型處理器的內(nèi)核。那廉頗雖老卻依然驍勇的ARM7/ARM9處理器,在通用嵌入式處理器市場中德高望重,至今擁有無數(shù)鐵桿粉絲。半導(dǎo)體業(yè)界的群英們,像NXP(philips)、TI、Atmel、OKI、ST等,都以ARM為內(nèi)核,做出了各自身懷絕技的32位MCU。ARM7作為最受歡迎的32位嵌入式處理器,被載入了亮煌煌的幾頁史冊每年超過10億片出貨量,為各行各業(yè)的嵌入式設(shè)備中都找得到它們的身影。1.2 從Cortex-M3 處理器內(nèi)核到基于Cortex-M3的MCUCortex-M3處理器內(nèi)核是單片機(jī)的中央處理單元(CPU)。完整的

6、基于CM3的MCU還需要很多其它組件。在芯片制造商得到CM3處理器內(nèi)核的使用授權(quán)后,它們就可以把CM3內(nèi)核用在自己的硅片設(shè)計(jì)中,添加存儲(chǔ)器,外設(shè),I/O以及其它功能塊。Cortex-M3 是一款低功耗處理器,具有門數(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

7、(DSP)和ARM 系統(tǒng)訪問的模塊除外。 只有分組的 SP 硬件除法指令,SDIV 和UDIV(Thumb-2 指令) 處理模式(handler mode)和線程模式(thread mode) Thumb 狀態(tài)和調(diào)試狀態(tài) 可中斷-可繼續(xù)(interruptible-continued)的LDM/STM,PUSH/POP,實(shí)現(xiàn)低中斷延遲。 自動(dòng)保存和恢復(fù)處理器狀態(tài),可以實(shí)現(xiàn)低延遲地進(jìn)入和退出中斷服務(wù)程序(ISR)。 支持 ARMv6 架構(gòu)BE8/LE ARMv6 非對齊訪問l 嵌套向量中斷控制器(NVIC)。它與處理器內(nèi)核緊密結(jié)合實(shí)現(xiàn)低延遲中斷處理,并具有以下特性: 外部中斷可配置為 1240

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

9、HBLite ICode、DCode 和系統(tǒng)總線接口 APB 專用外設(shè)總線(PPB)接口 Bit band 支持,bit-band 的原子寫和讀訪問。 存儲(chǔ)器訪問對齊 寫緩沖區(qū),用于緩沖寫數(shù)據(jù)。l 低成本調(diào)試解決方案,具有以下特性: 當(dāng)內(nèi)核正在運(yùn)行、被中止、或處于復(fù)位狀態(tài)時(shí),能對系統(tǒng)中包括Cortex-M3 寄存器組在內(nèi)的所有存儲(chǔ)器和寄存器進(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)分析(systemprofiling) 儀表跟蹤宏

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

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

12、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 在用戶名中填入名字(可隨便寫,可空格),在郵件地址那里填入郵件地址(可隨便寫,可空格),點(diǎn)擊Next。l 正在安裝,請耐心等待。 l 點(diǎn)擊 Finish,安裝完成。 l 此時(shí)就可在桌面看到MDK的快

13、捷圖標(biāo),如下所示: 2.3 MDK破解安裝完MDK開發(fā)環(huán)境后,在下載程序的時(shí)候會(huì)有40K的代碼限制,我們需要破解軟件即可完成大程序代碼的編譯,在軟件安裝目錄下:找到KEIL_Lic.exe,點(diǎn)擊KEIL_Lic.exe,如下圖所示在彈出的界面中的CID選項(xiàng)框中填入MDK的CID(MDK的CID在MDK開發(fā)環(huán)境中的菜單欄FileLicense Managemant 中獲取到如下面兩幅圖所示),在Target下拉框中選擇ARM,然后點(diǎn)擊Generate按鈕,復(fù)制產(chǎn)生的CID Code,然后回到MDK開發(fā)環(huán)境中的菜單欄FileLicense Managemant 中,把剛剛在注冊機(jī)復(fù)制到的CID C

14、ode粘貼到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),啟動(dòng)軟件。如果是第一次使用的話會(huì)打開一個(gè)自帶的工程文件,我們可以通過工具欄Project->Close Project選項(xiàng)把它關(guān)掉。 在工具欄Project->New Vision Project新建我們的工程文件,我們將新建的工程保

15、存在E:新工程Project路徑下,文件名可以任意?。ò醋约阂庠高x擇),點(diǎn)擊保存。l 接下來的窗口是讓我們選擇公司和芯片的型號(hào),我們用的芯片是ST公司的STM32F103ZET6,有64K SRAM,512K Flash,屬于高集成度的芯片。按如下選擇即可。 l 接下來的窗口問我們是否需要拷貝STM32的啟動(dòng)代碼到工程文件中,這份啟動(dòng)代碼在M3系列中都是適用的,一般情況下我們都點(diǎn)擊否,我們這里用的是ST的庫,庫文件里面也自帶了這一份啟動(dòng)代碼,所以為了保持庫的完整性,我們就不需要開發(fā)環(huán)境為我們自帶的啟動(dòng)代碼了,稍后我們自己手動(dòng)添加,這里我們點(diǎn)擊否。 l 將E:STM3教程+實(shí)驗(yàn)創(chuàng)建工程+編程教程

16、創(chuàng)建工程所需工程文件下的啟動(dòng)文件STM32F10x.s拷貝到E:新工程Start文件夾Start下。l 將E:STM3教程+實(shí)驗(yàn)創(chuàng)建工程+編程教程創(chuàng)建工程所需工程文件下的固件庫文件STM32F10xR.LIB拷貝到E:新工程Library文件夾library下。l 將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文件夾下存放啟動(dòng)文件,us

17、er文件夾下存放用戶創(chuàng)建文件,lib存放系統(tǒng)庫文件。l 修改文件夾名稱和添加相應(yīng)的文件。l 添加并修改文件夾名為:Start,User,Library,如圖。l 接下來我們往我們這些新建的組中添加文件,雙擊哪個(gè)組就可以往哪個(gè)組里面添加文件。首先向Start文件夾添加STM32F10x.s文件,選中Start,單擊Add Files彈出下圖對話框,文件類型選擇All file(*.*)找到E:新工程Start下的STM32F10x.s文件,單擊add ,然后單擊close完成,在右側(cè)Files欄會(huì)看到STM32F10x.s已添加到目錄下l 向Library文件夾添加STM32F10xR.LIB文

18、件,選中Library,單擊Add Files彈出下圖對話框,文件類型選擇All file(*.*),找到E:新工程Library下的STM32F10xR.LIB文件并選中,單擊add,然后單擊close完成。在右側(cè)Files欄會(huì)看到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欄會(huì)看到main.c和s

19、tm32f10x_it.c已添加到目錄下。l 單擊對話框中的OK,完成添加,結(jié)果如圖所示 l 雙擊右側(cè)目錄下main.c,將其打開空白的main.c,一般main.c編寫必要的程序,實(shí)現(xiàn)想要的功能。其中頭文件、變量聲明、硬件初始化、程序主體、其他函數(shù)實(shí)體等是必不可少的。為了便于入門,這里暫時(shí)不需要自己去編程,只需拷貝下面附的程序到main.c,然后單擊保存。附:/* File Name : main.c* Author : * Date First Issued : * Description : Main program body*/* Includes -*/#include "

20、stm32f10x_lib.h"/加載庫文件extern vu32 TimingDelay;u16 count;/* Private function prototypes -初始化-*/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)生一次中斷/* Priva

21、te functions -*/* Function Name : main* Description : Main program.* Input : None* Output : None* Return : None*/int main(void)/主函數(shù)#ifdef DEBUG debug();#endif /* Configure the system clocks */調(diào)用各初始化函數(shù) /* RCC Configuration */ RCC_Configuration(); SysTick_Configuration(); /* NVIC Configuration */ NVIC

22、_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+;/* Function Name : RCC_Configuration* Description : Configures the different syst

23、em clocks.* Input : None* Output : None* Return : None*/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(HSEStartU

24、pStatus = 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); /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_Prefe

25、tchBuffer_Enable); /* 選擇外部的8MHz時(shí)鐘 PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /*使能 PLL */ RCC_PLLCmd(ENABLE); /* 等待PLL有效 */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET) /*以PLL為系統(tǒng)時(shí)鐘源 */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 等待有效 */ while(RCC_GetSYSC

26、LKSource() != 0x08) /* Function Name : NVIC_Configuration* Description : Configures Vector Table base location.* Input : None* Output : None* Return : None*/void NVIC_Configuration(void)/ NVIC_InitTypeDef NVIC_InitStructure; #ifdef VECT_TAB_RAM /編譯選擇中斷跳轉(zhuǎn)存儲(chǔ)區(qū)類型 /* Set the Vector Table base location at

27、 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* Functio

28、n Name : GPIO_Configuration* Description : Configures the different GPIO ports.* Input : None* Output : None* Return : None*/void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;/* 定義1個(gè)結(jié)構(gòu)體變量 */* 打開GPIOC */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);/* 可以對PC3 - PC5 一起初始化 */GPIO_I

29、nitStructure.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ù)初始化GPIO */* Function Name : SysTick_Configuration* Description : Configures the SysTick to ge

30、nerate an interrupt each 1 millisecond.* Input : None* Output : None* Return : None*/void SysTick_Configuration(void) /*選用 系統(tǒng)時(shí)鐘/8 時(shí)鐘為 時(shí)鐘源*/ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);/72M/8 =9M; /* 中斷優(yōu)先級(jí)為 3 */ NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0); /*每1ms產(chǎn)生一次中斷*/ Sy

31、sTick_SetReload(9000); /* 使能 SysTick 中斷*/ SysTick_ITConfig(ENABLE);/* Function Name : Delay* Description : Inserts a delay time.精確延時(shí)* Input : nTime: specifies the delay time length, in milliseconds.* Output : None* Return : None*/void Delay(u32 nTime) /* 使能SysTick 中斷 */ SysTick_CounterCmd(SysTick_Co

32、unter_Enable); TimingDelay = nTime;/延時(shí)時(shí)間付系統(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è)按

33、鈕,現(xiàn)在我們從左往右來介紹下這三個(gè)按鈕的功能。l 第一個(gè)按鈕:Translate 就是編譯當(dāng)下修改過的文件,檢查下有沒有語法錯(cuò)誤,并不會(huì)去鏈接庫文件,也不會(huì)生成可執(zhí)行文件。 l 第二個(gè)按鈕:Build 就是編譯當(dāng)下修改過的文件,它包含了語法檢查,鏈接動(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按鈕,MDK開始編譯我們

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

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

36、后點(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è)置。Ø 點(diǎn)擊Target Options->Utilities

37、 進(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 下載成功之后,程序就會(huì)自動(dòng)運(yùn)行。如果發(fā)現(xiàn)程序沒有運(yùn)行,則可按下開發(fā)板中的復(fù)位按鍵。 l 這里要注意的是:程序在燒寫到開發(fā)板后是否自動(dòng)運(yùn)行,是可以在MDK開發(fā)環(huán)境:Target Options->Debug->Setting->Falash DownLoad 中設(shè)置的;按下面設(shè)置好后,

38、程序下載完成后可自動(dòng)運(yùn)行,不需要手動(dòng)復(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的縮寫)跟src(source的簡寫)這兩個(gè)文件夾以及庫里帶的一個(gè)啟動(dòng)文件文件夾,最新的庫官方網(wǎng)站上有的更詳細(xì),大家可

39、以去官網(wǎng)上下載,這里以library2008進(jìn)行介紹。src里面是每個(gè)設(shè)備外設(shè)的驅(qū)動(dòng)程序,這些外設(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è),在src文件夾下有一個(gè)stm32f10x_adc.c源文件,在inc文件夾下有一個(gè)stm32f10x_adc.

40、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、GPIOBGPIOG不同的組,每組端口分為015,共16個(gè)不同的引腳,對于不同型號(hào)的芯片,端口的組和引腳的數(shù)量不同,具體請參考相應(yīng)芯片型號(hào)的datasheet。于是,控制LED的步驟有:1. GPIO端口引腳多 ->

41、 就要選定需要控制的特定引腳2. GPIO功能如此豐富 -> 配置需要的特定功能3. 控制LED的亮和滅 -> 設(shè)置GPIO輸出電壓的高低要控制GPIO端口,就要涉及到控制相關(guān)的寄存器。這時(shí)我們就要查一查與GPIO相關(guān)的寄存器了,可以通過STM32參考手冊(最新版本)來查閱寄存器的定義方式。以上的7個(gè)寄存器,相應(yīng)的功能在參考手冊上有詳細(xì)的說明。可以分為以下4類,其功能簡要概括如下:1. 配置寄存器:選定GPIO的特定功能,最基本的如:選擇作為輸入還是輸出端口。2. 數(shù)據(jù)寄存器:保存了GPIO的輸入電平 或 將要輸出的電平。3. 位控制寄存器:設(shè)置某引腳的數(shù)據(jù) 為1或0,控制輸出的電

42、平。4. 鎖定寄存器:設(shè)置某鎖定引腳后,就不能修改其配置。注:要想知道其功能嚴(yán)謹(jǐn)、詳細(xì)的描述,請讀者養(yǎng)成習(xí)慣在正式使用時(shí),要以官方的datasheet為準(zhǔn),在這里只是簡單地概括其功能進(jìn)行說明。關(guān)于寄存器名稱上標(biāo)號(hào)x 的意義,如:GPIOx_CRL、GPIOx_CRH ,這個(gè)x的取值可以為圖中括號(hào)內(nèi)的值(AE),表示這些寄存器也跟GPIO一樣,也是分組的。也就是說,對于端口GPIOA和GPIOB,它們都有互不相干的一組寄存器,如控制GPIOA的寄存器名為GPIOA_CRL、GPIOA_CRH等,而控制GPIOB的則是不同的、被命名為GPIOB_CRL、GPIOB_CRH等寄存器。從這個(gè)圖我們可以

43、知道STM32的功能,實(shí)際上也是通過配置寄存器來實(shí)現(xiàn)的。配置寄存器的具體參數(shù),需要參考STM32參考手冊的寄存器說明。見下圖。如圖,對于GPIO端口,每個(gè)端口有16個(gè)引腳,每個(gè)引腳 的模式由寄存器的4個(gè)位控制,每四位又分為兩位控制引腳配置(CNFy1:0),兩位控制引腳的 模式及最高速度(MODEy1:0),其中y表示第y個(gè)引腳。這個(gè)圖是GPIOx_CRH寄存器的說明,配置GPIO引腳模式的一共有兩個(gè)寄存器,CRH是高寄存器,用來配置高8位引腳:pin8pin15。還有一個(gè)稱為CRL寄存器,如果我們要配置pin0pin7引腳,則要在寄存器CRL中進(jìn)行配置。舉例說明對CRH的寄存器的配置:當(dāng)給G

44、PIOx_CRH寄存器的第28至29位設(shè)置為參數(shù)“11”,并在第30至31位 設(shè)置為參數(shù)“00”,則把x端口第15個(gè)引腳 的模式配置成了“輸出的最大速度為50MHz的 通用推挽輸出模式、”,其它引腳可通過其GPIOx_CRH或GPIOx_CRL的其它寄存器位來配置。至于x端口的x是指端口GPIOA還是GPIOB還要具體到不同的寄存器基址,這將在后面分析。接下來分析要控制引腳電平高低,需要對寄存器進(jìn)行什么具體的操作。由寄存器說明圖可知,一個(gè)引腳y的輸出數(shù)據(jù)由GPIOx_BSRR寄存器位的2個(gè)位來控制分別為BRy (Bit Reset y)和BSy (Bit Set y),BRy位用于寫1清零,使

45、引腳輸出低電平,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的地址映射溫故而知新stm32f10x_map.h文件首先請大家回顧一下在51單片機(jī)上點(diǎn)亮LED是怎樣實(shí)現(xiàn)的。這太簡單了,幾行代碼就搞定。以上代碼就可以點(diǎn)亮P0端口與LED陰極相連的LED燈了,當(dāng)然,這里省略了啟動(dòng)代碼。為什么這個(gè)P0 =0;

46、句子就能控制P0端口為低電平,關(guān)鍵之處在于這個(gè)代碼所包含的頭文件<reg52.h>。在這個(gè)文件下有以下的定義:這些定義被稱為地址映射。所謂地址映射,就是將芯片上的存儲(chǔ)器 甚至I/O等資源與地址建立一一對應(yīng)的關(guān)系。如果某地址對應(yīng)著某寄存器,我們就可以運(yùn)用c語言的指針來尋址并修改這個(gè)地址上的內(nèi)容,從而實(shí)現(xiàn)修改該寄存器的內(nèi)容。正是因?yàn)?lt;reg52.h>頭文件中有了對于各種寄存器和I/O端口的地址映射,我們才可以在51單片機(jī)程序中方便地使用P0 =0xFF; TMOD =0xFF等賦值句子對寄存器進(jìn)行配置,從而控制單片機(jī)。Cortex-M3的地址映射也是類似的。Cortex-M

47、3有32根地址線,所以它的尋址空間大小為232 bit=4GB。ARM公司設(shè)計(jì)時(shí),預(yù)先把這4GB的尋址空間大致地分配好了。它把地址從0x4000 0000至0x5FFF FFFF( 512MB )的地址分配給片上外設(shè)。通過把片上外設(shè)的寄存器映射到這個(gè)地址區(qū),就可以簡單地以訪問內(nèi)存的方式,訪問這些外設(shè)的寄存器,從而控制外設(shè)的工作。結(jié)果,片上外設(shè)可以使用 C 語言來操作。M3存儲(chǔ)器映射見下圖。stm32f10x.h這個(gè)文件中重要的內(nèi)容就是把STM32的所有寄存器進(jìn)行地址映射。如同51單片機(jī)的<reg52.h>頭文件一樣,stm32f10x.h像一個(gè)大表格,我們在使用的時(shí)候就是通過宏定義

48、進(jìn)行類似查表的操作,大家想像一下沒有這個(gè)文件的話,我們要怎樣訪問STM32的寄存器?有什么缺點(diǎn)?不進(jìn)行這些宏定義的缺點(diǎn)有:1、地址容易寫錯(cuò)2、我們需要查大量的手冊來確定哪個(gè)地址對應(yīng)哪個(gè)寄存器3、看起來還不好看,且容易造成編程的錯(cuò)誤,效率低,影響開發(fā)進(jìn)度。當(dāng)然,這些工作都是由ST的固件工程師來完成的,只有設(shè)計(jì)M3的人才是最了解M3的,才能寫出完美的庫。在這里我們以外接了LED燈的外設(shè)GPIOC為例,在這個(gè)文件中有這樣的一系列宏定義:這幾個(gè)宏定義是從文件中的幾個(gè)部分抽離出來的,具體的讀者可參考stm32f10x_map.h源碼。l 外設(shè)基地址首先看到PERIPH_BASE這個(gè)宏,宏展開為0x400

49、0 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 0000稱為外設(shè)基地址。l 總線基地址接下來是宏APB2PERIPH_BASE,宏展開為PERIPH_BASE(外設(shè)基地址)加上偏移地址0x1 0000,即指向的地址為0x4001 0000。這個(gè)APB2PERIPH_BASE宏是什么地址呢?STM32不同的外設(shè)是掛載在不同的總線上的,見圖 5-8

50、。有AHB總線、APB2總線、APB1總線,掛載在這些總線上的外設(shè)有特定的地址范圍。其中像GPIO、串口1、ADC及部分定時(shí)器是掛載這個(gè)被稱為APB2的總線上,掛載到APB2總線上的外設(shè)地址空間是從0x4001 0000至地址0x4001 3FFF。這里的第一個(gè)地址,也就是0x4001 0000,被稱為APB2PERIPH_BASE (APB2總線外設(shè)的基地址)。而APB2總線基地址相對于外設(shè)基地址的偏移量為0x1 0000個(gè)地址,即為APB2相對外設(shè)基地址的偏移地址。見表:地址范圍 總線 總線基地址 總線基地址相對外設(shè)基地址(0x4000 000)的偏移量 0x40018000-0x5003

51、 FFFF AHB 0x4001 8000 0x1 8000 0x4001 0000 - 0x4001 7FFF APB2 0x4001 0000 0x1 0000 0x4000 0000 - 0x4000FFFF APB1 0x4000 0000 0x0 0000 由這個(gè)表我們可以知道,stm32f10x_map.h這個(gè)文件中必然還有以下的宏:因?yàn)槠屏繛榱?,所以APB1的地址直接就等于外設(shè)基地址Ø 寄存器組基地址最后到了宏GPIOC_BASE,宏展開為APB2PERIPH_BASE (APB2總線外設(shè)的基地址)加上相對APB2總線基地址的偏移量0x1000得到了GPIOC端口的寄存器組的基地址。這個(gè)所謂的寄存器組又是什么呢?它包括什

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論