嵌入式系統(tǒng)原理與應(yīng)用 課件 第6章 基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)1_第1頁
嵌入式系統(tǒng)原理與應(yīng)用 課件 第6章 基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)1_第2頁
嵌入式系統(tǒng)原理與應(yīng)用 課件 第6章 基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)1_第3頁
嵌入式系統(tǒng)原理與應(yīng)用 課件 第6章 基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)1_第4頁
嵌入式系統(tǒng)原理與應(yīng)用 課件 第6章 基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)1_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式系統(tǒng)設(shè)計西安郵電大學(xué)計算機學(xué)院王忠民2025/11/28本章學(xué)習(xí)目的熟悉并掌握與STM32微控制器開發(fā)相關(guān)的特有C語言基礎(chǔ)知識,這是讀者進行基于寄存器或固件庫開發(fā)的基礎(chǔ)了解基于意法半導(dǎo)體公司的STM32微控制器開發(fā)的四種模式:寄存器開發(fā)模式、標(biāo)準(zhǔn)庫開發(fā)模式、基于STM32Cube平臺的HAL庫和LL庫開發(fā)模式各自的特點,重點理解寄存器開發(fā)和庫函數(shù)開發(fā)實現(xiàn)的機理,了解STM32Cube平臺的特點。理解ARMCortex微控制器軟件接口標(biāo)準(zhǔn)CMSIS(CortexMicrocontrollerSoftwareInterfaceStandard)提出的目的和基本組成,掌握寄存器開發(fā)的基本原理和開發(fā)步驟理解基于標(biāo)準(zhǔn)外設(shè)庫開發(fā)的基本原理,熟練掌握標(biāo)準(zhǔn)外設(shè)庫工程的構(gòu)建方法。第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---學(xué)習(xí)目的2025/11/28第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)(1) 6.1微控制器開發(fā)語言基礎(chǔ) 6.2STM32F103嵌入式系統(tǒng)開發(fā)模式 6.2.1寄存器開發(fā)模式 6.2.2標(biāo)準(zhǔn)外設(shè)庫開發(fā)模式 6.2.3基于STM32Cube平臺的HAL庫和LL庫開發(fā)模式 6.2.3HAL庫開發(fā)模式 6.2.4LL庫開發(fā)模式第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)(2)6.2ARMCortex微控制器軟件接口標(biāo)準(zhǔn)CMSIS 6.2.1CMSIS軟件接口標(biāo)準(zhǔn) 6.2.2STM32F1xx微控制器的軟件包CMSIS下載與安裝 6.3基于寄存器的工程構(gòu)建 6.4基于標(biāo)準(zhǔn)外設(shè)庫的工程構(gòu)建 6.5Proteus嵌入式系統(tǒng)仿真與調(diào)試

2025/11/28第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---學(xué)習(xí)內(nèi)容目錄第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)(1) 6.1微控制器開發(fā)語言基礎(chǔ) 6.2STM32F103嵌入式系統(tǒng)開發(fā)模式 6.2.1寄存器開發(fā)模式 6.2.2標(biāo)準(zhǔn)外設(shè)庫開發(fā)模式 6.2.3基于STM32Cube平臺的HAL庫和LL庫開發(fā)模式

(1)HAL庫開發(fā)模式

(2)LL庫開發(fā)模式第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---目錄2025/11/28在STM32F103開發(fā)中,意法半導(dǎo)體(STMicroelectronics)提供了一系列的庫和工具來簡化開發(fā)過程。STM32的標(biāo)準(zhǔn)外設(shè)庫(StandardPeripheralLibraries,通常稱為STM32F1xxStdPeriph_Driver)以及后來的HAL(硬件抽象層)庫為開發(fā)者提供了一組函數(shù)、數(shù)據(jù)類型(結(jié)構(gòu)體、枚舉等)和宏定義,這些都可以被視為“針對微控制器的C變量等”。以下是一些STM32F103開發(fā)中常用的內(nèi)容:數(shù)據(jù)類型定義:STM32庫通常重定義了一些數(shù)據(jù)類型。如將C99標(biāo)準(zhǔn)中的stdint.h頭文件中的uint8_t、uint16_t、uint32_t等進行了重定義。/*在stm32f10x.h或類似文件中*/

typedef unsignedchar uint8_t;typedef unsignedshort uint16_t;結(jié)構(gòu)體(Structs):STM32庫使用結(jié)構(gòu)體來封裝外設(shè)的配置參數(shù)和狀態(tài)信息。例如,GPIO_InitTypeDef結(jié)構(gòu)體用于配置GPIO端口的模式、輸出類型、速度和上拉/下拉設(shè)置。同樣地,USART_InitTypeDef結(jié)構(gòu)體用于配置USART的參數(shù),如波特率、數(shù)據(jù)位、停止位和校驗位等。宏定義(Macros):STM32庫包含大量的宏定義,用于訪問外設(shè)的寄存器地址、設(shè)置位掩碼等。這些宏定義通常定義在相應(yīng)的頭文件中,如stm32f10x.h、stm32f10x_gpio.h等。函數(shù)(Functions):STM32庫提供了豐富的函數(shù),用于初始化外設(shè)、讀取/寫入寄存器、控制GPIO端口、進行串行通信等。這些函數(shù)通常封裝在相應(yīng)的源文件中,如stm32f10x_gpio.c、stm32f10x_usart.c等。第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---微控制器開發(fā)語言基礎(chǔ)2025/11/28在STM32F1xx系列微控制器使用C語言進行開發(fā)時,需要特別掌握和了解一些與嵌入式系統(tǒng)開發(fā)相關(guān)的C語言知識,以便更有效地與硬件進行交互。本節(jié)給出后續(xù)在基于STM32F1系列微控制器的寄存器開發(fā)、標(biāo)準(zhǔn)外設(shè)庫開發(fā)過程中涉及到的一些關(guān)鍵的C語言特性和用法,以方便大家更容易讀懂理解給出的例子代碼。更詳細的有關(guān)C語言的知識,請查閱相關(guān)資料。第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---微控制器開發(fā)語言基礎(chǔ)1.基礎(chǔ)數(shù)據(jù)類型int:通常用于表示整數(shù),但具體的位數(shù)和范圍可能因編譯器和平臺而異。unsignedint:無符號整數(shù),與int具有相同的位數(shù),但只能表示非負(fù)值。char:字符類型,通常用于存儲ASCII字符。在某些情況下,它也可以被用作較小的整數(shù)類型(如signedchar或unsignedchar)。float和double:用于表示浮點數(shù)。2025/11/28第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---微控制器開發(fā)語言基礎(chǔ)2.固定寬度數(shù)據(jù)類型(來自stdint.h)int8_t、uint8_t:8位有符號和無符號整數(shù)。int16_t、uint16_t:16位有符號和無符號整數(shù)。int32_t、uint32_t:32位有符號和無符號整數(shù)。int64_t、uint64_t:64位有符號和無符號整數(shù)。這些類型確保了在不同平臺和編譯器上的寬度一致性。2025/11/283.指針數(shù)據(jù)類型在STM32F1xx微控制器編程中,指針類型與通用的C或C++編程語言中的指針類型相同。這是因為STM32F1xx微控制器通常使用C或C++作為編程語言。下面是一些常見的指針類型及其在STM32F1xx編程中的使用示例:第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---微控制器開發(fā)語言基礎(chǔ)(1)基本數(shù)據(jù)類型指針int*:指向整數(shù)的指針intvalue=10;int*ptr=&value;//ptr指向value的地址uint32_t*(如果使用了stdint.h):指向32位無符號整數(shù)的指針,常用于表示地址或配置寄存器等uint32_t register_value;uint32_t*reg_ptr=(uint32_t*)0x40021018;//假設(shè)這是某個寄存器的地址*reg_ptr=0x12345678;//將值寫入寄存器2025/11/283.指針數(shù)據(jù)類型在STM32F1xx微控制器編程中,指針類型與通用的C或C++編程語言中的指針類型相同。這是因為STM32F1xx微控制器通常使用C或C++作為編程語言。下面是一些常見的指針類型及其在STM32F1xx編程中的使用示例:第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---微控制器開發(fā)語言基礎(chǔ)(2)結(jié)構(gòu)體指針

structMyStruct*:指向自定義結(jié)構(gòu)體類型的指針。在STM32F1xx編程中,結(jié)構(gòu)體經(jīng)常用于表示硬件配置、消息、數(shù)據(jù)記錄等。

typedefstruct{uint32_tfield1;uint16_tfield2;}MyStruct;MyStructmyInstance;MyStruct*ptr=&myInstance;2025/11/283.指針數(shù)據(jù)類型在STM32F1xx微控制器編程中,指針類型與通用的C或C++編程語言中的指針類型相同。這是因為STM32F1xx微控制器通常使用C或C++作為編程語言。下面是一些常見的指針類型及其在STM32F1xx編程中的使用示例:第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---微控制器開發(fā)語言基礎(chǔ)指向數(shù)據(jù)首元素的指針,可以通過遞增指針來遍歷數(shù)組。intarry[]={1,2,3,4,5};int*array_ptr=arry;intvalue=*(arry_ptr+2);//value的值為32025/11/284.宏定義宏定義在STM32的寄存器定義中廣泛使用,因為它們允許為復(fù)雜的寄存器地址或位定義簡單的名字。例如:

第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---微控制器開發(fā)語言基礎(chǔ)2025/11/284.宏定義宏定義在STM32的寄存器定義中廣泛使用,因為它們允許為復(fù)雜的寄存器地址或位定義簡單的名字。例如:

第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---微控制器開發(fā)語言基礎(chǔ)(1)#defineGPIOA_BASE (0x40010800UL)

定義了一個名為GPIOA_BASE的基地址。它通常是一個指向GPIO端口A所有寄存器起始位置的指針或地址值。0x40010800UL是一個32位的無符號長整型(UL代表unsignedlong),表示該基地址的十六進制值。(2)#defineGPIOA_ODR_OFFSET 0x14

定義了一個名為GPIOA_ODR_OFFSET的偏移量。它表示從GPIOA_BASE基地址開始,到ODR(OutputDataRegister,輸出數(shù)據(jù)寄存器)的字節(jié)偏移量。在這個例子中,偏移量是0x14(即20個字節(jié)),這是因為寄存器在內(nèi)存中通常是連續(xù)排列的,但每個寄存器都有其特定的偏移量。(3)#defineGPIOA_ODR (*(uint32_t*)(GPIOA_BASE+GPIOA_ODR_OFFSET))

這個宏定義是最復(fù)雜的。它定義了一個名為GPIOA_ODR的宏。其中“(GPIOA_BASE+GPIOA_ODR_OFFSET)”將基地址和偏移量相加,得到ODR寄存器的完整地址?!?uint32_t*)”將上一步得到的地址強制轉(zhuǎn)換為指向32位無符號整型(uint32_t)的指針,這是因為寄存器通常是一個固定寬度的內(nèi)存區(qū)域,而ODR寄存器在這里被假定為32位寬?!?”獲取該地址處的值。這樣就可以通過讀取或?qū)懭隚PIOA_ODR宏來直接操作ODR寄存器。

綜上所述,這三條宏定義提供了一種方便的方法來訪問和操作GPIO端口A的ODR寄存器,而無需每次都手動計算地址或進行類型轉(zhuǎn)換。在代碼中就可以像操作普通變量一樣使用GPIOA_ODR,而實際上是在直接操作硬件寄存器。GPIOA_ODR=0x00000001--------什么作用???2025/11/285.結(jié)構(gòu)體結(jié)構(gòu)體用于定義一個數(shù)據(jù)集合,這些數(shù)據(jù)可能是不同類型但相互關(guān)聯(lián)的。在STM32開發(fā)中,它們通常用于表示寄存器的位域。例如:第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---微控制器開發(fā)語言基礎(chǔ)

