第7章 CMSIS架構(gòu)與STM32庫開發(fā)方式6H_第1頁
第7章 CMSIS架構(gòu)與STM32庫開發(fā)方式6H_第2頁
第7章 CMSIS架構(gòu)與STM32庫開發(fā)方式6H_第3頁
第7章 CMSIS架構(gòu)與STM32庫開發(fā)方式6H_第4頁
第7章 CMSIS架構(gòu)與STM32庫開發(fā)方式6H_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

EmbeddedSystemDevelopment聊城大學(xué)理工學(xué)院曹銀杰caoyinjie@

嵌入式系統(tǒng)與應(yīng)用

第7章CMSIS架構(gòu)與STM32庫開發(fā)方式7.1STM32庫簡介7.2STM32結(jié)構(gòu)及庫層次關(guān)系7.3庫文件及使用簡介7.4GPIO7.5stm32f10x.h中GPIO代碼剖析7.6GPIO控制LED燈實(shí)驗(yàn)7.7時(shí)鐘設(shè)置與開啟外設(shè)時(shí)鐘7.1STM32庫簡介STM32外設(shè)資源豐富,寄存器的數(shù)量多、設(shè)置復(fù)雜度高,直接配置寄存器方式開發(fā)程序效率低。STM32庫是由ST公司針對(duì)STM32提供的函數(shù)接口,即API(ApplicationProgramInterface),庫是架設(shè)在寄存器與用戶驅(qū)動(dòng)層之間的代碼,向下處理與寄存器直接相關(guān)的配置,向上為用戶提供配置寄存器的接口。STM32庫簡介開發(fā)者可調(diào)用這些函數(shù)接口來配置STM32的寄存器,開發(fā)快速,易于閱讀,維護(hù)成本低等優(yōu)點(diǎn)。事實(shí)上,庫函數(shù)的底層實(shí)現(xiàn)恰恰是直接配置寄存器方式的最佳例子,想深入了解芯片是如何工作的話,只要追蹤到庫的最底層實(shí)現(xiàn)就能理解。想修煉C語言,就從ST的庫開始。7.2STM32結(jié)構(gòu)及庫層次關(guān)系解決不同的芯片廠商生產(chǎn)的Cortex微控制器軟件的兼容性問題,ARM與芯片廠商建立了一個(gè)軟件抽象層。CMSIS標(biāo)準(zhǔn):CortexMicroControllerSoftwareInterfaceStandard。CMSIS架構(gòu)STM32結(jié)構(gòu)及庫層次關(guān)系CMSIS標(biāo)準(zhǔn)中最主要的為CMSIS核心層,它包括了:

內(nèi)核函數(shù)層:其中包含用于訪問內(nèi)核寄存器的名稱、地址定義,主要由ARM公司提供。

設(shè)備外設(shè)訪問層:提供了片上的核外外設(shè)的地址和中斷定義,主要由芯片生產(chǎn)商提供可見CMSIS層位于硬件層與操作系統(tǒng)或用戶層之間,提供了與芯片生產(chǎn)商無關(guān)的硬件抽象層,可以為接口外設(shè)、實(shí)時(shí)操作系統(tǒng)提供簡單的處理器軟件接口,屏蔽了硬件差異,這對(duì)軟件的移植是有極大的好處的。STM32的庫,就是按照CMSIS標(biāo)準(zhǔn)建立的。7.3庫文件及使用簡介新建工程---選擇芯片后—選擇運(yùn)行環(huán)境、用的庫、驅(qū)動(dòng)文件、RTX等—編譯時(shí)自動(dòng)添加其他用的庫文件庫文件及使用簡介ARM公司提供的:如

core_cm3.h、及core_前綴的頭文件,核內(nèi)設(shè)備函數(shù)層,進(jìn)入M3內(nèi)核的接口。

stdin.h頭文件,這是一個(gè)ANSIC文件,是獨(dú)立于處理器之外的,就像我們熟知的C語言頭文件stdio.h文件一樣。misc.h和misc.c是和CM3內(nèi)核有關(guān)的NVIC和SysTick的驅(qū)動(dòng)代碼。自行添加到工程。ST公司提供的:stm32f10x.h重要文件,定義寄存器地址、寄存器數(shù)據(jù)結(jié)構(gòu)、中斷向量表。stm32f10x_adc.c、stm32f10x_adc.h,針對(duì)模數(shù)轉(zhuǎn)換(ADC)外設(shè),還有很多其他設(shè)備外設(shè)的驅(qū)動(dòng)程序。每個(gè)外設(shè)對(duì)應(yīng)一個(gè).c和.h后綴的文件。庫文件及使用簡介startup_stm32f10x_xx.s

