STM32F0_HAL庫驅動描述——LL驅動程序概述

LL驅動概述

低層(LL)驅動器旨在提供快速輕量級的專家導向層,它比硬件更接近硬件;編程

與HAL相反,LLAPI不適用於優化訪問不是關鍵功能的外設設備,或者須要大量軟件配置和/或複雜的高級堆棧(如USB)的外設數據結構

LL驅動函數庫既能夠在不使用HAL驅動庫下使用(獨立模式),也能夠和HAL驅動庫一塊兒使用(混合模式);函數

LL是底層驅動庫,這些庫徹底反應硬件功能,而且LL不實現任何處理,不須要任何額外的存儲器資源來保存它們的狀態、計數器或數據指針,而是經過改變任何相關的外設寄存器內容來執行全部的操做;工具

 

LL庫文件結構:

用於核心總線控制和外設時鐘激活/停用的源文件:優化

  •   stm32f0xx_ll_bus.h

庫核心配置文件(初始化函數包含在c文件中,全部其餘的API包含在h文件中):spa

  •        stm32f0xx_ll_ppp.h/.c

CortexM相關寄存器操做API(包括Systick、低功耗模式):3d

  •        stm32xx_ll_cortex.h

通用API(獲取設備惟一ID/電子簽名、時基和延時管理系統、系統時鐘配置):指針

  •        stm32xx_ll_xx_ll_utils.h/.c

系統相關操做(SYSCFG、DBGMCU、FLASH):code

  •        stm32xx_ll_xx_ll_system.h

定義assert_param宏的模板文件,在啓用運行時檢查時使用:對象

  •        stm32_assert_template.h

僅當LL驅動程序以獨立模式使用(不調用HALAPI)時,才須要此文件;

應將其複製到應用程序文件夾並重命名爲stm32_assert.h;

 

能夠從LL驅動文件夾中看到其搭建庫文件須要包含的內容;

因爲LL庫是直接驅動底層寄存器來操做,所以和CMSIS驅動緊密聯繫,在使用LL庫時須要將相應器件的CMSIS驅動文件包含進去:

#include "stm32yyxx.h"

 

 

其和CMSIS文件的關係以下圖所示:

 

LL API和命名規則:

外設初始化功能:

LL驅動程序提供三組初始化函數,它們在stm32f0xx_ll_ppp.c文件中定義:

  •        LL_PPP_Init用於根據數據結構中指定的參數初始化外設主要功能;
  •        LL_PPP_StructInit使用復位值來重設數據結構;
  •        LL_PPP_DeInit解除外設初始化功能(外設寄存器恢復爲默認值);

這些LL初始化函數和相關資源的定義由編譯器宏來決定:USE_FULL_LL_DRIVER或者在調用LL驅動庫前在頭文件添加此開關;

 

除此以外還有可選的額外附加功能:

  •        LL_PPP{_CATEGORY}_Init外設初始化功能;
  •        LL_PPP{_CATEGORY}_StructInit重設外設功能;
  •        LL_PPP_CommonInit初始化同一外設的不一樣實例之間共享的公共功能;
  •        LL_PPP_CommonStructInit重設同一外設的不一樣實例之間共享的公共功能;
  •        LL_PPP_ClockInit初始化(同步)外設時鐘模式;
  •        LL_PPP_ClockStructInit重設外設時鐘寄存器值;

 

 

運行時間檢測:

和HAL驅動庫同樣,LL初始化函數經過檢查LL庫函數中的輸入值來實現運行時故障檢測;在獨立模式下使用LL庫,在運行時檢查須要執行如下操做:

  • 將stm32_assert_template.h複製到應用程序文件夾並將其重命名爲stm32_assert.h;此文件定義啓用運行時檢查時使用的assert_param宏;
  • 在應用程序主頭文件中包含stm32_assert.h文件;
  • 在工具鏈編譯器預處理器中或在stm32_assert.h驅動程序以前處理的任何通用頭文件中添加USE_FULL_ASSERT編譯開關;

