STM32在KEILMDK環(huán)境下使用V3.4庫_第1頁
STM32在KEILMDK環(huán)境下使用V3.4庫_第2頁
STM32在KEILMDK環(huán)境下使用V3.4庫_第3頁
STM32在KEILMDK環(huán)境下使用V3.4庫_第4頁
STM32在KEILMDK環(huán)境下使用V3.4庫_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、- -在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程簡介寫這篇“小”教程主要是和大家分享使用STM32的基本方法。在一年以前,我開始接觸并開始使用STM32。STM32價(jià)格便宜,外設(shè)豐富,開發(fā)和仿真環(huán)境使用方便,一下子便愛上了它。我當(dāng)時(shí)使用了IAR編譯環(huán)境,固件庫也是以前的V2版本。由于ST公司更新了STM32的固件庫,所以想試著使用新固件庫。剛開始使用新庫時(shí)也遇到了一些問題,但是慢慢熟悉不但覺得不難不煩,反而覺得V3比V2更好用。在這里我和大家分享一下使用V3.4庫的方法,希望大家喜歡,如有錯(cuò)誤請指出,在下不慎感激。這篇“小”

2、教程分以下四步來說,第一步,獲得庫文件,并進(jìn)行適當(dāng)?shù)恼?;第二步,建立工程,并建立條理清晰的GROUP;第三步,修改工程的Option屬性;第四步:使用JLINK仿真調(diào)試。下面就分這四大步來逐個(gè)說明。在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- -第一步獲得庫文件,并進(jìn)行適當(dāng)?shù)恼淼谝徊椒浅5暮唵危L問ST的官網(wǎng)上就可以獲得最新的固件庫,在我寫“小”教程的時(shí)候最新的固件庫是V3.4。除了獲得固件庫之外還可以獲得和固件庫相關(guān)的說明文檔。在以前的官網(wǎng)上可以下載到一篇名為如何從STM32F10XXX固件庫V2.0.3升級(jí)為STM32F10XXX標(biāo)準(zhǔn)外設(shè)庫V3.0.0的應(yīng)用手冊,但是在現(xiàn)

