低層(LL)驅動器旨在提供快速輕量級的專家導向層,它比硬件更接近硬件;編程
與HAL相反,LLAPI不適用於優化訪問不是關鍵功能的外設設備,或者須要大量軟件配置和/或複雜的高級堆棧(如USB)的外設;數據結構
LL驅動函數庫既能夠在不使用HAL驅動庫下使用(獨立模式),也能夠和HAL驅動庫一塊兒使用(混合模式);函數
LL是底層驅動庫,這些庫徹底反應硬件功能,而且LL不實現任何處理,不須要任何額外的存儲器資源來保存它們的狀態、計數器或數據指針,而是經過改變任何相關的外設寄存器內容來執行全部的操做;工具
用於核心總線控制和外設時鐘激活/停用的源文件:優化
庫核心配置文件(初始化函數包含在c文件中,全部其餘的API包含在h文件中):spa
CortexM相關寄存器操做API(包括Systick、低功耗模式):3d
通用API(獲取設備惟一ID/電子簽名、時基和延時管理系統、系統時鐘配置):指針
系統相關操做(SYSCFG、DBGMCU、FLASH):code
定義assert_param宏的模板文件,在啓用運行時檢查時使用:對象
僅當LL驅動程序以獨立模式使用(不調用HALAPI)時,才須要此文件;
應將其複製到應用程序文件夾並重命名爲stm32_assert.h;
能夠從LL驅動文件夾中看到其搭建庫文件須要包含的內容;
因爲LL庫是直接驅動底層寄存器來操做,所以和CMSIS驅動緊密聯繫,在使用LL庫時須要將相應器件的CMSIS驅動文件包含進去:
#include "stm32yyxx.h"
其和CMSIS文件的關係以下圖所示:
外設初始化功能:
LL驅動程序提供三組初始化函數,它們在stm32f0xx_ll_ppp.c文件中定義:
這些LL初始化函數和相關資源的定義由編譯器宏來決定:USE_FULL_LL_DRIVER或者在調用LL驅動庫前在頭文件添加此開關;
除此以外還有可選的額外附加功能:
運行時間檢測:
和HAL驅動庫同樣,LL初始化函數經過檢查LL庫函數中的輸入值來實現運行時故障檢測;在獨立模式下使用LL庫,在運行時檢查須要執行如下操做:
該檢查不適用LL庫的內聯函數(inline function);
外設寄存器配置:
除了外設初始化函數以外,LL庫還提供了一組直接用於原子寄存器(保證寄存器的讀寫在某個時間點發生,在該點以前執行將獲取寄存器的舊值,在該點以後執行將獲取寄存器的新值,後面的讀取不能返回舊值)的內聯函數(爲了解決函數調用時參數傳遞形成的時間開銷和形參佔用的內存空間,採用預編譯宏來定義簡單的函數,可是宏定義的本質是字符串替換所以在定義函數很容易形成調用結果的錯誤,而內聯函數就是爲了解決和替換宏而產生的,其本質是一個具備時間和內存優化的簡單函數,不能在內聯函數中包含循環、條件、選擇等複雜的結構);
__STATIC_INLINE return_type LL_PPP_Function (PPPx_TypeDef *PPPx, args)
根據操做內容定義功能名稱:
在中斷和狀態寄存器中有如下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傳輸方向或數據寄存器類型的變量;
對於相同的外設實例,它們不能一塊兒使用,若是對特定的實例使用LL API,則仍然能夠將HALAPI應用於其餘實例,低層LL庫可能會覆蓋某些在HAL句柄的內容;
能夠在不調用HAL庫的狀況下使用LL庫,只須要將應用程序中包含stm32f0xx_ll_ppp.h既能夠完成獨立使用LL庫的操做;經過參考手冊推薦的編程模型調用推薦的相同循序調用給定的LLAPI;LL庫應使用和HAL庫相同的處理方式,始終使用系統文件、啓動文件和CMSIS;
當包含BSP驅動文件的時候,與BSP功能驅動程序相關聯的HAL庫應包含在目錄下,即使它們未被應用程序使用;
低層API和HAL庫混合使用,能夠實現基於寄存器的直接操做;