【IoT】(零)HAL

      網(wǎng)友投稿 1175 2025-04-04

      【IoT】(零)HAL


      選擇HAL

      HAL直譯硬件抽象層,而庫就是函數(shù)的集合,HAL庫的作用是向下操作寄存器進(jìn)行封裝,向上提供用戶函數(shù)調(diào)用的接口(API)。 從 STM32F7 開始 ST(意法 半導(dǎo)體) 將不會提供配套的標(biāo)準(zhǔn)庫,只提供 HAL 庫。

      在 51 的開發(fā)中我們作法是直接操作寄存器,比如要控制某些 IO 口的狀態(tài),我們直接操作寄存器: P0=0x11;

      而在 STM32 的開發(fā)中,我們同樣可以操作寄存器: GPIOx->BSRR=0x00000001;

      但是這種方法的需要去掌握每個(gè)寄存器的用法,我們才能正確使用 STM32,而對于 STM32 這種級別的 MCU,數(shù)百個(gè)寄存器記起來又是談何容易。于是 ST推出了官方HAL庫,大多數(shù)場合下,我們不需要去知道操作的是哪個(gè)寄存器,你只需要知道調(diào)用哪些函數(shù)即可。

      比如上面的控制 BSRRL 寄存器實(shí)現(xiàn)電平控制,官方 HAL 庫封裝了一個(gè)函數(shù):

      void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

      官方的相關(guān)文檔或是函數(shù)定義處(stm32l4xx_hal_gpio.c)會有相關(guān)參數(shù)的介紹

      HAL的函數(shù)都有語義化設(shè)計(jì)特點(diǎn),從函數(shù)名很容易了解函數(shù)作用,能夠便于開發(fā)者閱讀和寫出更優(yōu)雅的代碼,回顧時(shí)能更快分析代碼功能。

      HAL在CubeMX加持下,對STM32的開發(fā)將顯著加快。

      一、HAL庫目錄結(jié)構(gòu)(了解即可)

      Drivers 文件夾:BSP板級支持包,是官方開發(fā)板的硬件驅(qū)動API

      CMSIS(Cortex Microcontroller Software Interface Standard):ARM Cortex? 微控制器軟件接口標(biāo)準(zhǔn),是arm提供內(nèi)核與外設(shè)、實(shí)時(shí)操作系統(tǒng)和中間設(shè)備之間的通用接口。

      STM32L4xx_HAL_Driver:包含了所有的 STM32l4xx 系列 HAL 庫頭文件和源文件,也就是所有底層硬件抽象層 API 聲明和定義。該文件 夾包含 Src 和 Inc 兩個(gè)子文件夾,其中 Src 子文件夾 存放的是.c 源文件,Inc 子文件夾存放的是與之對應(yīng) 的.h 頭文件。每個(gè).c 源文件對應(yīng)一個(gè).h 頭文件。源文件名稱基本遵循 stm32l4xx_hal_ppp.c 定義格式, 頭文件名稱基本遵循 stm32l4xx_hal_ppp.h 定義格 式。比如 gpio 相關(guān)的 API 的聲明和定義在文件 stm32l4xx_hal_gpio.h 和 stm32l4xx_hal_gpio.c 中。 該文件夾中一般會存放用戶參考手冊,各種函數(shù)API都可以在.chm文件中查找。

      Utilities:一些其他組件

      二、MDK工程中項(xiàng)目操作

      1、添加group

      藍(lán)色添加方式是一般網(wǎng)上教學(xué)選擇方式,多文件添加時(shí)速度更快

      對工程文件夾右鍵-Add Group-即可獲得新組

      2、添加項(xiàng)目

      文件夾右鍵Add New Item

      單文件添加時(shí)速度更快

      這種方式要求type規(guī)范,不會發(fā)生忘記輸入后綴的情況

      3、添加頭文件

      3、添加全局宏定義標(biāo)識符

      USE_HAL_DRIVER 和 STM32L431xx,他們之間是用“,”或“。”隔開的

      那么為什么添加全局宏定義標(biāo)識符

      因?yàn)槠湎喈?dāng)于

      #define USE_HAL_DRIVER

      #define STM32L431xx

      ...

      進(jìn)行這部操作就像打開了一個(gè)執(zhí)行下面代碼的按鈕

      #if defined (USE_HAL_DRIVER) #include "stm32l4xx_hal.h" #endif /* USE_HAL_DRIVER */

      預(yù)編譯的時(shí)候會判斷條件USE_HAL_DRIVER, STM32L431xx等等,成立后包含頭文件。stm32l4xx_hal.h,該頭文件有著HAL的所有模塊驅(qū)動程序;stm32l431xx_hal.h文件包含:①所有l(wèi)431外設(shè)的數(shù)據(jù)結(jié)構(gòu)和地址映射②外設(shè)的寄存器聲明和位定義③訪問外設(shè)寄存器硬件的宏

      不同的芯片使用到的全局宏定義標(biāo)識符不一樣

      4、勾選創(chuàng)造HEX文件,HEX文件才是我們下到芯片中的文件

      三、關(guān)鍵文件 (ppp 代表任意外設(shè))

      stm32l4xx_hal_ppp.c/.h

      基本外設(shè)的操作 API。其 中 stm32l4xx_hal_cortex.c/.h 比較特殊,它是 一些 Cortex 內(nèi)核通用函數(shù)聲明和定義,例如 中斷優(yōu)先級 NVIC 配置,系統(tǒng)軟復(fù)位以及 Systick 配置等。

      stm32l4xx_hal_ppp_ex.c/.h

      拓展外設(shè)特性的 API。

      stm32l4xx_hal.c/.h

      包含 HAL 通用 API(比如 HAL_Init,HAL_DeInit,HAL_Delay 等)。

      stm32l4xx_hal_conf.h

      HAL 的配置文件,主要用來選擇使能何種外 設(shè)以及一些時(shí)鐘相關(guān)參數(shù)設(shè)置。其本身應(yīng)該被業(yè)務(wù)代碼所包含。

      stm32l4xx_hal_def.h

      包含 HAL 的通用數(shù)據(jù)類型定義和宏定義

      stm32l4xx_II_ppp.c/.h

      在一些復(fù)雜外設(shè)中實(shí)現(xiàn)底層功能,它們在stm32l4xx_hal_ppp.c 中被調(diào)用

      stm32l4xx_it.c/stm32f4xx_it.h

      stm32l4xx_it.h 中主要是一些中斷服務(wù)函數(shù)的申明。

      stm32l4xx.h

      它是所有 stm32l4 系列的頂層頭文件。 使用 STM32l4 任何型號的芯片,都需要包含這個(gè)頭文件。同時(shí),因?yàn)?stm32l4 系列芯片型 號非常多,ST 為每種芯片型號定義了一個(gè)特有的片上外設(shè)訪問層頭文件,比如 STM32L431 系列,ST 定義了一個(gè)頭文件 stm32l431xx.h,然后 stm32l4xx.h 頂層頭文件會根據(jù)工程芯片型號,來選擇包含對應(yīng)芯片的片上外設(shè)訪問層頭文件。

      stm32l431xx.h

      stm32l431xx.h 是 stm32l431 系列芯片通用的片上外設(shè)訪問層頭文件,只要我們進(jìn)行 STM32l431開發(fā),就必然要使用到該文件。打開該文件我們可以看到里面主要是一些結(jié)構(gòu)體和宏定義標(biāo)識符。這個(gè)文件的主要作用是寄存器定義聲明以及封裝內(nèi)存操作。

      system_stm32l4xx.c/.h

      主要是聲明和定義了系統(tǒng)初始化函 數(shù) SystemInit 以及系統(tǒng)時(shí)鐘更新函數(shù) SystemCoreClockUpdate。SystemInit 函數(shù)的作用是進(jìn)行 時(shí)鐘系統(tǒng)的一些初始化操作以及中斷向量表偏移地址設(shè)置,但它并沒有設(shè)置具體的時(shí)鐘值, 這是與標(biāo)準(zhǔn)庫的最大區(qū)別,在使用標(biāo)準(zhǔn)庫的時(shí)候,SystemInit 函數(shù)會幫我們配置好系統(tǒng)時(shí)鐘配置相關(guān)的各個(gè)寄存器。

      在啟動文件 startup_stm32l431xx.s 中會設(shè)置系統(tǒng)復(fù)位后,直接調(diào)用 SystemInit 函數(shù)進(jìn)行系統(tǒng)初始化。SystemCoreClockUpdate 函數(shù)是在系統(tǒng)時(shí)鐘配置進(jìn)行修改后,調(diào)用這個(gè)函數(shù)來更新全局變量 SystemCoreClock 的值,變量SystemCoreClock 是一個(gè)全局變量,開放這個(gè)變量可以方便我們在用戶代碼中直接使用這個(gè)變量來進(jìn)行一些時(shí)鐘運(yùn)算。

      tm32l4xx_hal_msp.c

      MSP,全稱為 MCU support package,函數(shù)名字中帶有 MspInit 的函數(shù),它們的作用是進(jìn)行 MCU 級別硬件初始化設(shè)置,并且它們通常會被上一層的初始化函數(shù)所調(diào)用, 這樣做的目的是為了把MCU相關(guān)的硬件初始化剝奪出來,方便用戶代碼在不同型號的MCU 上移植。

      stm32l4xx_hal_msp.c 文件定義了兩個(gè)函數(shù) HAL_MspInit 和 HAL_MspDeInit。這兩個(gè)函數(shù)分別被文件 stm32l4xx_hal.c 中的 HAL_Init 和 HAL_DeInit 所調(diào)用。HAL_MspInit 函數(shù)的主要作用是進(jìn)行 MCU 相關(guān)的硬件初始化操作。

      例如我們要初始化某些硬件,我們可以硬件相關(guān)的初始化配置寫在 HAL_MspDeinit 函數(shù)中。這樣的話,在系統(tǒng)啟動后調(diào)用了 HAL_Init 之后,會自動調(diào)用硬件初始化函數(shù) 。

      startup_stm32l431xx.s

      STM32 系列所有芯片工程都會有一個(gè).s 匯編啟動文件。對于不同型號的 stm32 芯片啟動文件也 是不一樣的。啟動文件的作用主要是進(jìn)行堆棧的初始化,中斷向量表以及中斷函數(shù)定義等。啟動文件有一個(gè)很重要的作用就是系統(tǒng)復(fù)位后引導(dǎo)進(jìn)入 main 函數(shù)。

      接下來我們看看 HAL 庫工程中各個(gè)文件之間的包含關(guān)系

      看不懂沒關(guān)系,頂層頭文件 stm32l4xx.h(stm32xxxx.h ) 直接或間接包含了其他所有工程必要頭文件,所以在我們的用戶代碼中,我們只需要包含頂層頭文件 stm32l4xx.h 即可。

      參(C)考(V)自:

      杰杰

      mculover666等大佬

      Description of STM32L4/L4+ HAL drivers UM1884 User manual

      嵌入式 IoT 單片機(jī)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:做一個(gè)快樂的程序員
      下一篇:excel批量輸入求和公式方法介紹
      相關(guān)文章
      亚洲大尺度无码无码专区| 亚洲熟妇自偷自拍另欧美| 亚洲欧美一区二区三区日产| 亚洲成在人天堂在线| 无码欧精品亚洲日韩一区夜夜嗨| 亚洲愉拍一区二区三区| 亚洲AV无码精品蜜桃| 亚洲大香人伊一本线| 亚洲国产成人无码av在线播放| 久久精品国产亚洲AV无码娇色| 亚洲AV无码久久| 亚洲成A人片777777| 亚洲精品国产字幕久久不卡| 亚洲理论电影在线观看| 亚洲人成亚洲人成在线观看| 国产亚洲精品va在线| 亚洲国产成人片在线观看| 久久亚洲精品中文字幕无码| 亚洲国产老鸭窝一区二区三区| 亚洲网址在线观看你懂的| 99久久亚洲精品无码毛片| 亚洲高清美女一区二区三区| 91在线精品亚洲一区二区| 亚洲美女视频一区| 激情亚洲一区国产精品| 亚洲日韩一区精品射精| 无码天堂亚洲国产AV| 亚洲精品国产va在线观看蜜芽| 亚洲综合色在线观看亚洲| 亚洲性猛交XXXX| 精品国产_亚洲人成在线高清| 久久99国产亚洲高清观看首页| 亚洲精品高清国产一久久| 亚洲短视频在线观看| 中文字幕在线观看亚洲日韩| 在线亚洲v日韩v| 国产性爱在线观看亚洲黄色一级片 | 亚洲宅男永久在线| 亚洲乱码中文论理电影| 亚洲精品永久在线观看| 亚洲XX00视频|