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


LL驅動概述

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

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

LL驅動函數庫既可以在不使用HAL驅動庫下使用(獨立模式),也可以和HAL驅動庫一起使用(混合模式);

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

 

LL庫文件結構:

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

  •   stm32f0xx_ll_bus.h

庫核心配置文件(初始化函數包含在c文件中,所有其他的API包含在h文件中):

  •        stm32f0xx_ll_ppp.h/.c

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

  •        stm32xx_ll_cortex.h

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

  •        stm32xx_ll_xx_ll_utils.h/.c

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

  •        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程序中都要實現讀取和清除相關中斷標志所需的宏;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM