極簡STM32:基于HAL庫與FreeRTOS的Arm Cortex-M4編程與開發 課件 向軍 第1-5章 STM32體系結構-串行通信模塊_第1頁
極簡STM32:基于HAL庫與FreeRTOS的Arm Cortex-M4編程與開發 課件 向軍 第1-5章 STM32體系結構-串行通信模塊_第2頁
極簡STM32:基于HAL庫與FreeRTOS的Arm Cortex-M4編程與開發 課件 向軍 第1-5章 STM32體系結構-串行通信模塊_第3頁
極簡STM32:基于HAL庫與FreeRTOS的Arm Cortex-M4編程與開發 課件 向軍 第1-5章 STM32體系結構-串行通信模塊_第4頁
極簡STM32:基于HAL庫與FreeRTOS的Arm Cortex-M4編程與開發 課件 向軍 第1-5章 STM32體系結構-串行通信模塊_第5頁
已閱讀5頁,還剩326頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

嵌入式系統及應用EmbeddedSystemandApplication嵌入式系統及應用(含實驗)是電子信息工程專業的專業必修課,本課程以STM32MCU為樣機,介紹嵌入式系統的基本概念和接口技術、嵌入式系統程序設計、嵌入式實時操作系統RTOS及軟件開發調試技術。本課程主要內容包括:STM32體系結構、STM32固件包和HAL庫、中斷和系統滴答定時器、STM32的通信模塊和定時器及其應用、模擬外設、FreeRTOS的基本概念、任務和中斷管理、進程間通信技術等。通過本課程的學習,學生能了解以STM32系列MCU的基本概念和基于HAL庫和FreeRTOS的程序設計方法,掌握嵌入式系統軟硬件的調試方法,能設計基本的嵌入式系統軟硬件。課程簡介第1章STM32體系結構

(2學時)第2章STM32編程基礎

(2學時)第3章STM32固件庫與HAL庫

(2學時)第4章中斷和系統滴答定時器 (2學時)第5章STM32通信模塊及其應用 (2學時)第6章定時器及其應用

(4學時)第7章模擬外設

(2學時)

課程主要內容第8章

FreeRTOS基礎

(4學時)第9章

FreeRTOS的任務管理和中斷管理

(4學時)第10章

FreeRTOS進程間通信技術

(6學時)第11章

綜合應用實踐案例

(2學時)實驗

(32學時)基于寄存器的成功需開發實驗庫的創建實驗基于CubeMX的程序開發實驗SysTick定時器實驗鍵盤掃描顯示實驗串口數據收發實驗溫度采集實驗STM32-ADC實驗實驗項目基于FreeRTOS的STM32程序開發實驗FreeRTOS任務創建實驗FreeRTOS任務調度實驗FreeRTOS中斷管理實驗消息隊列及程序設計實驗計數信號量及程序設計實驗互斥量及程序設計實驗事件組及程序設計實驗課程目標與考核向軍.孫永奎.極簡STM32:基于HAL庫和FreeRTOS的ArmCortex-M4編程與開發漆強.嵌入式系統設計—基于STM32CubeMX與HAL庫王維波.鄢志丹.王釗.STM32Cube高效開發教程(基礎篇)王維波.鄢志丹.王釗.STM32Cube高效開發教程(高級篇)張凱龍.嵌入式系統體系、原理與設計B站視頻

漆強:/video/BV1y7411m7gg/?share_source=copy_web&vd_source=c1a96eb2fa82be38b920217a9cd71705

野火:/video/BV1Vt411X7PK/?spm_id_from=333.337.search-card.all.click

正點原子:

/video/BV1bv4y1R7dp/?spm_id_from=333.337.search-card.all.click&vd_source=1f0ff77d0f970cc61be393814d9ec8ad教學參考資源第1章STM32體系結構1.1嵌入式系統與STM32簡介

1.1.1嵌入式系統1.1.2STM32Devicesusedtocontrol,monitor,orassisttheoperationofequipment,machineryorplants.嵌入式系統(EmbeddedSystem)是以應用為中心,以計算機技術為基礎,并且軟硬件可裁剪,適用于應用系統對功能、可靠性、成本、體積、功耗有嚴格要求的專用計算機系統。1.1.1嵌入式系統定

義1.1嵌入式系統與STM32簡介

嵌入性嵌入到對象系統,滿足對象系統的要求,如物理環境、電氣環境、成本。專用性(可裁剪性)量身定做,功能單一;專用開發環境,專用開發工具。計算機系統以計算機技術基礎,光、機、電、算、軟一體化,多學科融合。特點可靠性

嵌入式系統長期工作,出現的故障率要很低。提高可靠性的典型辦法有:存儲不用磁盤,而用芯片;利用“看門狗”檢測是否死機,如果死機能自動啟動。1.1嵌入式系統與STM32簡介

實時性汽車剎車系統要使用強實時,導航系統可使用弱實時。低功耗

小型的便于攜帶的嵌入式產品,例如:手機、PDA、MP3、數碼相機等,這些設備一般需要采用體積較小的電池來供電,只有降低系統的功耗,才能讓系統工作更長的時間。降低嵌入式系統功耗的技術有很多方法,如:降低工作電壓、系統資源最小化、簡化芯片結構等。1.1嵌入式系統與STM32簡介

用1.1嵌入式系統與STM32簡介

應用演變傳統應用:MCU作為主控新應用:MCU+RF+Sense+Algorithm監控電動助力車擴展塢家電汽車音響儀器儀表20072013穿戴式電動代步車機器人2014飛行器AIIoT/1.1嵌入式系統與STM32簡介

智能家居管理系統1.1嵌入式系統與STM32簡介

第一階段(20世紀70年代):單片機系統,單片機為核心的控制系統。

第二階段(20世紀80年代):嵌入式操作系統,

以8到16位嵌入式處理器為基礎、以簡單操作系統為核心。第三階段(20世紀90年代):實時多任務操作系統,以32位RISC嵌入式中央處理器,并且使用嵌入式操作系統。第四階段(21世紀):互聯網,萬物互聯,以Internet為標志的迅速發展的階段。嵌入式系統的發展1.1嵌入式系統與STM32簡介

嵌入式處理器嵌入式處理器片上系統SOC微處理器MPU微控制器MCU數字信號處理器DSP由通用CPU演變,具備MMU如386EX和MIPS_____/將CPU、存儲器、中斷系統和外設集成在單個芯片如8051/MSP430/STM32_________________J側重于信號處理如TI公司的C2000/C5000系列___________/可編程邏輯器件客戶定制____J1.1嵌入式系統與STM32簡介