啟動(dòng)文件,作用是:1.初始化堆棧指針SP;2.初始化程序計(jì)數(shù)器指針PC;3.設(shè)置堆、棧的大小;4.設(shè)置異常向量表的入口地址;5.配置外部SRAM作為數(shù)據(jù)存儲(chǔ)器(這個(gè)由用戶配置,一般的開發(fā)板可沒有外部SRAM);6.設(shè)置C庫的分支入口__main(最終調(diào)用main函數(shù));7.啟動(dòng)文件還調(diào)用了在system_stm32f10x.c文件中的SystemIni()函數(shù)配置系統(tǒng)時(shí)鐘。system_stm32f10x.c文件提供了兩個(gè)函數(shù)和一個(gè)全局變量庫文件及使用簡介stm32f10x.h頭文件中重要的內(nèi)容就是把STM32的所有寄存器進(jìn)行地址映射。如同51單片機(jī)的<reg52.h>頭文件一樣,stm32f10x.h像一個(gè)大表格,我們在使用的時(shí)候就是通過宏定義進(jìn)行類似查表的操作。沒有這個(gè)文件的話,怎樣訪問STM32的寄存器,有什么缺點(diǎn)?1、需要查手冊來確定哪個(gè)地址對(duì)應(yīng)哪個(gè)寄存器。2、地址易寫錯(cuò)、可讀性差、易出錯(cuò)、開發(fā)效率低。庫文件及使用簡介庫函數(shù),就是STM32的庫文件中為我們編寫好的函數(shù)接口,調(diào)用這些庫函數(shù),就可以對(duì)STM32進(jìn)行配置。我們可以不知道庫函數(shù)是如何實(shí)現(xiàn)的,但必須要知道函數(shù)的功能、可傳入的參數(shù)及其意義、和函數(shù)的返回值。庫函數(shù)很多,學(xué)會(huì)查閱庫幫助文檔就行!庫幫助文檔:stm32f10x_stdperiph_lib_um.chm層層打開文檔的目錄標(biāo)簽即可。在用庫函數(shù)的地方,直接從庫幫助文檔復(fù)制即可。思考題:1、沒有stm32f10x.h頭文件的話,怎樣訪問STM32的寄存器,有什么缺點(diǎn)?2、從STM32庫的實(shí)現(xiàn)原理上解答庫到底是什么?為什么要用庫?用庫函數(shù)與直接配置寄存器的區(qū)別等問題。7.4GPIOGPIO(GeneralPurposeI/O)通用型輸入/輸出,主要用于需要用到數(shù)字量輸入/輸出的場合。如:繼電器、LED、蜂鳴器等的控制;傳感器狀態(tài)、高低電平等信息的輸入等。1、GPIO簡介大部分GPIO為推挽輸出,具有完整I2C功能的是開漏結(jié)構(gòu);正常拉出灌入電流為4mA,短時(shí)間極限值40mA;管腳可承受最大5V的輸入電壓。GPIO寄存器位于AHB總線上,可以進(jìn)行高性能的CPU快速訪問,支持Cortex-M3位帶操作。GPIO允許進(jìn)行DMA數(shù)據(jù)操作。GPIO簡介GPIO引腳又被分為GPIOA、GPIOB…GPIOG不同的組,每組端口分為0~15,共16個(gè)不同的引腳,不同芯片的端口組數(shù)不同。GPIO結(jié)構(gòu)圖:端口配置寄存器GPIO簡介I/O引腳可通過端口配置寄存器設(shè)置成不同的功能。四種輸入模式(結(jié)構(gòu)圖上半部分):上拉輸入與下拉輸入:與VDD相連的為上拉電阻,與VSS相連的為下拉電阻。再經(jīng)施密特觸發(fā)器就把信號(hào)轉(zhuǎn)化為0、1存儲(chǔ)在輸入數(shù)據(jù)寄存器。浮空輸入:不接上拉與下拉電阻,直接由觸發(fā)器輸入,由于其輸入阻抗較大,一般把這種模式用于標(biāo)準(zhǔn)的通訊協(xié)議如I2C、USART的接收端。模擬輸入:把電壓信號(hào)直接傳送到片上外設(shè)模塊,如ADC。GPIO簡介結(jié)構(gòu)圖下半部分為輸出模式結(jié)構(gòu):推挽輸出模式:在輸出高電平時(shí),P-MOS導(dǎo)通,低電平時(shí),N-MOS管導(dǎo)通。開漏輸出模式:輸出0時(shí)為低電平,1為高阻狀態(tài)。在使用任何一種開漏模式,都需要接上拉電阻。GPIO簡介