typedefstruct { uint32_tMODER:2;//端口模式位

uint32_tOTYPER:2;//端口輸出類型位

uint32_tOSPEEDR:2;//端口輸出速度位

uint32_tPUPDR:2;//端口上/下拉電阻位

uint32_tIDR:16;//端口輸入數(shù)據(jù)寄存器位(只讀)

uint32_tODR:16;//端口輸出數(shù)據(jù)寄存器位

//...其他位... }GPIO_TypeDef;

#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)

在這個例子中,GPIO_TypeDef結(jié)構(gòu)體定義了GPIO端口的寄存器布局,并使用宏GPIOA將GPIOA基地址強制轉(zhuǎn)換為該結(jié)構(gòu)體指針類型。2025/11/287.位操作:

在STM32開發(fā)中,經(jīng)常需要對寄存器的特定位進行位操作??梢酝ㄟ^使用按位與(&)、按位或(|)、按位異或(^)、按位取反(~)、左移(<<)和右移(>>)等位操作符來實現(xiàn)。第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---微控制器開發(fā)語言基礎(chǔ)8.內(nèi)存訪問控制:

了解volatile關(guān)鍵字在嵌入式編程中的重要性。volatile告訴編譯器不要對該變量的訪問進行優(yōu)化,因為它可能在程序不知道的情況下被外部因素(如硬件)修改。目錄第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)(1) 6.1微控制器開發(fā)語言基礎(chǔ) 6.2STM32F103嵌入式系統(tǒng)開發(fā)模式 6.2.1寄存器開發(fā)模式 6.2.2標(biāo)準(zhǔn)外設(shè)庫開發(fā)模式 6.2.3基于STM32Cube平臺的HAL庫和LL庫開發(fā)模式 6.2.3HAL庫開發(fā)模式 6.2.4LL庫開發(fā)模式第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---目錄2025/11/28實現(xiàn)D1燈閃爍的實質(zhì)是:1、D1燈與PA0引腳相連2、PA0引腳的狀態(tài)決定燈的亮滅,為1滅,0亮3、只需要將微控制器中GPIOA的相關(guān)寄存器(ODR)的第0位置1或清零第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---示例2025/11/28第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---STM32F1xx片內(nèi)IO編程的實現(xiàn)思路往地址0x4001080C-0x4001080F四個單元對應(yīng)的寄存器(GPIOA_ODR)送最低位為0或1的字使用不同的送法,就對應(yīng)不同的開發(fā)方式2025/11/28第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---STM32F103嵌入式系統(tǒng)開發(fā)模式STM32F103嵌入式系統(tǒng)開發(fā)模式 寄存器開發(fā)模式 標(biāo)準(zhǔn)外設(shè)庫開發(fā)模式 基于STM32Cube平臺的HAL庫和LL庫開發(fā)模式:

HAL庫開發(fā)模式 LL庫開發(fā)模式 2025/11/28寄存器開發(fā)模式寄存器開發(fā)模式的實質(zhì)就是直接對寄存器對應(yīng)的存儲器單元進行操作,而不需要借助芯片廠商提供的任何庫函數(shù)。根據(jù)獲取寄存器對應(yīng)存儲單元地址以及使用的開發(fā)語言的不同,又可分為以下4種情況:匯編訪問寄存器匯編訪問位帶別名區(qū)C地址指針訪問寄存器C結(jié)構(gòu)體成員訪問寄存器