典型的嵌入式微處理器8051系列:1980年Intel公司推出51微控制器。核和外圍電路都自己設計和生產。后來以不同形式將51核轉讓給Plilips、Atmel、Dalllas等公司。ARM系列:目前ARM微處理器,已經遍及工業控制、消費類電子產品、通信系統、網絡系統等各類產品市場。IBM-PowerPC:品種多,應用范圍廣,從高端的工作站、服務器到桌面計算機系統,從消費類電子產品到大型通信設備,無所不包。MIPS:目前的使用率僅次于ARM,覆蓋游戲機、路由器、掌上電腦等各個方面。1.1嵌入式系統與STM32簡介

嵌入式數字信號處理器DSP

DSP處理器是專門用于信號處理方面的處理器,其在系統結構和指令算法方面進行了特殊設計,在數字濾波、譜分析等各種儀器上DSP獲得了大規模的應用。

片上系統SoC

片上系統是指把系統做在一塊芯片上,芯片內置的RAM、ROM不僅能保存簡單的代碼,還可以運行操作系統。

片上系統的代表性產品是高通的驍龍845芯片,該芯片集成CPU、GPU、SP、ISP、內存、Wi-Fi控制器、基帶芯片以及音頻芯片等,手機系統所需功能都在這塊芯片上實現,從而降低了產品功耗和成本,減少了產品體積。1.1嵌入式系統與STM32簡介

溫度/濕度傳感器光電類傳感器壓力傳感器SRAMDRAMNAND/NorFlashA/D接口同步/異步串口USB接口指示燈/數碼管液晶顯示屏鍵盤外圍電路1.1嵌入式系統與STM32簡介

嵌入式操作系統(EmbeddedOperatingSystem,EOS)又稱為嵌入式實時操作系統(EmbeddedReal-TimeOperatingSystem,ERTOS),是嵌入式應用軟件的基礎和開發平臺,具有一般操作系統的最基本的功能:進程調度、內存管理、設備管理、文件管理和操作系統接口(API調用),此外還具有可裁剪性,可配置性及一定的實時性等特點。目前,16位及以下的嵌入式系統一般沒有操作系統,32位以上的嵌入式系統一般都配有操作系統。如:交換機、路由器、手機、數碼相機等系統內部都有嵌入式操作系統;

U盤、IC卡讀寫器等嵌入式系統就沒有使用操作系統。嵌入式操作系統1.1嵌入式系統與STM32簡介

常見的嵌入式操作系統穩定異常VxWorks界面漂亮的WindowsCE最佳學習型的uC/OS-II開源的嵌入式Linux手機安卓iOS華為鴻蒙操作系統…1.1嵌入式系統與STM32簡介

1.1嵌入式系統與STM32簡介

STM32ARMCortex-M4內核STM32意法半導體公司Microelectronics的縮寫,表示微控制器32位的微處理器芯片STM32系列微控制器由意法半導體(STMicroelectronics)基于ARMCortex-M內核開發,支持32位應用,包括高性能、實時功能、數字信號處理和低功耗、低電壓操作,同時擁有一個完全集成和易用的開發環境。1.1.2STM32ARM010203ARM是一家公司,在全球半導體行業技術領先,其主要業務是設計16位和32位嵌入式處理器。ARM是一類微處理器芯片或產品的統稱,是采用ARM技術開發的RISC處理器的通稱。ARM是一種技術的名稱,是一種高級RISC處理器的體系結構。1.1嵌入式系統與STM32簡介

將技術授權給其它芯片廠商形成各具特色的ARM芯片中興集成電路、大唐電訊、中芯國際、上海華虹1.1嵌入式系統與STM32簡介

1.2STM32體系架構1.2.1ARM內核體系架構 1.2.2STM32系列微控制器1.2.3STM32F407微控制器1.2STM32體系架構目前,ARM內核體系架構共定義了8個版本v1~v8,這里對目前應用最廣泛的v7架構做簡要介紹。v7架構ARMv7架構采用Thumb-2技術,代碼僅占用31%的內存,性能卻高出38%。其中采用了適用于ARMCortex-A系列處理器的128位SIMD(SingleInstruction,MultipleData,單指令多數據)擴展結構NEON技術,將DSP和媒體處理能力提高了近4倍,滿足了3D圖形和游戲應用的需求。從v7架構開始,ARM微處理器統一用

Cortex作為內核體系架構的名稱。1.2.1ARM內核體系架構——以v7版本為例1.2STM32體系架構1.2STM32體系架構Cortex-M系列

成本和能耗低、易于使用,對必須考慮成本、功耗和性能的可兼容、易于使用的嵌入式設備提供了理想的解決方案。處理器主要特性Cortex-M0面向低成本、超低功耗的微控制器和深度嵌入應用Cortex-M0+針對小型嵌入式系統的最高能效的處理器,尺寸大小和編程模式與M0相近,但是具有擴展功能,如單周期I/O接口和向量表重定位功能Cortex-M1針對FPGA設計優化的小處理器,利用FPGA上的存儲器塊實現了緊耦合內存和M0有相同的指令集Cortex-M3針對低功耗微控制器設計的處理器,面積小但性能強勁,支持可以處理器快速處理復雜任務的豐富指令集,具有硬件除法器和乘加指令,支持全面的調試和跟蹤功能1.2STM32體系架構處理器主要特性Cortex-M4不但具備M3的所有功能,還擴展了面向DSP的指令集,如單指令多數據指令(SMID)和更快的單周期MAC操作。此外還有一個可選的支持IEEE754浮點標準的單精度浮點運算單元Cortex-M7針對高端微控制器和數據處理密集的應用開發的高性能處理器,具備M4支持的所有指令功能,擴展支持雙精度浮點運算,并具備擴展存儲器功能,如Cache和緊耦合存儲器Cortex-M23面向超低功耗、低成本應用設計的小尺寸處理器,和M0相似,但是支持各種增強的指令集和系統層面的功能特性和TrustZone安全擴展Cortex-M33主流的處理器設計,與M3和M4類似,但系統設計更靈活,能耗比更高效,性能更高,還支持TrustZone安全擴展1.2STM32體系架構1.2.2STM32系列微控制器F4系列基于Cortex-M4內核,主頻高達168MHz,具有DSP和FPU等功能。F1系列是ST公司主推的STM32系列MCU,基于Cortex-M3內核,主頻高達72MHz。v7-Mv7E-M圖1-2

STM32系列微控制器1.2STM32體系架構STM32MCU命名規范1.2STM32體系架構1.2STM32體系架構DIP:(塑料)雙列直插式封裝,適用于中小規模集成電路,引腳數一般不超過100個芯片封裝方式SOP:小外型表面貼片封裝,廣泛應用于10-40個引腳的芯片PQFP:塑料方形扁平封裝,管腳很細,一般應用于大規?;虺笮图呻娐?,引腳數一般在100個以上LQFP:薄型QFP指封裝,本體厚度為1.4mm的QFPDualIn-linePackageSmallOutlinePackagePlasticQuadFlatPackageLow-profileQuadFlatPackage1.2STM32體系架構