該檢查不適用LL庫的內聯函數(inline function);

 

外設寄存器配置:

除了外設初始化函數以外,LL庫還提供了一組直接用於原子寄存器(保證寄存器的讀寫在某個時間點發生,在該點以前執行將獲取寄存器的舊值,在該點以後執行將獲取寄存器的新值,後面的讀取不能返回舊值)的內聯函數(爲了解決函數調用時參數傳遞形成的時間開銷和形參佔用的內存空間,採用預編譯宏來定義簡單的函數,可是宏定義的本質是字符串替換所以在定義函數很容易形成調用結果的錯誤,而內聯函數就是爲了解決和替換宏而產生的,其本質是一個具備時間和內存優化的簡單函數,不能在內聯函數中包含循環、條件、選擇等複雜的結構)

__STATIC_INLINE return_type LL_PPP_Function (PPPx_TypeDef *PPPx, args)

 

根據操做內容定義功能名稱:

  • 特定中斷、DMA請求和狀態標誌管理:

  在中斷和狀態寄存器中有如下Flags:Set/Get/Clear/Enable/Disable

 

  BITNAME是指產品系列參考手冊中外設寄存器的名稱;

 

  • 外設時鐘的使能/失能管理:

  在外設時鐘中有如下Flags:Enable/Disable/Reset

  'x'對應於組索引而且指的是給定總線上的修改寄存器的索引,相似於多個寄存器之間的編號;

  'bus'對應於總線名稱(例如APB1);

 

  • 外設的使能/失能管理:

  對於外設而言有如下Flags:Enable/disable

 

 

  • 外設配置管理:

  存在如下配置Flags:Set/Get

 

 

  • 外設寄存器管理:

  對寄存器進行讀寫操做的Flags:Write/Read

 

  Propriety是一個用於標識DMA傳輸方向或數據寄存器類型的變量;

 

HAL與LL的混合模式:

對於相同的外設實例,它們不能一塊兒使用,若是對特定的實例使用LL API,則仍然能夠將HALAPI應用於其餘實例,低層LL庫可能會覆蓋某些在HAL句柄的內容;

 

獨立模式下使用LL驅動庫:

能夠在不調用HAL庫的狀況下使用LL庫,只須要將應用程序中包含stm32f0xx_ll_ppp.h既能夠完成獨立使用LL庫的操做;經過參考手冊推薦的編程模型調用推薦的相同循序調用給定的LLAPI;LL庫應使用和HAL庫相同的處理方式,始終使用系統文件、啓動文件和CMSIS;

當包含BSP驅動文件的時候,與BSP功能驅動程序相關聯的HAL庫應包含在目錄下,即使它們未被應用程序使用;

 

混合模式下使用LL和HAL庫:

低層API和HAL庫混合使用,能夠實現基於寄存器的直接操做;

  • 應避免同時使用LL和HAL初始化同一個外設,若是是這種狀況須要更新HAL PPP句柄結構PPP_HandleTypeDef下的一個或多個私有字段;
  • 對於不改變句柄字段(包括初始化結構)的操做和進程,HAL驅動程序API和LL服務能夠一塊兒用於同一個外設實例;
  • LL驅動庫可使用不基於任何句柄對象(RCC、common HAL、flash、GPIO)的HAL驅動API;
  • 當沒有使用HAL Init/DeInit而且被LL的宏取代時,InitMsp()將不被調用,這個須要在用戶程序中本身實現;
  • 若是未使用進程API而是經過LL API來執行相應的功能,則不會調用回調函數,而且應由用戶本身來執行處理和錯誤管理;
  • 當LL API用於進程操做時,沒法調用HAL API的IRQ處理程序,而是要由用戶本身來實現IRQ程序,每一個LL程序中都要實現讀取和清除相關中斷標誌所需的宏;
相關文章
相關標籤/搜索