STM32P0.xP2.xGPIO都可配置為中斷功能,并可設(shè)置為上升沿、下降沿或邊沿觸發(fā)。上升沿中斷下降沿中斷

邊沿中斷

GPIO中斷還具有掉電喚醒功能2、GPIO端口配置寄存器端口配置低寄存器GPIOx_CRL(配置0~7引腳),端口配置高寄存器GPIOx_CRH(配置8~15引腳)

(x=A…G)??蓪/O口配置為輸入、輸出或模擬模式;PIOx_CRL復(fù)位值:44444444h,偏移地址:00h。每個(gè)引腳的模式由寄存器的4個(gè)位控制,又分引腳配置(CNFy[1:0]),引腳的模式(MODEy[1:0]),其中y表示第y個(gè)引腳。GPIOx_CRLGPIO端口配置寄存器例:CRH高寄存器的配置PIOx_CRH復(fù)位值:44444444h,偏移地址:04h。例:GPIOx_CRH寄存器的第28至29位設(shè)置為11,并在第30至31位設(shè)置為00答:則把x端口第15個(gè)引腳的模式配置成了:輸出的最大速度為50MHz的通用推挽輸出模式。3、端口輸入數(shù)據(jù)寄存器GPIOx_IDR端口輸入數(shù)據(jù)寄存器(GPIOx_IDR)(x=A..E)復(fù)位值:44444444h,地址偏移:08h高位31:16保留,始終讀為0。IDRx[15:0]:端口輸入數(shù)據(jù)(x=0…15)這些位為只讀并只能以字的形式讀出。讀出的值為對(duì)應(yīng)I/O口的狀態(tài)。4、端口輸出數(shù)據(jù)寄存器GPIOx_ODR端口輸出數(shù)據(jù)寄存器(GPIOx_ODR)(x=A..E)設(shè)置I/O口的方向輸入還是輸出。復(fù)位值:44444444h,地址偏移:0Ch高位31:16保留,始終為0。ODRx[15:0]:端口輸出數(shù)據(jù)方向(x=0…15)這些位可讀可寫并只能以字的形式操作。通過GPIOx_BSRR(x=A…E),可以分別地對(duì)各個(gè)ODR位進(jìn)行獨(dú)立的置位/清零。5、端口置位/清零寄存器GPIOx_BSRR端口置位/清零寄存器(GPIOx_BSRR)(x=A..E)復(fù)位值:44444444h,地址偏移:10h6、端口位復(fù)位寄存器(GPIOx_BRR)端口位復(fù)位寄存器(GPIOx_BRR)(x=A..E)復(fù)位值:44444444h,地址偏移:14h7、端口配置鎖定寄存器GPIOx_LCKR端口配置鎖定寄存器(GPIOx_LCKR)(x=A..E)復(fù)位值:44444444h,地址偏移:14h當(dāng)執(zhí)行正確的寫序列設(shè)置了位16(LCKK)時(shí),該寄存器用來鎖定端口位的配置。位[15:0]用于鎖定GPIO端口的配置。在規(guī)定的寫入操作期間,不能改變LCKP[15:0]。當(dāng)對(duì)相應(yīng)的端口位執(zhí)行了LOCK序列后,在下次系統(tǒng)復(fù)位之前將不能再更改端口位的配置。每個(gè)鎖定位鎖定控制寄存器(CRL,CRH)中相應(yīng)的4個(gè)位。例:要控制引腳電平高低,需要對(duì)寄存器進(jìn)行什么操作?一個(gè)引腳y的輸出數(shù)據(jù)由GPIOx_BSRR寄存器位的2個(gè)位來控制分別為BRy(BitResety)和BSy(BitSety),BRy位用于寫1清零,使引腳輸出低電平;BSy位用來寫1置1,使引腳輸出高電平。8、GPIO輸入輸出演示GPIOx_IDR10BRy寫1Bsy寫1INOUT10GPIOx_ODRGPIOx_PUPDRvccGPIOGPIOx_CRL