第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---寄存器開發(fā)模式2025/11/282.匯編訪問位帶別名區(qū)位帶操作是將位帶區(qū)的一位(1bit)映射到位帶別名區(qū)的一個由四個存儲單元組成的32位字單元,通過給該字單元送0或1,實現(xiàn)將位帶區(qū)對應(yīng)位清0或置1,從而實現(xiàn)了寄存器位設(shè)置的原子操作,提高了并發(fā)環(huán)境下嵌入式系統(tǒng)運行的可靠性。有關(guān)位帶操作的詳細介紹見“2.4.2位帶操作”。本例中GPIOA_ODR寄存器的地址(GPIOA_ODR_address)為0x4001080C,其d0位映射到位帶別名區(qū)的地址為:GPIOA_ODR_d0_alias=0x42000000+((GPIOA_ODR_address-0x40000000)*8+0)*4=0x42210180通過給位帶別名區(qū)0x42210180字單元送0或1,即可實現(xiàn)對GPIOA_ODR寄存器的d0位清0或置1,從而實現(xiàn)連接在PA0上的D1燈的閃爍。具體代碼如下:第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---寄存器開發(fā)模式(匯編訪問位帶別名區(qū))

AREAADDCODE,CODE,READONLY ENTRYmycode MOV R2,#0x00000000 MOV R3,#0x00000001next LDR R0,=0x42210180;d0對應(yīng)的位帶別名區(qū)地址為0x42210180 STR R2,[R0];將R2值送位帶別名區(qū) EOR R2,R3;R2與R3異或,使R2的d0位取反 BL delay;調(diào)用延時過程 B next;循環(huán)點亮D1燈

2025/11/28第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---寄存器開發(fā)模式(C地址指針訪問寄存器)#define RCC_APB2ENR *(volatileunsignedlong*)0x40021018#define GPIOA_CRL *(volatileunsignedlong*)0x40010800//定義GPIOA_ODR寄存器的地址指針#define GPIOA_ODR *(volatileunsignedlong*)0x4001080CvoidDelay(intnCount);intmain(void){ RCC_APB2ENR=1<<2;//APB2上的外設(shè)時鐘使能 GPIOA_CRL=(2<<0)|(0<<2);//設(shè)置GPIOA引腳0的工作方式 while(1){

GPIOA_ODR=0<<0;//GPIOA_ODR寄存器d0位清零,D1燈亮 Delay(0x0FFFFF);//調(diào)用延時函數(shù)

GPIOA_ODR=1<<0;//GPIOA_ODR寄存器d0位置1,D1燈熄滅 Delay(0x0FFFFF);//調(diào)用延時函數(shù) }}voidDelay(intnCount){for(;nCount!=0;nCount--);}3.C地址指針訪問寄存器如何宏定義某個寄存器的地址指針?右邊程序中涉及到三個寄存器地址RCC_APB2ENR(APB2外設(shè)時鐘使能寄存器,地址為0x40021018)GPIOA_CRL(GPIOA端口配置低寄存器,地址為0x40010800)GPIOA_ODR(GPIOA端口輸出數(shù)據(jù)寄存器,地址為0x40010800)

2025/11/28第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---寄存器開發(fā)模式(C地址指針訪問寄存器)#defineGPIOA((GPIO_TypeDef*)0x40010800)#defineRCC_APB2ENR*(volatileunsignedlong*)0x40021018#defineGPIOA_CRL*(volatileunsignedlong*)0x40010800voidDelay(intnCount);intmain(void){ RCC_APB2ENR=1<<2; GPIOA_CRL=(2<<0)|(0<<2); while(1){

GPIOA->ODR=0<<0; //GPIOA_ODR寄存器d0位清零,D1燈亮 Delay(0x0FFFFF);//調(diào)用延時函數(shù)