BGA:(塑料)球柵陣列封裝,Intel系列的80486和Pentium等CPU多采用這種封裝方式PGA:插針網格陣列封裝,有專門的PGA插座,插拔方便,常用于CPU的封裝PLCC:塑封方形引腳插入式封裝,外形尺寸比DIP封裝小得多,必須采用SMT(表面貼裝技術)進行焊接BallGridArrayPinGridArrayPackagePlasticJ-LeadedChipCarrie1.2STM32體系架構1.2.3STM32407微控制器STM32F4系列微控制器。該系列屬于高性能處理器,采用Cortex-M4內核。根據性質又分為很多兼容的型號,包括入門級、基礎級和高級微控制器。典型的入門級產品有STM32F401、STM32F411等,典型的基礎級產品有STM32F405、STM32F407等,高級產品型號有STM32F427、STM32F427等。1.2STM32體系架構開發板實驗箱1.2STM32體系架構1.2STM32體系架構總線矩陣圖1-4

STM32F407的總線矩陣1.2STM32體系架構I總線(InstructionBus):指令總線,用來從存儲器中傳送讀取的指令。D總線(DataBus):數據總線,用于連接閃存存儲器數據接口(如:SRAM、FLASH等),實現各種數據訪問。S總線(SystemBus):連接所有外設(如:GPIO、SPI、IIC、TIM等),用于控制各種外設工作,如配置各種外設相關寄存器等。AHB總線(AdvancedHigh-performanceBus,高級高性能總線):

時鐘頻率可達168MHz,最多可以支持16個主設備和任意多個從設備,主要用于重要和速度要求較高的模塊(如CPU、DMA和DSP等)之間的連接。APB總線(AdvancedPeripheralBus,高級外設總線):分為APB1和APB2總線,通過總線橋與AHB總線連接,再連接周邊各種低速外設,例如UART、IEEE1284并口等。其中APB1總線頻率最高可達42MHz,APB2總線頻率最高為84MHz。1.2STM32體系架構存儲器映射對存儲器分配地址的過程就叫存儲器映射。ST將所有的存儲器及外設資源都映射到同一個4GB地址空間,從而可以采用相同的方法訪問對相關外設進行讀寫訪問和操作控制。整個4GB的存儲器空間以512MB為單位,等分為8個塊(Block),前面3塊的功能劃分如表1-4所示。1.2STM32體系架構Block0該存儲塊用于存儲代碼,即Flash空間。對STM32F407ZGT6來說,用戶Flash大小為1MB。STM32的出廠固化啟動代碼BootLoader也放在該區中,占用差不多31KB的Flash空間。Block1該存儲塊用于存儲數據,即SRAM空間。這個塊只使用了128KB大小,用于SRAM訪問,同時也有大量保留地址用于擴展。

Block2該塊用于外設訪問外設,STM32中大部分的外設都是放在這個塊里面的。該存儲塊里面包括了AHB、APB1和APB2三個總線相關的外設。1.2STM32體系架構寄存器映射寄存器(Register)是一些特殊的存儲單元,通過這些存儲單元可以實現對各個內部和外部資源外設的控制。1.2STM32體系架構給寄存器對應的地址單元命名的過程就叫寄存器映射。例如,在51單片機中,每個特殊功能寄存器對應一個內部RAM單元,而在reg51.h頭文件中,為每個單元都定義了一個名稱,在程序中只需要通過這些名稱即可對相應的單元和外設進行訪問控制。在STM32存儲器的Block2這塊區域,映射的是片上外設。該存儲塊以4個字節為一個單元,每一個單元對應不同的功能,當控制這些單元時就可以驅動外設工作。1.2STM32體系架構1.3GPIO外設

1.3.1GPIO的寄存器及其映射1.3.2GPIO的內部組成1.3.3GPIO的工作模式1.3GPIO外設

GPIO:GeneralPurposeInput/Output,通用輸入/輸出接口,每個GPIO接口對應若干引腳,STM32MCU通過這些引腳與外部設備連接起來,從而實現與外部通訊、控制以及數據采集等功能。STM32的GPIO分為很多組,每組有16個引腳。不同型號的微控制器,GPIO的組數不同。例如,STM32F407Zx共有8組GPIO,分別是GPIOA~GPIOH(簡寫為PA~PH),對應占用芯片144個引腳中的114個IO口引腳。其中PH只有2根引腳PH0和PH1,一般不用做IO口。GPIO最基本的輸出功能是由STM32控制引腳輸出高低電平,從而實現開關控制。最基本的輸入功能是檢測外部輸入電平。此外,大多數GPIO引腳都具有若干復用功能,用作其他片上外設與外部電路和設備的連接。1.3GPIO外設

1.3.1GPIO的寄存器及其映射從應用編程的角度看,STM32F4微控制器中的每組通用GPIO口由10個32位寄存器構成,具體包括——配置寄存器:MODER、OTYPER、OSPEEDR、PUPDR數據寄存器:IDR、ODR置位/復位寄存器:BSRR鎖定寄存器:LCKR復用功能選擇寄存器:AFRH、AFRL

1.3GPIO外設

GPIO中的常用寄存器圖1-5

MODER寄存器各位的含義圖1-6

ODR寄存器各位的含義1.3GPIO外設

圖1-7

BSRR寄存器各位的含義將PB5置為低電平的3種方法——舉例方法3:利用BRR寄實現:BRR=0x0020方法1:利用ODR實現:ODR=0xffef方法2:利用BSRR實現:BSRR=0x002000001.3GPIO外設

GPIO中的寄存器映射GPIO外設中各寄存器映射到存儲器中的地址可以表示為寄存器地址=BUS_BASE_ADDR+PERIPH_OFFSET+REG_OFFSET其中右側的3項依次為總線基地址、外設基地址偏移量、寄存器地址偏移量。所有GPIO外設都掛在AHB1總線上,總線基地址都為0x40020000。各GPIO在存儲區分別映射占用連續的1KB個單元,相對于總線基地址的基地址偏移量依次為0x0000、0x0400、0x0800、…。這些偏移量與總線基地址相加,得到各GPIO外設的外設基地址。對每個GPIO外設來說,內部各寄存器都是32位,每個GPIO外設的10個寄存器按照相同的順序分別依次映射到存儲器中的4個字節單元,因此相鄰兩個寄存器的地址相差4。在STM32F407中,每個寄存器的地址可以由手冊查得。這里以GPIOF為例,其外設的寄存器地址映射如表1-6所示。1.3GPIO外設

1.3GPIO外設

1.3.2GPIO的內部組成1.3GPIO外設

1.3.3GPIO的工作模式輸入浮空模式:IO引腳電平完全由外部電路決定。如果IO引腳沒有連接其他的設備,那么檢測其輸入電平是不確定的。該模式可以用于按鍵檢測等場景。上拉輸入模式(Pull-up):上拉電阻導通,施密特觸發器打開,引腳外部無輸入時讀取的引腳輸入電平為高電平。下拉輸入模式(Pull-down):下拉電阻導通,施密特觸發器打開,引腳外部無輸入時讀取的引腳輸入電平為低電平。輸入模式1.3GPIO外設