3、在的ST官網(wǎng)上卻找不到這篇十分有用的應(yīng)用文檔,不過卻可以在百度文庫中找到,這篇文檔詳細(xì)說明了新固件庫的文件結(jié)構(gòu),在Keil工程建立之前,值得一看?!眎jCMSIS二CoreT二CM3-JstartupQistartup_stm32MClK_hd.sQjtartup_stm32nOx_ld.sstartup_stm32f1Ox_hdcatartup_$tm32f1Chcld.uirl二getQOx_md.sjrtup_m32fW(_hdsstartup_5tm32fW!system_stm32f10 x.c,也有新的啟動(dòng)代碼如start_stm32f10 x_h/m/ld.s。在第二部分會(huì)詳細(xì)介

4、紹這些文件到底有什么作用,以及和V2版本的區(qū)別。在這里我也補(bǔ)充一句,V3.4還是和V3.0有點(diǎn)區(qū)別,V3.4又比V3.0多出了幾個(gè)啟動(dòng)代碼。我個(gè)人覺得這些文件“埋”的太深,使用起來有點(diǎn)不方便,所以我一般對這些文件進(jìn)行一些整理,把相關(guān)文件放在一起,并取上一個(gè)標(biāo)準(zhǔn)化的名字,這些文件夾的名字一般和原始固件庫文件夾的名字相同,只是把需要的文件放在一起。例如我把啟動(dòng)代碼(startup)放在一個(gè)文件夾下面,而在這個(gè)文件下面只放KeilMDK有關(guān)的啟動(dòng)代碼,把IAR和GCC的文件全部給去除了,這樣做不但使得文件夾內(nèi)容“清爽”也可以避免不必要的錯(cuò)誤。一般在工程目錄下面我會(huì)建立以下幾個(gè)文件夾,如圖2所示。當(dāng)然

5、還會(huì)建立兩個(gè)很有用的文件夾,一個(gè)取名為Listing,另一個(gè)取名為Object。這兩個(gè)文件夾會(huì)保存Keil編譯連接過程中產(chǎn)生的一些文件,雖然是一個(gè)不起眼的細(xì)節(jié)但是也請大家關(guān)注,不然在工程目錄下面“邋遢”的很!詢startupstm32f10 xd.5a抽5tartup_stm32f10 x_hd.s班startup_stm32f10 x_hd_vl.s班startup_stm32f1Oxd,sa哲5tartup_stm32f1Ox_ld_vl.sa刮startup_stm32f1Ox_md.sa詢startup_stm32f1Ox_md_vl.sa抽5tartup_stm32f10 x_xl.

6、sStartup文件夾cstm32fl0 x_exti.ccstm32fl0 x_flash.cMstmSSflOxJsmc.c5stm32fl0 x_gpio.c5tm32fl0 xcstm32fl0 xwdg,ccstm32fl0 xjziwr.c1b冏stm32l:10 x_exti.hRstmSSflOxJIash.hiMstmSZflOxJsmc.hHstmSZflOX-gpio.h筒stmBMldx_i2c.hstmSZflOxjziwr.h圖2工程文件夾的結(jié)構(gòu)和相關(guān)文件Periph_Driverc件夾F面來簡單說說這些文件各有什么作用。在下重在應(yīng)用,對里面的內(nèi)容也知之甚少。cor

7、e_cm3.c/core_cm3.h該文件是內(nèi)核訪問層的源文件和頭文件,查看其中的代碼多半是使用匯編語言編寫的。在線不甚了解stm32f10 x.h該文件是外設(shè)訪問層的頭文件,該文件是最重要的頭文件之一。例如定義了CPU是哪種容量的CPU,中斷向量等等。除了這些該頭文件還定義了和外設(shè)寄存器相關(guān)的結(jié)構(gòu)體,例如:typedefstruct_IOuint32_tCRL;_IOuint32_tCRH;_IOuint32_tIDR;_IOuint32_tODR;_IOuint32_tBSRR;_IOuint32_tBRR;_IOuint32_tLCKR;GPIO_TypeDef;包含了那么多寄存器的定義

8、,那么在應(yīng)用文件中(例如自己編寫的main源文件)只需要包含stm32f10 x即可,而不是以前固件庫的需要包含stm32f10 x_conf.h這個(gè)頭文件。system_stm32f10 x.c/h該頭文件也可以稱為外設(shè)訪問層的頭文件和源文件。在該文件中可以定義系統(tǒng)的時(shí)鐘頻率,定義低速時(shí)鐘總線和高速時(shí)鐘總線的頻率,其中最關(guān)鍵的函數(shù)就是Systemlnit()了,這個(gè)后面會(huì)詳細(xì)介紹??傊@兩個(gè)文件是新固件庫的重點(diǎn),有了它糧也大大簡化了使用stm32的初始化工作。stm32f10 x_conf.h這個(gè)文件和V2版本的庫的內(nèi)容是一樣的,需要使用哪些外設(shè)就取消哪些外設(shè)的注釋。例如需要使用GPIO功能

9、,但不使用SPI功能,就可以這樣操作。#includestm32f10 x_gpio.h/*#includestm32f10 x_spi.h*/main.c這個(gè)文件就不用多說了,自己編寫stm32f10 x_it.c/h這兩個(gè)文件包含了stm32中斷函數(shù),在源文件和頭文件中并沒有把所有的中斷入口函數(shù)都寫出來,而只寫了ARM內(nèi)核的幾個(gè)異常中斷,其他的中斷函數(shù)需要用戶自己編寫。stm32f10 x_it.c的最后給了這樣一個(gè)模板。/*STM32F10 xPeripheralsInterruptHandlers*/*AddheretheInterruptHandlerfortheusedperiph

10、eral(s)(PPP),forthe*/*availableperipheralinterrupthandlersnamepleaserefertothestartup*/*file(startup_stm32f10 x_xx.s).*/briefThisfunctionhandlesPPPinterruptrequest.paramNoneretvalNone*/*voidPPP_IRQHandler(void)*/從注釋中的英文提示可以看出,中斷向量的名稱可以從相應(yīng)的啟動(dòng)代碼中找出,例如可以在startup_stm32f10 x_md.s中找到USART1中斷函數(shù)的名稱USART1_IR

11、QHandler。其他的中斷函數(shù)名可以以此類推,一一獲得,在這里我就不一一復(fù)述了。StdPeriph_Driver文件夾該文件夾有包含兩個(gè)文件夾,一個(gè)是src文件夾,另一個(gè)是inc文件夾,顧名思義,一個(gè)里面放的是元件一個(gè)里面放的是頭文件。這兩個(gè)文件夾包含了所有的STM32的外設(shè)驅(qū)動(dòng)函數(shù),其實(shí)和V2版本也沒有太大的變化。簡單來說,外設(shè)的驅(qū)動(dòng)相當(dāng)于windows的驅(qū)動(dòng)函數(shù)API,這些驅(qū)動(dòng)函數(shù)看到函數(shù)名基本就可以明白這個(gè)函數(shù)的作用,例如:GPIO_SetBits可以置位某個(gè)IO口,相反GPIO_ResetBits則可以復(fù)位某個(gè)IO口。我個(gè)人認(rèn)為熟練使用庫可以大大提高編程的效率,同時(shí)規(guī)范使用庫函數(shù)也可

12、以提高程序的可讀性,讓團(tuán)隊(duì)中的其他程序員可以快速的明白代碼的作用。在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- -第二步,建立工程,并建立條理清晰的GROUP從這一步開始就開始和KeilMDK打交道了。首先建立一個(gè)Keil工程,這一小步再簡單不過了Project菜單項(xiàng)中點(diǎn)擊NewuVisionProject,然后保存工程文件,路徑自由設(shè)定并可以包含中文。然后選擇指定的CPU型號(hào),如圖3所示。例如選擇STM32F103RB。CPUVendor:Device:Toolset:STMicroelectronicsSTM32F103RBARMDatabaseDescription:新版以

13、上STM32F102RBSTM32F103C4鶴STM32F103C6STM32F103CSSTM32F103CB鶴STM32F103R4翡圖332選擇CPU型號(hào)的窗口,在這里接著彈出一個(gè)添加啟的啟動(dòng)代碼和這個(gè)不STM32F103RDSTM32F103RE端和在Keil環(huán)境要自己添加。之前運(yùn)行的代碼。ARM32-bitCortei-M3Mi(;dconiPLL;EmbeddedInternalRC8MINestedInterrupt.Controller,Pew3Synph.16-bitTime踐:就hInpul16-bit6-chAdvancedTimer/21PL.:2-l2C;.3USA

14、RT,USB:2:212-bii16-chA/DConverter,F的幾個(gè)選擇CPU型號(hào)后就需要建立一個(gè)條理清晰的Group,在這里我強(qiáng)調(diào)的是一個(gè)“條理性”使用51很相似,所以也不必多說。我盡可能的把同類的文件放在一起,并取名和工程文件目錄中相同的名字,這樣便于管理也避免不必要的錯(cuò)誤。在Target1選項(xiàng)上右擊,在彈出菜單上選擇managepgomponents,如圖5所示。HelpFrojectComponentsfdders/ExtensionsBotiki點(diǎn)擊新建或PrQjepightClickjITarge*eGroup1ProjectTargets:X嚴(yán)*Gruups:ffiOpe

15、OpeOpeLEDToggleUserRebiBuildTranStop適當(dāng)修改Target的名稱CMSIS-StdPeriph_DrivrStartUp圖5開始添加Group建立相應(yīng)的Group。例如User,CMSIS,程文件夾的名稱保持一致,如圖6所示。為每個(gè)G查看代碼,我把源文件和頭文件都添加進(jìn)型。StdPeriph_Driver中只添加需要的源文件,必要的初始化之外,只需要包含GPIO的操作函數(shù),當(dāng)然需要使用GPIO就必須要使能GPIO的時(shí)鐘,RCC是絕對少不了的。所以只需要包含misc.c,stm32f10 x_gpio.c和stm32f10 x_rcc.C。雖然在有些Group中

16、包含了一些頭文件,但是Keil在編譯連接的時(shí)卻不知道頭文件在什么地方,所以一定要指定頭文件的路徑。添加需要的文件之后,工程目錄如圖7所示。Gromisc.c,AddSt童已|圖6新建Group這些Group的名稱和工dPeriph_Driver和StartUP,roup添加同名文件夾下的源文件或者頭文件,為了便于up呻(除StdPeriph_Driver),在這例如建立一個(gè)Led閃爍的工程,那.、八、_KvH注意過濾需要說明的是,上件的類在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- -在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- #-圖7工程文件夾目錄在KeilMD

17、K環(huán)境下使用STM32V3.4庫“小”教程- -第三步修改工程的Option屬性修改工程屬主要目的是指定相關(guān)頭文件的路徑。接著上面說就是右擊工程目錄的LEDToggle則會(huì)出現(xiàn)Option選項(xiàng)卡,當(dāng)然右擊User或者其他的Group就不會(huì)出現(xiàn)Option選項(xiàng)卡,初學(xué)者極容易犯這個(gè)錯(cuò)誤。OptionsforTargetLEDToggle1DeviceT:=ltge11OutputListingUserC/C卄AsmLiSelectFolderforObjects.-CreateExecutable:ALEDToqqle7DebugInformationCreateHEXFile*BrowseIn

18、formationNam已ofEi-iecutabl已:給outputsObject的SelectFolderforListings.PageWidth:79蘭PagevAssemblerListing:Ax.lst1/CrossReferenceListina選擇堆C/C+AsmLirikerHebugCCompilerListing:.V.txtOptionsForTargetLEDToggle1Listing的文件CreateLibrary:ALEDToggle.LIElCP已processorListing:Ax.i圖8Output選項(xiàng)卡給Output選擇一個(gè)名為Object的文件夾,

19、當(dāng)然文件為Listing的文件夾,當(dāng)然這個(gè)文件夾也可以是其他在C/C+選項(xiàng)卡下,需要輸入兩個(gè)非常重要的宏,和外設(shè)有關(guān)的函數(shù)才會(huì)包括進(jìn)來,還有一個(gè)宏是STM3的STM32。除了設(shè)定兩個(gè)宏之外,還要確定和工程有中沒有相關(guān)頭文件,而其他的文件中都有頭文件,所以圖9Listing選項(xiàng)卡夾也可以是其他任何名稱。給iListing選擇一個(gè)名的名一個(gè)稱。*MemoryMap*丸訕口庭宏是潮SE_STDPERIPH_DRIVER,定義了這個(gè)宏皿Info2F10X_MD,這個(gè)宏指定了CPU的容量,即中等容量usedSectionsInf關(guān)的頭文件的路徑。在工程目錄下面除了StartUPneerstrifoH需要

20、逐個(gè)指定。*SizeInfo寫到這里除了仿真的選項(xiàng)沒有設(shè)置之外,其他的參數(shù)都設(shè)定好了,此時(shí)如果編譯連接工程的話,就應(yīng)該顯示沒有錯(cuò)誤和沒有警告宀然也會(huì)遇到有錯(cuò)誤和有警告的情況,根據(jù)錯(cuò)誤提示耐心地尋找錯(cuò)誤,總可Default:以把問題迎刃而解。在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- -第四步使用JLINK仿真調(diào)試在說JLINK仿真調(diào)試之前,我先說說我在main.c中寫了點(diǎn)什么,為什么這樣寫,還有一個(gè)比較要命的問題的是如何初始化系統(tǒng)時(shí)鐘。先說說我在main函數(shù)中寫點(diǎn)什么,其實(shí)就是利用一個(gè)軟件延時(shí)函數(shù)點(diǎn)亮然后熄滅一盞LED。第一步需要初始化該IO口的時(shí)鐘,第二步把該IO口配置成推挽

21、輸出形式,第三步就是進(jìn)入無限循環(huán),不斷置位和復(fù)位該IO口。具體的代碼如下intmain(void)/*!CFGR|=(uint32_t)RCC_CFGR_HPRE_DIV1;/*PCLK2=HCLK*/RCC-CFGR|=(uint32_t)RCC_CFGR_PPRE2_DIV1;/*PCLK1=HCLK*/RCC-CFGR|=(uint32_t)RCC_CFGR_PPRE1_DIV2;在這里我想請大家注意一個(gè)細(xì)節(jié),我個(gè)人覺得可能是ST開發(fā)人員的一個(gè)筆誤,代碼的原意是把HCLK時(shí)鐘2分頻過后提供給APB1時(shí)鐘,但是注釋的地方卻寫成了APB1的時(shí)鐘和AHB的時(shí)鐘頻率相同。這里請大家指正,這個(gè)總線

22、的時(shí)鐘頻率到底是多少!從上面的分析可以看出,SystemInit并不需要用戶調(diào)用,啟動(dòng)代碼會(huì)自動(dòng)執(zhí)行,這樣相當(dāng)于少了一個(gè)RCC_Configuration函數(shù)的絕大多數(shù)內(nèi)容。請大家注意是絕大多數(shù)內(nèi)容而不是全部,但是請大家格外注意使用到的外設(shè)還是要第一時(shí)間使得該外設(shè)的時(shí)鐘,像這樣的一句千萬不要忘了。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);讓我們再回到Option選項(xiàng)卡。在選項(xiàng)卡中選擇Debug選型卡,選擇CortexM3J-LINK。一般在Runtomain()上打鉤,我個(gè)人除非特殊情況,一般不查看啟動(dòng)代碼。如果第一次嘗試V3.4庫

23、,倒可以驗(yàn)證一下SystemInit函數(shù)是不是自動(dòng)運(yùn)行了。Settingstex接著點(diǎn)擊UtitSettingsUse:Cortex-M3J-LINKEdit.C:rLi:elIlefaulRestoreDebugSessionSettingsElreakpointsToolbox*WatchpointsVh4已moryDisplayUseSimulatorLimitSp已已dtoal-TimeDialogDLL:Fdrameter,后在點(diǎn)擊議斗$帳按鈕。RestoreDebugSessionSettingsBreakpointsToolboxwWatchpoints&PAWMemoryDis

24、play圖11Debug選項(xiàng)卡ities選項(xiàng)卡l扌DriverDLL:Parameter:ISARMCM3.DLL*LoadApplicationatStartup*FluntomainOInitializationFile:wLoadApplicationatStartup7Buntomain(InitializationFile:CPUDLL:Parameter:ISARMCM3.DLLIDeviceT:=ltgetOutputLietingUserC/C+AsmLinkerDebugUtilities|OptionsForTargetLEDToggle1在KeilMDK環(huán)境下使用STM3

25、2V3.4庫“小”教程- -UseTargetDriverforFlashProgrammingOptionsForTargetLEDToggleDeviceT:=q-getOutputLietirLgUserC/C+AsmLirikerDebug1UtilitiesI-ConfigureFlashMenuCommand在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- #-在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- #-圖12Utilities選項(xiàng)卡在點(diǎn)擊Setting按鈕出現(xiàn)的界面中,選擇FlashDownload選項(xiàng)卡,點(diǎn)擊Add按鈕,在眾多的CPU型號(hào)中選擇中等

26、容量的STM32,即STM32F10XMed-densityFlash。jLink/jTrace匸ortex-MTargetDriverSetupIlebugTraceFlashDownloadIrDownloadFunctionEraseFull匚hipEraseSectorsDonotEraseRAMforAlgorithmLOADProgramVerifyResetandFlunStart:0 x20000000Size:0 x0800在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- #-在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- #-FjogrammingAl

27、gorithmDescriptionDeviceTypeSTM32F10 xMed-densityFlash0n-chipFlashDeviceSize128kAddressFlange08000000H-0801FFFFHStart:0 x03000000Size:0 x00020000Remove在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- #-下載模式只需要2個(gè)于sw仿真接口和jtAg仿真接口的詳細(xì)資料,請大家查看相關(guān)的文檔了。圖13選擇CPU的容量緊接著點(diǎn)擊Debug選項(xiàng)卡,當(dāng)目標(biāo)板和JLINK連接正確的話就圖12的界面。在這里我強(qiáng)調(diào),只有JLINK和目標(biāo)板連接正確,并且

28、目標(biāo)板上電時(shí),才會(huì)出現(xiàn)這樣的界面。我個(gè)人一般選擇SW下載模式,SWIO口,加上VDD和GND只需要4個(gè)IO口。這樣可以節(jié)約IO口和PCB板的空間。關(guān)在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- #-OKC:=LTLi:elHelp在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- -jLink/jTrace匸ortex-MTargetDriverSetup在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- #-在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- #-pJLINKUSB-JTAG/SWAdapterSerialN:805306163(Devi

29、ce:J-LinkARMHW:VS.00dll:V4.09pFW:Oct23200917:33:00Port:MaxClock:SW2MHzAutodkjIlebugTraceFlashIlowriloadDebugConnect&ResetOptionsConnect:Normal7ResetafterConnectSwDeviceCach已0ptionsReset:.AutodetectCacheCodeCacheMemoryDownloadOptionsrVerifyCodeDownloadDownloadtoFlash在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- #-在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- #-MiscInterface在KeilMDK環(huán)境下使用STM32V3.4庫“小”教程- -以放心大膽的開

溫馨提示

  • 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)論