GPIOA->ODR=1<<0 //GPIOA_ODR寄存器d0位置1,D1燈熄滅 Delay(0x0FFFFF);//調(diào)用延時函數(shù) }}voidDelay(intnCount){for(;nCount!=0;nCount--);}3.C結(jié)構(gòu)體成員訪問寄存器為GPIO片上外設(shè)定義了一個GPIO_TypeDef結(jié)構(gòu)體類型typedefstruct{ intCRL; intCRH; intIDR; intODR; intBSRR; intBRR; intLCKR;}GPIO_TypeDef#defineGPIOA((GPIO_TypeDef*)0x40010800)定義一個名為GPIOA的宏,該宏的值是一個指向GPIO_TypeDef類型的結(jié)構(gòu)體指針,該指針指向地址0x40010800。通過該指針就可以訪問結(jié)構(gòu)體成員,對GPIO的相關(guān)寄存器進行操作了

注意:這里我們自己為GPIO定義了一個結(jié)構(gòu)體變量,事實上,在意法半導(dǎo)體公司提供的標(biāo)準(zhǔn)庫中,stm32f10x.h頭文件為所有的片上外設(shè)都定義了專門的結(jié)構(gòu)體類型,建議讀者閱讀該頭文件,了解相關(guān)結(jié)構(gòu)體的定義,分析這些結(jié)構(gòu)體在標(biāo)準(zhǔn)庫中是如何被使用的。2025/11/282.標(biāo)準(zhǔn)外設(shè)庫開發(fā)模式直接操作寄存器的方式的好處:直接操作寄存器通??梢垣@得更高的性能,因為沒有函數(shù)調(diào)用的開銷;直接訪問寄存器提供了對硬件的完全控制,可以執(zhí)行底層硬件操作,實現(xiàn)更精細的定時和同步;由于沒有額外的庫函數(shù)調(diào)用,代碼大小可能會更??;由于是通過對底層硬件的訪問來實現(xiàn)相關(guān)的操作,更利于讀者掌握嵌入式開發(fā)的底層邏輯。然而,由于目前嵌入式微控制器的片上外設(shè)越來越多,涉及到外設(shè)的寄存器也越來越來越多,所以基于寄存器的開發(fā)缺點也是顯然易見的。---ST公司就先后推出了標(biāo)準(zhǔn)外設(shè)庫(StandardPeripheralLibrary,SPL),硬件抽象層庫(HardwareAbstractionLayer,HAL)和底層庫(Low-Level,LL),以方便開發(fā)人員使用。第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---標(biāo)準(zhǔn)外設(shè)庫開發(fā)模式2025/11/282.標(biāo)準(zhǔn)外設(shè)庫開發(fā)模式STM32標(biāo)準(zhǔn)外設(shè)庫是一個固件函數(shù)包,由程序、數(shù)據(jù)結(jié)構(gòu)和宏組成,為開發(fā)者訪問底層硬件提供了中間API。通過使用標(biāo)準(zhǔn)外設(shè)庫,開發(fā)者無須深入掌握底層硬件細節(jié),就可以輕松地應(yīng)用每個外設(shè)。因此,使用標(biāo)準(zhǔn)外設(shè)庫可以大大減少用戶編寫程序的時間,進而降低開發(fā)成本。

標(biāo)準(zhǔn)外設(shè)庫的架構(gòu)遵循CMSIS標(biāo)準(zhǔn)(CortexMicro-controllerSoftwareInterfaceStandard,Cortex微控制器軟件接口標(biāo)準(zhǔn))。由于ARM公司產(chǎn)品是由眾多合作公司形成的生態(tài)半導(dǎo)體產(chǎn)業(yè)鏈,在這條產(chǎn)業(yè)鏈上,ARM公司只負(fù)責(zé)芯片內(nèi)核的架構(gòu)設(shè)計,而半導(dǎo)體廠商則根據(jù)ARM公司提供的內(nèi)核標(biāo)準(zhǔn)設(shè)計各自的芯片,所以任何一個基于Corex生產(chǎn)的芯片其內(nèi)核結(jié)構(gòu)都是一樣的,區(qū)別在于存儲器容量、片上外設(shè)、I/O以及其他模塊的設(shè)計。為了解決不同芯片廠商生產(chǎn)的基于Cortex核的微處理器在軟件上的兼容問題,ARM公司與眾多芯片和軟件廠商共同制定了CMSIS標(biāo)準(zhǔn),旨在將所有Cortex內(nèi)核產(chǎn)品的軟件接口標(biāo)準(zhǔn)化。