每個GPIO引腳的3種輸入模式利用PUPDR的每2位來設置。當兩位分別配置為00、01和10時,分別配置引腳為無上拉/下拉、上拉、下拉模式。1.3GPIO外設

推挽輸出(Push-Pull,PP):兩個MOS管受互補信號的控制,按互補對稱的方式連接。兩個MOS管在任何時刻一定是一個到同一個截止,因此輸出有確定的高/低電平兩種狀態。

使用推挽輸出模式的目的:增大輸出電流,提高電路的負載能力和開關速度。開漏輸出(Open-Drain,OD):只有下拉NMOS管沒有上拉PMOS管,只能輸出低電平或者處于高阻浮空狀態。要輸出高電平,必須外接上拉電阻。使用開漏輸出的一個主要目的是實現線與功能。輸出模式1.3GPIO外設

推挽輸出和開漏輸出模式可以通過OTYPER寄存器進行配置。該寄存器各位的格式如圖1-10所示。當某位為1碼時,對應的GPIO引腳配置為推挽輸出模式;否則配置為開漏輸出模式。由于每個GPIO外設對應的引腳只有16位,因此該寄存器也只有低16位有用。1.3GPIO外設

復用模式(AlternateFunction)1.3GPIO外設

1.3GPIO外設

PA0~PA3引腳的復用功能(查手冊)1.3GPIO外設

模擬模式

在這種工作模式下,GPIO內部電路中的上下拉電阻斷開,施密特觸發器關閉,雙MOS管也關閉。該模式用于ADC采集或者DAC輸出,或者低功耗下省電。1.4STM32最小系統

1.4.1電源和復位啟動電路1.4.2時鐘系統與時鐘電路1.4.3調試和下載電路以野火霸天虎開發板為例

1.4STM32最小系統

1.4.1電源和復位啟動電路1.4STM32最小系統

復位電路包括上電復位、手動復位和看門狗復位等。圖1-14為開發板的上電復位和手動復位電路。在上電瞬間,由于電容兩端電壓不能突變,NRST端出現短暫低電平,芯片自動復位。低電平時間由電阻和電容共同決定。在系統運行過程中,如果按下按鍵SW2,則NRST端產生低電平,從而實現手動復位。當工作環境比較惡劣時,嵌入式處理器運行過程中可能出現死機和跑飛的情況,此時需要使用看門狗復位電路使處理器強制復位。1.4STM32最小系統

在啟動運行時,通過MCU的BOOT0和BOOT1兩個引腳電平的組合,可以選擇MCU系統從主存儲區、系統存儲區或SRAM自舉啟動,如表1-8所示。圖1-15為開發板上的啟動電路。1.4STM32最小系統

1.4.2時鐘系統與時鐘電路STM32的時鐘系統由RCC(ResetandClockControl,復位與時鐘控制器)產生和控制,為系統和各種外設提供所需的工作時鐘信號,確定各外設的工作速度。在STM32中,為各種內核組件和外設設置了一個復雜的時鐘系統。時鐘系統確定了系統時鐘的來源和產生方法、各總線時鐘以及MCU內部各組件的時鐘等。STM32的時鐘系統1.4STM32最小系統

系統時鐘絕大多數外設時鐘均由系統時鐘SYSCLK提供,而產生系統時鐘的基準時鐘源可以配置為如下3種(如圖1-16所示):1.4STM32最小系統

HSI時鐘:HighSpeedInternal,高速內部時鐘,由內部16MHz的RC振蕩器生成,可作為系統時鐘或2分頻后作為PLL輸入。HSE時鐘:HighSpeedExternal,高速外部時鐘,可外接外部時鐘源,或通過OSC_IN和OSC_OUT引腳外接4~26MHz晶振,通常使用25

MHz。PLLCLK:鎖相環時鐘,保證輸出頻率的穩定,也用于倍頻HSI或HSE。1.4STM32最小系統

總線和外設時鐘系統時鐘SYSCLK經AHB預分頻后得到HCLK時鐘,最高168MHz;HCLK時鐘或其8分頻作為系統定時器時鐘,或經APB預分頻器分頻后作為APB總線外設時鐘,如圖1-17所示。1.4STM32最小系統

在運行內核和外設時可選擇使用外部晶振或者使用內部振蕩器作為時鐘源。通過多個預分頻器可以靈活配置AHB、APB1和APB2總線和外設的時鐘頻率。AHB時鐘的最大頻率為168MHz,高速APB2的最大允許時鐘頻率為84MHz,低速APB1的最大允許頻率為42MHz。通過RCC配置,既可保證各種外設采用最高的頻率,也可為以太網、USBOTGFS等保證合適的時鐘頻率。1.4STM32最小系統

次級時鐘源與實時時鐘在RCC中,次級時鐘源為一些專用外設提供時鐘,如圖1-18所示。1.4STM32最小系統

LSI(LowSpeedInternal)時鐘:低速內部時鐘,32kHz,用于驅動獨立看門狗。LSE(LowSpeedExternal)時鐘:低速外部晶振時鐘,32.768kHz,用于驅動RTC(Real-TimeClock,實時時鐘)。實時時鐘RTC(RealtimeClock):一個獨立的BCD定時器/計數器,提供一個日歷時鐘、兩個可編程鬧鐘中斷,以及一個具有中斷功能的周期性可編程喚醒標志。1.4STM32最小系統

時鐘電路1.4STM32最小系統

1.4.3調試與下載電路1.4STM32最小系統

第2章STM32編程基礎2.2.1開發方式

2.2.2開發環境2.2.3程序下載及調試運行工具2.1STM32程序開發方式與開發環境

2.1STM32程序開發方式與開發環境

1.基于寄存器的程序開發該編程方法涉及直接操作底層硬件寄存器,能夠充分利用硬件資源,實現系統性能的最優化,但是對開發人員的專業知識和實踐經驗要求較高,設計人員必須深入理解STM32的硬件架構及其寄存器功能。該開發方式盡管難度較大,會導致代碼復雜且維護困難,但為開發者提供了極大的靈活性,允許直接管理硬件資源,實現底層硬件的優化配置。在特定應用場景下,如對實時性要求極高的系統或需要精確控制硬件行為的場合,這種編程方法能夠展現其獨特的優勢。2.1.1程序開發方式2.1STM32程序開發方式與開發環境