設(shè)置引腳為GPIO功能

1

配置引腳模式

2

設(shè)置GPIO的方向

3

設(shè)置GPIO輸出電平4

GPIO輸入GPIO輸出1高電平1輸出操作流程輸入操作流程1

讀取GPIO引腳電平

4

GPIOx_BSRR7.5stm32f10x.h庫中GPIO代碼剖析以外設(shè)GPIOC為例,文件中包含如下宏定義:#defineGPIOC_BASE(APB2PERIPH_BASE+0x1000)#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)#definePERIPH_BASE((uint32_t)0x40000000)首先看外設(shè)基地址PERIPH_BASE這個(gè)宏,宏展開為0x40000000,并把它強(qiáng)制轉(zhuǎn)換為uint32_t類型數(shù)據(jù);總線基地址宏APB2PERIPH_BASE指向地址0x40010000;最后到了宏GPIOC_BASE為APB2PERIPH_BASE加上偏移量0x1000得到了GPIOC端口的寄存器組的基地址。stm32f10x.h中GPIO代碼剖析stm32f10x.h文件,還可以發(fā)現(xiàn)以下類似的宏:#defineGPIOA_BASE(APB2PERIPH_BASE+0x0800)#defineGPIOB_BASE(APB2PERIPH_BASE+0x0C00)#defineGPIOC_BASE(APB2PERIPH_BASE+0x1000)#defineGPIOD_BASE(APB2PERIPH_BASE+0x1400)GPIOA、GPIOB、GPIOC、GPIOD寄存器組的起始地址,都對(duì)應(yīng)著獨(dú)立的一組寄存器。typedefstruct{__IOuint32_tCRL;__IOuint32_tCRH;__IOuint32_tIDR;__IOuint32_tODR;__IOuint32_tBSRR;__IOuint32_tBRR;__IOuint32_tLCKR;}GPIO_TypeDef;#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)#defineGPIOB((GPIO_TypeDef*)GPIOB_BASE)……(GPIO_TypeDef*)把GPIOA_BASE地址轉(zhuǎn)換為GPIO_TypeDef結(jié)構(gòu)體指針類型。對(duì)每個(gè)GPIOx是用結(jié)構(gòu)封裝了寄存器組,stm32f10x.h中代碼:GPIO_TypeDef,這個(gè)結(jié)構(gòu)體的首地址(變量CRL的地址)若為0x40011000,那么結(jié)構(gòu)體中第二個(gè)變量(CRH)地址為0x40011000+0x04,加上的這個(gè)0x04,正是4字節(jié)地址偏移量。stm32f10x.h中GPIO代碼剖析有了這樣的宏,就可用以下方式來修改GPIO寄存器:GPIO_TypeDef*GPIOx;//定義一個(gè)GPIO_TypeDef型結(jié)構(gòu)體指針GPIOxGPIOx=GPIOA;

//把指針地址設(shè)置為宏GPIOA地址GPIOx->CRL=0xffffffff;