意法半導(dǎo)體推出的標(biāo)準(zhǔn)外設(shè)庫、HAL庫和LL庫當(dāng)然都是遵循這個標(biāo)準(zhǔn)的!第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---標(biāo)準(zhǔn)外設(shè)庫開發(fā)模式2025/11/28標(biāo)準(zhǔn)外設(shè)庫開發(fā)步驟在MDK5集成開發(fā)環(huán)境中,使用STM32F10x標(biāo)準(zhǔn)外設(shè)庫,開發(fā)基于STM32F103R6微控制器驅(qū)動LED燈D1(接在GPIOA的PA0引腳)工程的主要步驟:1.啟動MDK5:打開KeiluVision5集成開發(fā)環(huán)境。2.新建工程:點擊菜單欄上的“Project”->“NewμVisionProject...”,然后給工程命名并選擇一個保存位置(事先要創(chuàng)建一個用來存放該工程的工程文件夾)。3.選擇MCU型號:在彈出的對話框中,選擇“STMicroelectronics”->“STM32F1Series”->“STM32F103R6”或類似的MCU型號。4.添加標(biāo)準(zhǔn)外設(shè)庫:將STM32F10x標(biāo)準(zhǔn)外設(shè)庫的路徑添加到工程設(shè)置中。這通常包括stm32f10x.h頭文件和相應(yīng)的庫文件(.c和.h)。(1)在工程文件夾中創(chuàng)建一個文件夾來存放標(biāo)準(zhǔn)外設(shè)庫文件(例如Libraries)。(2)將標(biāo)準(zhǔn)外設(shè)庫文件復(fù)制到該文件夾中。(3)在MDK5中,右鍵點擊工程名(缺省為Target1)->“AddGroup...”,在新出現(xiàn)的分組“NewGroup”點右鍵,點擊“ManageProjectItems…”,在出現(xiàn)的對話框中命名該組(例如“STM32F10x_StdPeriph_Driver”),然后將庫文件添加到該組中。5.配置工程設(shè)置:在Project菜單中選擇“OptionsforTarget...”來配置工程設(shè)置。6.編寫代碼:在main.c文件中編寫代碼來初始化GPIOA并控制PA0引腳。7.編譯和下載:保存工程,然后點擊工具欄上的編譯按鈕(或使用快捷鍵F7)來編譯工程。如果編譯成功,就可以將生成的二進制文件下載到STM32F103R6微控制器開發(fā)板,第6章基于STM32F103微控制器的嵌入式系統(tǒng)開發(fā)基礎(chǔ)---標(biāo)準(zhǔn)外設(shè)庫開發(fā)模式2025/11/28標(biāo)準(zhǔn)外設(shè)庫開發(fā)示例main()函數(shù)中首先調(diào)用GPIO_Config()函數(shù),對GPIOA時鐘進行使能,并通過調(diào)用GPIO_Init()函數(shù)對PA0引腳進行配置。在while循環(huán)中切換PA0的狀態(tài)來控制LED燈D1的亮滅。#include"stm32f10x.h"voidGPIO_Config(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA時鐘 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//選擇PA0引腳 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//設(shè)置輸出速度為50MHz GPIO_Init(GPIOA,&GPIO_InitStructure);//根據(jù)設(shè)定的參數(shù)初始化GPIOA的PA0引腳}intmain(void){ GPIO_Config();//初始化GPIOA while(1) {

GPIO_ResetBits(GPIOA,GPIO_Pin_0);//將PA0設(shè)置為低電平,LED燈亮 for(uint32_ti=0;i<10000

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論