2.基于固件包和HAL庫的STM32程序開發在STM32的開發過程中,固件包扮演著至關重要的角色。它不僅提供了硬件抽象層(Hardware-Abstraction-Layer,HAL)庫,還提供了啟動代碼、中間件組件和示例項目等豐富資源,為開發者提供了快速啟動和運行項目的捷徑,大大縮短了開發周期。同時,固件包中的代碼具有良好的可移植性和可維護性,這為項目的長期發展提供了保障。1)HAL庫HAL庫是ST公司專門為STM32系列微控制器量身打造的?;贖AL庫的程序開發是在商議中開發方式的基礎上,通過抽象化的方式隱藏硬件操作的復雜性,使得開發者在進行硬件交互時,能夠更加便捷和高效。HAL庫提供了包括時鐘管理、模擬數字轉換、串行外設接口通信等在內的眾多硬件操作功能,這些功能都是通過高級應用程序接口(Application-ProgrammingInterface,API)函數的形式呈現給開發者的。開發者無需深入硬件底層,就可以輕松地進行硬件操作,從而大大簡化了編程過程,使得快速開發和原型設計變得更加容易。2.1STM32程序開發方式與開發環境

2)STM32CubeMX為了進一步簡化和方便基于HAL庫的程序開發流程,ST公司還專門提出了圖形化配置工具STM32CubeMX,通過圖形化界面配置微控制器的各種參數,并生成初始化代碼。這大大降低了開發難度,使得開發者可以更專注于應用邏輯的實現,而不是底層硬件的配置。通過這種方式,開發者可以更加高效地利用STM32的性能,實現各種復雜的功能。2.1STM32程序開發方式與開發環境

3.基于FreeRTOS的STM32程序設計FreeRTOS是一個免費且開源的實時操作系統,專門為微控制器和嵌入式系統量身打造,具備輕量級、高效性、易移植性以及強大的功能特性。該系統因其卓越的可移植性,特別適合資源受限的微控制器環境,已成為眾多嵌入式開發者的首選。FreeRTOS支持多種架構下的不同型號處理器,例如STM32系列的F1、F4、F7和H7等,均可實現FreeRTOS的移植。同時,ST公司已在STM32CubeMX生態系統中集成了對FreeRTOS操作系統的支持,這顯著提升了開發者學習和應用FreeRTOS操作系統的便捷性。在FreeRTOS的架構中,開發者能夠更加高效地管理任務、優先級、時間片、信號量、消息隊列等資源,從而使得程序結構更為清晰,代碼的可維護性得到增強。此外,FreeRTOS提供了豐富的API函數,賦予開發者更大的靈活性以控制任務的創建、刪除、掛起、恢復等操作,以滿足多樣化的應用需求。同時,FreeRTOS還支持任務間的通信機制,包括隊列、信號量、二值信號量等,這使得任務間的數據交換和同步更為便捷。2.1STM32開發環境

2.1.2開發環境KeilMDK:提供了一個全面的集成開發環境,支持多種嵌式平臺,支持C++和匯編語言,可以開發絕大多數的單片機嵌入式系統,擁有強大的調試功能,包括單步調試、鍛煉調試、變量監視以及寄存器監視等。IAR:瑞典IARSystem公司提供的一系列軟件開發工具,在界面、代碼編輯以及調試和支持工具包等方面與MDK基本相同。VSCode:全稱是VisualStudioCode,適用于多種編程語言,同樣有斷點變量監測等調試的基本功能。只需要安裝相應的插件即可用于嵌入式系統開發。STM32CubeIDE:ST公司官方提供的免費軟件開發工具,提供了GCC編譯工具鏈和GDB調試工具,支持添加第三方功能插件,并集成了STM32CubeMX以便進行STM32配置和項目創建,提供了一體化工具體驗,可以完成從芯片選型、項目配置、代碼生成到代碼編寫、編譯、調試和燒錄的所有工作,簡化了開發環境的搭建,有效地縮短了開發時間。2.1STM32開發環境

STM32Cube生態系統是針對STM32微控制器和微處理器的完整軟件解決方案,不僅適用于需要STM32完整且免費的開發環境的用戶,也適用于已經有IDE(包括Keil或IAR)的用戶,可以輕松地集成STM32CubeMX、STM32CubeProgrammer或STM32CubeMonitor等各種組件。STM32Cube是一系列軟件工具和嵌入式軟件包的結合體,其中提供了一整套滿足完整項目開發周期所有需求的軟件工具(SoftwareTools)和嵌入式軟件(EmbeddedSoftware)模塊,如圖2-1所示。STM32Cube生態系統2.1STM32開發環境

軟件工具嵌入式軟件2.1STM32開發環境

CubeIDE的下載和安裝

下載和安裝Java環境。Java官網,目前最新版本是V1.8.421。安裝包文件名為jre-8u421-windows-x64.exe,直接雙擊即可安裝。下載和安裝CubeIDE軟件。通過ST官網下載,在主頁/中通過搜索stm32cubeide,在出現的頁面中單擊STM32CubeIDE即可跳轉到下載頁面,如圖2-2所示。2.1STM32開發環境

2.1STM32開發環境

2.1.3程序下載及調試運行工具STM32開發過程中用到的仿真器主要有3種,即DAP、STink和JLink。DAP是ARM公司的開源仿真器,可支持STM32仿真調試,并且帶有虛擬串口功能,有高速和低速兩個版本,具有免驅、速度快、價格便宜等特點。STLink是ST公司生產的仿真器,支持STM32和STM8仿真調試,目前最常用的是STLinkV2,支持全面、性能穩定,并且廉價。JLink是Segger公司的仿真器,可支持STM32仿真調試,具有穩定、高速的特點,但價格偏貴。仿真器的安裝和程序下載運行2.1STM32開發環境

串口工具主要包括串口下載工具和串口調試助手。串口下載工具用于將HEX文件下載到開發板或實驗箱。與仿真器的主要區別在于,串口下載工具不能實現在線硬件和軟件聯合調試。串口調試助手用于實現PC機與MCU之間的數據傳送,通常用于在進行MCU串口功能和程序調試運行過程中觀察運行結果。串口工具和程序下載嵌入式開發中既有底層硬件的開發,又涉及到上層應用的開發,因此應用程序的開發將同時需要涉及系統的硬件和軟件。C語言既具有匯編語言操作底層的優勢,又具有高級語言功能性強的特點,特別適合作為開發首選語言。1程序總是從main函數開始執行;2345函數是C語言的基本結構;函數由兩部分組成:函數說明部分和函數體。

一個C語言程序包含若干個源程序文件(.c文件)和頭文件(.h文件)。采用外設功能模塊化設計方法,一個外設功能模塊包括一個源文件(.c文件)和一個頭文件(.h文件)。2.2嵌入式C語言基礎2.2嵌入式C語言基礎2.2.1結構體與枚舉2.2.2數據類型別名 2.2.3指針2.1.4C語言中的位操作 2.1.5預處理與條件編譯結構體數據類型及變量的定義聲明結構體類型的基本語法格式為:struct結構體名{ 成員列表;}變量名列表;2.2.1結構體和枚舉例如,如下語句

structTYPE_USA{ intbaudRate;

intwordLength; }usart1,usart2;聲明了一個名為TYPE_USA的結構體數據類型,同時定義了兩個該結構體類型的變量usart1和usart2。2.2嵌入式C語言基礎結構體變量可以在結構體類型申明時同時進行定義,也可以在申明之后再用其他的語句進行定義。定義結構體變量的基本語法格式為:

struct結構體名

結構體變量列表;例如,前面定義的兩個結構體變量也可以用如下語句定義:

structTYPE_USAusart1,usart2;一個結構體是由多個成員變量構成的,結構體中成員變量的引用方法為:

結構體變量名.成員名

比如可以用表達式usart1.baudRate引用結構體變量usart1中的成員變量baudRate。2.2嵌入式C語言基礎與數組類似,在為結構體變量分配存儲空間時,結構體變量中的各成員變量將按照結構體中定義的順序依次分配連續的存儲單元,各成員變量所占用的單元數取決于其數據類型。因此,一旦確定了結構體變量存儲的起始單元地址,其中每個成員變量所占用的存儲單元地址也就確定了。2.2嵌入式C語言基礎枚舉2.2嵌入式C語言基礎枚舉也是一種數據類型,用于將一個變量或對象的所有可能取值逐一列出,變量取值只限于列舉出來的值(枚舉成員)。枚舉成員具有自動編號的功能,第一個枚舉成員其默認值為整型的0,后續枚舉成員的值遞增1。例如,如下語句typedefenum{GPIO_PIN_RESET=0, //枚舉成員取值設為0GPIO_PIN_SET

//取值默認遞增1等于1}GPIO_PinState;將GPIO引腳的高低電平兩種狀態定義為枚舉類型GPIO_PinState。關鍵字typedef用于為現有的數據類型創建一個新的名字,稱為數據類型別名,用來簡化變量的定義。例如,如下語句

typedefunsignedlonguint32;將數據類型unsignedlong重新命名(別名)為uint32。利用該別名,要定義一個無符號長整型變量i,可以用如下語句實現:

uint32i=0x20000000;2.2.2數據類型別名2.2嵌入式C語言基礎結構體也是一種數據類型,因此也可以用typedef為其定義一個別名。例如,如下語句typedefstructTYPE_USA{ intbaudRate; intwordLength;}USART;定義了一個結構體類型別名UASRT,之后即可用如下類似語句 USARTusart1,usart2;定義兩個結構體變量usart1、usart2。2.2嵌入式C語言基礎指針也是一個變量,指向給定的存儲單元。利用指針變量可以在程序中對存儲單元和外設寄存器等實現絕對地址訪問。指針變量一般以p開頭,例如,如下語句

char*p_str=“Thisisatest!”;申明了一個p_str指針,指向字符串在內存中存放的首地址。2.2.3指針2.2嵌入式C語言基礎在程序中,指針變量的典型應用有兩種,分別是指針變量的賦值和指針指向單元的訪問,并分別用運算符“*”和“&”實現。指針變量的賦值指的是將指針所指向的變量在存儲器中所在單元的地址保存到指針變量中,例如,如下語句chari;char*p;p=&i;定義了一個字符型變量i和指針變量p,第三條語句將變量i所在存儲單元的地址保存到指針變量p中,從而使指針p指向變量i。2.2嵌入式C語言基礎利用上述方法使指針指向了某個存儲單元或者單元中存放的變量后,即可用下面的語句

*p=0x00000100;向該存儲單元中存入數據0x00000100,相當于為變量i賦值。結構體指針:指向一個結構體變量。例如,如下語句

structTYPE_USA*usart1;定義了結構體指針usart1,指向前面定義的TYPE_USA結構體類型的變量usart1。

2.2嵌入式C語言基礎需要注意的是,對結構體指針變量,引用其中的結構體成員變量是通過“->”符號實現的。例如,要訪問usart1結構體指針指向的結構體的成員變量baudRate,必須用如下表達式:

usart1->baudRate;在嵌入式系統編程中,位運算比其他運算更常用。這是由于嵌入式系統涉及到很多有關硬件寄存器的操作,而硬件寄存器由若干位組成,每位分別具有不同的作用和含義,經常需要單獨對其中指定的位進行讀寫操作。C語言中基本的位運算操作符有6個:&:按位與; |:按位或;^:按位異或; ~:按位取反;<<n:左移n位; >>n:右移n位。2.2.4C語言中的位操作2.2嵌入式C語言基礎對變量中指定的某些二進制位賦值,而不改變其他位。

2.2嵌入式C語言基礎先對需要設置的位用“&”操作符進行清零操作,然后用“|”操作符進行賦值。例如:

GPIOA->MODER&=0xfffffbf;//將GPIOA-MODER中的D6位清零GPIOA->MODER|=0x00000040; /*設置D6位的值為1*/

利用移位操作提高代碼的可讀性2.2嵌入式C語言基礎例如,

GPIOA->MODER|=1<<1;//將MODER中的D1位置1同樣的功能,改用如下語句實現:

GPIOA->MODER|=0x0002;//可讀性差,修改麻煩。

按位取反操作的使用技巧

2.2嵌入式C語言基礎按位取反在設置寄存器的時候經常被使用,常用于清除指定寄存器中的某一位或某幾個位。例如,下面的語句

GPIOA->MODER&=~(1<<0); /*關閉SYSTICK*/該語句僅設置MODER寄存器的D0位為0,其他位的值保持不變,實現的功能與下面的語句等效:GPIOA->MODER&=0XFFFFFFFE; /*關閉SYSTICK*/顯然前者的可讀性和可維護性都要比后者好。按位異或操作的使用技巧

2.2嵌入式C語言基礎該功能非常適合用于控制某個位翻轉,常見的應用場景就是控制LED閃爍。例如,如下語句

GPIOB->ODR^=1<<5;每執行一次,就會使PB5引腳的輸出狀態翻轉一次,如果將LED接在PB5上,就可以看到LED閃爍一次,即亮/滅狀態切換一次。

預處理

在編譯之前所做的工作,由預處理程序負責完成,編譯時系統將自動引用預處理程序對源程序中的預處理部分進行處理。

2.2.5預處理與條件編譯2.2嵌入式C語言基礎預處理通常用命令define實現,該命令一般放在程序文件的前面,用于將一個標識符(宏名,常量等)定義為一個字符串(替換文本)或常數值,稱為宏常量。宏定義的一般格式為:

#define標識符

表達式

其中,“標識符”為所定義的宏常量名,一般全部用大寫字母;

“表達式”可以是常數、表達式、格式串等。2.2嵌入式C語言基礎例如:

#defineHSE_VALUE0x80000000U //定義宏常量預處理命令定義的宏也可以帶有參數,稱為宏函數。預處理命令定義的宏也可以帶有參數,稱為宏函數。例如,

#defineIS_GPIO_SPEED(SPEED)((SPEED==GPIO_SPEED_FREQ_LOW) ||(SPEED==GPIO_SPEED_FREQ_MEDIUM) ||(SPEED==GPIO_SPEED_FREQ_HIGH) ||(SPEED==GPIO_SPEED_FREQ_VERY_HIGH))嵌入式C語言常使用條件編譯,通過條件判斷來確定是否對某段源程序進行編譯。一般用在頭文件或文件開頭部分。條件編譯的用途:可以用源程序產生不同版本。條件編譯說明#if條件編譯命令,如果#if后面的表達式為true,則執行語句#ifdef判斷某個宏是否被定義,若被定義,則執行語句#ifndef判斷某個宏是否未被定義,若未被定義,則執行語句,與#ifdef相反#elif#else指令用于#if指令之后,當#if指令的條件不為真時,就編譯#else后面的代碼,elif相當于elseif#endif條件編譯的結束命令,用在#if、#ifdef、#ifndef之后常用的條件編譯命令條件編譯2.2嵌入式C語言基礎例如,如果選擇了器件***405xx,則編譯時包含該器件的頭文件;否則,……:#ifdefined(STM32F405xx)

#include"stm32f405xx.h"……#elifdefined(STM32F407xx)

#include"stm32f407xx.h"……#else#error"PleaseselectfirstthetargetSTM32F4xxdeviceusedinyourapplication(instm32f4xx.hfile)"#endif如果沒有定義***頭文件,就定義該頭文件:#ifndef__STM32F4xx_HAL_GPIO_H

#define__STM32F4xx_HAL_GPIO_H告訴編譯器:如果是C++代碼,下面的代碼是用C語言編寫的,應該用C語言規則調用:#ifdef__cplusplus

extern"C"{#endif2.2嵌入式C語言基礎2.3基于寄存器的STM32程序設計

在基于寄存器的程序開發方式中,通過查閱官方用戶手冊對所需外設內部的寄存器組成、結構及各位的功能和含義說明,利用程序配置和訪問相應的寄存器,從而實現相應的功能。設計步驟——創建和指定工作空間新建工程新建文件并編寫程序工程配置、編譯和下載運行2.3基于寄存器的STM32程序設計

2.3基于寄存器的STM32程序設計

2.3基于寄存器的STM32程序設計

2.3基于寄存器的STM32程序設計

【實踐案例2-1】基于寄存器的STM32程序設計本案例要求實現的功能是點亮開發板上的一個LED。在開發板中,利用GPIOF端口的PF6、PF7和PF8引腳分別連接了紅、綠、藍三種顏色的LED,相關硬件電路如圖2-9所示。2.3基于寄存器的STM32程序設計

新建工程選擇目標器件2.3基于寄存器的STM32程序設計

頭文件reg.h在工程瀏覽器中單擊Inc文件夾,再單擊File/New/HeaderFile菜單命令,在彈出的NewHeaderFile(新建頭文件)對話框中,確認Sourcefolder為工程ex2_1下的Inc文件夾,并輸入頭文件名(Headerfile)為reg.h,如圖2-10所示。2.3基于寄存器的STM32程序設計

頭文件reg.h用于定義有關GPIO寄存器映射的代碼,相當于C51程序中的reg51.h和reg52.h頭文件。#definePERIPH_BASE ((unsignedint)0x40000000) //片上外設基地址

#defineAHB1PERIPH_BASE (PERIPH_BASE+0x00020000) //總線基地址

#defineRCC_BASE (AHB1PERIPH_BASE+0x3800) //RCC外設基地址

#defineRCC_AHB1ENR *(unsignedint*)(RCC_BASE+0x30) //RCC寄存器地址映射

#defineGPIOF_BASE (AHB1PERIPH_BASE+0x1400) //GPIOF外設基地址

#defineGPIOF_MODER *(unsignedint*)(GPIOF_BASE+0x00) //GPIOF寄存器地址映射

#defineGPIOF_OTYPER *(unsignedint*)(GPIOF_BASE+0x04)#defineGPIOF_OSPEEDR *(unsignedint*)(GPIOF_BASE+0x08)#defineGPIOF_PUPDR *(unsignedint*)(GPIOF_BASE+0x0C)#defineGPIOF_IDR *(unsignedint*)(GPIOF_BASE+0x10)#defineGPIOF_ODR *(unsignedint*)(GPIOF_BASE+0x14)#defineGPIOF_BSRR *(unsignedint*)(GPIOF_BASE+0x18)#defineGPIOF_LCKR *(unsignedint*)(GPIOF_BASE+0x1C)#defineGPIOF_AFRL *(unsignedint*)(GPIOF_BASE+0x20)#defineGPIOF_AFRH *(unsignedint*)(GPIOF_BASE+0x24)2.3基于寄存器的STM32程序設計

以GPIO的模式寄存器為例,相應的寄存器映射宏定義語句為:

#defineGPIOF_MODER *(unsignedint*)(GPIOF_BASE+0x00)等價于如下語句:p=(unsignedint*)(GPIOF_BASE+0x00)

#defineGPIOF_MODER *p則

GPIOF_MODER=0x00001000;等價于 *p=0x00001000;實現的功能是將指針p指向的存儲單元(即GPIOF_MODER寄存器)賦值為0x00001000,從而設置GPIOF外設的引腳PF6為輸出模式。2.3基于寄存器的STM32程序設計

#include<reg.h> /*導入寄存器映射頭文件*/intmain(void){ RCC_AHB1ENR |=(1<<5); /*開啟GPIOF時鐘*/ GPIOF_MODER &=~(0x03<<(2*6)); GPIOF_MODER |=(1<<2*6); /*PF6MODER6=01b輸出模式*/ GPIOF_OTYPER &=~(1<<1*6); GPIOF_OTYPER |=(0<<1*6); /*PF6OTYPER6=0b推挽模式*/ GPIOF_OSPEEDR &=~(0x03<<2*6); GPIOF_OSPEEDR |=(0<<2*6); /*PF6OSPEEDR6=0b速率2MHz*/ GPIOF_PUPDR &=~(0x03<<2*6); GPIOF_PUPDR |=(1<<2*6); /*PF6PUPDR6=01b上拉模式*/ GPIOF_BSRR =(1<<16<<6); /*PF6引腳輸出低電平,點亮紅燈*/ for(;;);}源文件(主程序文件)main.c2.3基于寄存器的STM32程序設計

例如,如下語句GPIOF_MODER&=~(0x03<<(2*6)); 使GPIOF_MODER寄存器中的D13D12位清零,而其余位保持不變。之后,再執行如下語句GPIOF_MODER|=(1<<2*6); 將GPIOF_MODER將D12位置位,其余所有位清零。MODER寄存器各位的含義2.3基于寄存器的STM32程序設計

例如,如下語句GPIOF_BSRR=(1<<16<<6);由PF6引腳復位,輸出低電平,以點亮開發板上的紅色LED。類似地,如下語句: GPIOF_BSRR=(1<<6); 使PF6引腳輸出高電平,從而熄滅紅燈。BSRR寄存器各位的含義2.3基于寄存器的STM32程序設計

根據上述介紹對工程屬性進行配置,之后在工程瀏覽器中單擊工程名,再單擊工具欄上的Build按鈕,編譯工程。編譯成功后,利用FlyMcu工具將Debug文件夾中的HEX文件下載到開發板,即可啟動運行。工程配置、編譯和下載運行2.3基于寄存器的STM32程序設計

【照貓畫虎2-1】基于寄存器的STM32程序設計修改程序,實現開發板綠色或藍色LED的閃爍。提示:在開發板中,綠色和藍色LED分別接在STM32F07MCU的PF7和PF8引腳,當引腳輸出低電平時,LED點亮。2.4庫的創建2.4.1GPIO外設的封裝與結構體定義2.4.2GPIO操作函數的創建【實踐案例2-2】利用自定義庫函數點亮LED【照貓畫虎2-2】GPIO操作訪問函數的定義2.4庫的創建2.4.1GPIO外設的封裝與結構體定義/*reg.h頭文件*/#definePERIPH_BASE ((unsignedint)0x40000000) //片上外設基地址

#defineAHB1PERIPH_BASE (PERIPH_BASE+0x00020000) //總線基地址

#defineRCC_BASE (AHB1PERIPH_BASE+0x3800) //RCC外設基地址

#defineRCC_AHB1ENR *(unsignedint*)(RCC_BASE+0x30) //RCC寄存器地址映射#defineGPIOF_BASE (AHB1PERIPH_BASE+0x1400) //GPIOF外設基地址

#defineGPIOF_MODER *(unsignedint*)(GPIOF_BASE+0x00)//GPIOF寄存器映射

#defineGPIOF_OTYPER *(unsignedint*)(GPIOF_BASE+0x04)#defineGPIOF_OSPEEDR *(unsignedint*)(GPIOF_BASE+0x08)……

GPIO外設結構體和結構體指針定義刪除2.4庫的創建typedefstruct{ /*GPIO外設結構體定義

*/ __IO uint32_tMODER; /*GPIO模式寄存器*/ __IO uint32_tOTYPER; /*GPIO輸出類型寄存器*/ __IO uint32_tOSPEEDR; /*GPIO輸出速度寄存器

*/ __IO uint32_tPUPDR; /*GPIO上拉/下拉寄存器*/ __IO uint32_tIDR; /*GPIO輸入數據寄存器*/ __IO uint32_tODR; /*GPIO輸出數據寄存器*/ __IO uint16_tBSRRL; /*GPIO置位/復位寄存器低16位*/ __IO uint16_tBSRRH; /*GPIO置位/復位寄存器高16位*/ __IO uint32_tLCKR; /*GPIO配置鎖定寄存器*/ __IO uint32_tAFR[2]; /*GPIO復用功能配置寄存器*/}GPIO_TypeDef;2.4庫的創建考慮到外設寄存器的地址都是基于外設基地址的偏移地址,都是在外設基地址上逐個連續遞增的,每個寄存器為32個字節,占用連續的4個字節存儲單元。這種方式跟結構體里面的成員類似,所以可以定義一種結構體,將外設中各寄存器順序作為結構體的成員變量。如果設置結構體的地址等于外設的基地址,則可以通過結構體訪問外設中的全部寄存器。2.4庫的創建/*定義GPIO外設結構體指針*/#defineGPIOF((GPIO_TypeDef*)GPIOF_BASE)其中通過強制類型轉換將GPIOF_BASE轉換為指向GPIO_TypeDef結構體類型的指針,并將其定義為GPIOF宏,代表GPIOF外設。通過對該宏的操作,即可訪問GPIOF外設中的寄存器。2.4庫的創建GPIO的初始化結構體在使用各種外設之前,都需要配置其工作模式、設置一些必須的參數等。在基于寄存器的開發方式中,為了對外設進行初始化,也需要查閱大量的手冊和資料。為了方便,還是希望將這些初始化操作及所需的參數等定義和封裝為庫的一部分。不同外設的初始化所需配置的參數各不相同,因此一般將初始化所需的參數、數據等分別定義在不同的外設配置文件中。這里新建兩個文件gpioInit.h和gpioInit.c,用于存放GPIO外設相關的初始化定義和封裝代碼。2.4庫的創建GPIO工作模式的定義(gpioInit.h)typedefenum

{GPIO_Mode_IN =0x00, /*輸入模式*/GPIO_Mode_OUT =0x01,

/*輸出模式*/GPIO_Mode_AF =0x02,

/*復用模式*/GPIO_Mode_AN =0x03

/*模擬模式*/}GPIOMode_TypeDef;typedefenum{GPIO_OType_PP =0x00,

/*推挽模式*/GPIO_OType_OD =0x01 /*開漏模式*/}GPIOOType_TypeDef;……2.4庫的創建初始化結構體的定義/*GPIO初始化結構體類型定義*/typedefstruct{uint32_t

GPIO_Pin;

/*選擇要配置的GPIO引腳*/GPIOMode_TypeDef GPIO_Mode;

/*選擇GPIO引腳的工作模式*/GPIOSpeed_TypeDefGPIO_Speed;

/*選擇GPIO引腳的速率*/GPIOOType_TypeDefGPIO_OType;

/*選擇GPIO引腳輸出類型*/GPIOPuPd_TypeDef GPIO_PuPd;

/*選擇GPIO引腳的上/下拉模式*/}GPIO_InitTypeDef;2.4庫的創建GPIO引腳定義在上述結構體中,第一個成員用于指定需要初始化配置的GPIO引腳,為了方便,將這些代表引腳的取值常數定義為如下16個宏:#defineGPIO_PIN_0 ((uint16)(1<<0))#defineGPIO_PIN_1 ((uint16)(1<<1))#defineGPIO_PIN_2 ((uint16)(1<<2))#defineGPIO_PIN_3 ((uint16)(1<<3))……#defineGPIO_PIN_15 ((uint16)(1<<15))#defineGPIO_PIN_All ((uint16)0xFFFF)2.4庫的創建2.4.2GPIO操作函數的創建前面定義了GPIO外設結構體,在此基礎上即可使用函數來封裝對GPIO外設的基本操作,所有對GPIO寄存器的操作訪問都可以通過調用這些函數進行,而不再需要寄存器的地址和位格式等信息。GPIO的操作函數主要包括對GPIO引腳的初始化和GPIO引腳的讀寫訪問等。這些函數都將定義在gpioInit.c文件中,而在對應的gpioInit.h頭文件中,需要對這些函數做原型聲明。2.4庫的創建在頭文件gpioInit.h中,添加GPIO操作函數的原型聲明:此外,在gpioInit.h文件中還需要添加如下代碼,將GPIO寄存器映射頭文件reg.h包含進來:#include"reg.h"之后再將gpioInit.h導入gpioInit.c文件。voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16GPIO_Pin);voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,ui

溫馨提示

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

最新文檔

評論

0/150

提交評論