//通過指針訪問并修改GPIOA_CRL寄存器通過類似的方式,我們就可以給具體的寄存器寫上適當(dāng)?shù)膮?shù),控制STM32了。這只是庫開發(fā)的皮毛,庫提供了更簡單的開發(fā)方式。GPIO1.配置寄存器:選定GPIO的特定功能,最基本的如:選擇作為輸入還是輸出端口。2.數(shù)據(jù)寄存器:保存了GPIO的輸入電平或?qū)⒁敵龅碾娖健?.位控制寄存器:設(shè)置某引腳的數(shù)據(jù)為1或0,控制輸出的電平。4.鎖定寄存器:設(shè)置某鎖定引腳后,就不能修改其配置。C語言程序舉例:TESTc.C#defineuint32 unsignedint#defineN 10uint32sum;//使用加法運(yùn)算來計(jì)算1+2+3+...+(N-1)+N的值。(N>0)intmain(void){uint32i;sum=0;for(i=0;i<=N;i++){ sum+=i;}}GPIO庫函數(shù)7.6LED流水燈實(shí)驗(yàn)想要控制LED燈,當(dāng)然是通過控制STM32芯片的I/O引腳電平的高低來實(shí)現(xiàn)。LED流水燈實(shí)驗(yàn)LED流水燈實(shí)驗(yàn)1.GPIO端口引腳多-->就要選定需要控制的特定引腳2.GPIO功能如此豐富-->配置需要的特定功能3.控制LED的亮和滅-->設(shè)置GPIO輸出電壓的高低與GPIO相關(guān)的寄存器了,可以通過《STM32參考手冊》來查看LED流水燈實(shí)驗(yàn)LED實(shí)驗(yàn)中用到了RCC跟GPIO這兩個(gè)外設(shè)。環(huán)境配置如圖:main.cled.cled.hLed流水燈主程序:main.c#include"led.h"voidDelay(__IOuint32_tnCount)//簡單延時(shí)函數(shù){ for(;nCount!=0;nCount--);}intmain(void){LED_GPIO_Config(); while(1) {LED1(ON); Delay(0x0FFFFF); LED1(OFF); LED2(ON); Delay(0x0FFFFF); LED2(OFF); LED3(ON); Delay(0x0FFFFF); LED3(OFF); } }初始化LED函數(shù)led.c#include"led.h"#include"stm32f10x_gpio.h"#include"stm32f10x_rcc.h"voidLED_GPIO_Config(void){/*利用庫定義一個(gè)GPIO_InitTypeDef類型的結(jié)構(gòu)體*/GPIO_InitTypeDefGPIO_InitStructure;/*開啟GPIOC的外設(shè)時(shí)鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);/*選擇要控制的GPIOC引腳GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; /*設(shè)置引腳模式為通用推挽輸出*/GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;初始化LED函數(shù)led.c/*設(shè)置引腳速率為50MHz*/GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/*調(diào)用庫函數(shù),初始化GPIOC*/GPIO_Init(GPIOC,&GPIO_InitStructure);//關(guān)閉led燈GPIO_SetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);}個(gè)函數(shù)LED_GPIO_Config()實(shí)現(xiàn)了所有為點(diǎn)亮led的配置led.h#ifndef__LED_H#define__LED_H#include"stm32f10x.h"/**themacrodefinitiontotriggertheledonoroff*1-off*0-on*/#defineON0#defineOFF1/*帶參宏,可像內(nèi)聯(lián)函數(shù)一樣使用*/#defineLED1(a) if(a)\ GPIO_SetBits(GPIOC,GPIO_Pin_3);\ else \ GPIO_ResetBits(GPIOC,GPIO_Pin_3)led.h續(xù)#defineLED2(a) if(a)\ GPIO_SetBits(GPIOC,GPIO_Pin_4);\ else \ GPIO_ResetBits(GPIOC,GPIO_Pin_4)#defineLED3(a) if(a)\ GPIO_SetBits(GPIOC,GPIO_Pin_5);\ else \ GPIO_ResetBits(GPIOC,GPIO_Pin_5)voidLED_GPIO_Config(void);#endif/*__LED_H*/在編譯過程,編譯器會(huì)把帶參宏展開,在相應(yīng)的位置替換為宏展開代碼。其中的反斜杠符號(hào)“\”叫做續(xù)行符,后面不能有空格、注釋等led用到stm32f10x_gpio.h庫的結(jié)構(gòu)、宏定義1、GPIO_InitTypeDef結(jié)構(gòu),引腳初始化的結(jié)構(gòu)2、GPIO_Pin_x引腳為uint16_t類型,宏定義:1.#defineGPIO_Pin_0((uint16_t)0x0001)/*!<Pin0selected*/2.#defineGPIO_Pin_1((uint16_t)0x0002)/*!<Pin1selected*/3.#defineGPIO_Pin_2((uint16_t)0x0004)/*!<Pin2selected*/4.#defineGPIO_Pin_3((uint16_t)0x0008)/*!<Pin3selected*/例:GPIO_Pin_0(0000000000000001)BGPIO_Pin_1(0000000000000010)B

led用到stm32f10x_gpio.h庫的結(jié)構(gòu)、宏定義3、GPIOSpeed_TypeDef定義GPIO的輸出速率:typedefenum{GPIO_Speed_10MHz=1,//枚舉常量值1,對(duì)應(yīng)10MHzGPIO_Speed_2MHz,//常量值為2,對(duì)應(yīng)2MHzGPIO_Speed_50MHz//常量值為3,對(duì)應(yīng)50MHz}GPIOSpeed_TypeDef;GPIO_Speed_10MHz對(duì)應(yīng)(0001)BGPIO_Speed_2MHz對(duì)應(yīng)(0010)BGPIO_Speed_50MHz對(duì)應(yīng)(0011)BSpeed控制參數(shù),它的宏展開低2位的值,正好符合寄存器MODEy中2位的控制值。直接把這個(gè)參數(shù)寫入CRL、CRH配置寄存器的MODEy位,其中y由GPIO_Pin參數(shù)確定第幾引腳。

led用到stm32f10x_gpio.h庫的結(jié)構(gòu)、宏定義4、GPIOMode_TypeDef結(jié)構(gòu)定義GPIO引腳的功能: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,//復(fù)用功能開漏輸出GPIO_Mode_AF_PP=0x18//復(fù)用功能推挽輸出}GPIOMode_TypeDef;用于初始化的庫函數(shù)GPIO_Init()通過查找?guī)鞄椭臋n獲得Error:L6218E:Error:L6218E:Undefinedsymbolassert_param(referredfromstm32f10x_gpio.o).斷言機(jī)制函數(shù)assert_param,STM32的函數(shù):assert_param(IS_GPIO_ALL_PERIPH(GPIOx));剛開始學(xué)習(xí)的時(shí)候都遇到編譯不過去的問題,通過在文件中添加USE_STDPERIPH_DRIVER來解決的:error65:創(chuàng)建一個(gè)STM32F103VE核的項(xiàng)目error65:accessviolationat0x40021000:no'read'permission是Debug里面的設(shè)置有缺陷,不會(huì)自動(dòng)匹配:DialogDLL:DCM3.DLLParameter:-pCM3應(yīng)手動(dòng)改為:DialogDLL:DARMSTM.DLLParameter:-pSTM32F103VE邏輯分析窗口使用再點(diǎn)擊Setup,輸入LED燈對(duì)應(yīng)的三個(gè)信號(hào)PORTB.0、PORTF.7、PORTF.8;DisplayType選擇bit,然后單擊Close關(guān)閉該對(duì)話框;邏輯分析窗口使用點(diǎn)擊運(yùn)行按鈕。運(yùn)行一段時(shí)間之后,點(diǎn)擊停止按鈕,暫停仿真回到邏輯分析窗口,可通過Zoom里面的In按鈕來放大波形,通過Out按鈕來縮小波形,或者按All顯示全部波形。7.7時(shí)鐘設(shè)置與開啟外設(shè)時(shí)鐘外設(shè)初始化后,必須要開啟外設(shè)時(shí)鐘。開啟外設(shè)時(shí)鐘之前,首先要配置好系統(tǒng)時(shí)鐘SYSCLK。在startup_stm32f10x_hd.s啟動(dòng)文件中,調(diào)用main函數(shù)之前就先調(diào)用了SystemInit()函數(shù),就是設(shè)置系統(tǒng)時(shí)鐘SYSCLK:時(shí)鐘來源、倍頻、分頻等控制參數(shù)。這個(gè)函數(shù)的定義在system_stm32f10x.c文件之中。時(shí)鐘設(shè)置與開啟外設(shè)時(shí)鐘voidSystemInit(void)函數(shù)的執(zhí)行流程是先將與配置時(shí)鐘相關(guān)的寄存器都復(fù)位為默認(rèn)值,復(fù)位寄存器后,調(diào)用了另外一個(gè)函數(shù)SetSysClock(),其代碼:在system_stm32f10x.c文件的開頭,有條件編譯定義。選擇相應(yīng)的時(shí)鐘。時(shí)鐘設(shè)置與開啟外設(shè)時(shí)鐘GPIO所用的時(shí)鐘PCLK2我們采用默認(rèn)值,也為72MHz。開啟和關(guān)閉外設(shè)時(shí)鐘也有封裝好的庫函數(shù)RCC_APB2PeriphClockCmd()。在led.c文件中調(diào)用了這個(gè)函數(shù)。

/*開啟GPIOC外設(shè)時(shí)鐘,參數(shù)DISABLE為關(guān)閉*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);如用到I/O引腳復(fù)用功能,還要開

溫馨提示

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