Overview of STM32L4 Low Layer (LL) library
When developing embedded applications on STM32 MCU with STM32Cube
, several tools and software libraries are provided. In addition to the CMSIS software layer
(for the Cortex M4 core), two types of software libraries are provided:
High Abstraction Layer (HAL) and Low Layer (LL). The purpose of this page is to give a brief overview of the LL library. While HAL offers high-level,
high-portability APIs, which hide the MCU and peripheral complexity, LL provides low-level APIs at register level. In spite of a lower portability, it ensures a better optimization which
is essential to optimize the energy consumption ! As LL library is close to the MCU register level, it require deep knowledge of the MCU and peripheral specifications. The reading of
the reference manual of the MCU is mandatory (
Reference manual of STM32L476
The STM32Cube MCU Package for STM32L4 series (STM32CubeL4) can be downloaded here
All the information about LL contents (functions, defines, macros) can be found in the User manual
"Description of STM32L4/L4+ HAL and low-layer drivers"
Organization of LL library
The low-layer drivers provide hardware services based on the available features of the STM32 peripherals. These services reflect exactly the hardware capabilities and provide one-shot operations.
All the operations are performed by changing the associated peripheral registers content. The LL drivers aim at:
- initializing peripheral main features according to the parameters specified in data structures
- initializing data structures with the reset values of each field
- performing peripheral de-initialization (peripheral registers restored to their default values)
- providing a set of inline functions for direct and atomic register access
The low-layer drivers are built around header and C files (one per each supported peripheral "ppp") plus five header files for some System and Cortex related features.
File name follows the nomenclature: stm32l4xx_ll_ppp.c/.h, where ppp is related to the peripheral. Details of the five header files are given in the following table:
|stm32l4xx_ll_bus.h||h-source file for core bus control and peripheral clock activation and deactivation|
|stm32l4xx_ll_cortex.h||Cortex-M related register operation APIs including the Systick, Low power (LL_SYSTICK_xxxxx,
LL_LPM_xxxxx "Low Power Mode" ...)|
|stm32l4xx_ll_utils.h/.c||generic APIs: Read of device unique ID and electronic signature, timebase and delay management,
system clock configuration.|
|stm32l4xx_ll_system.h||System related operations (e.g. LL_SYSCFG_xxx, LL_DBGMCU_xxx and LL_FLASH_xxx and LL_VREFBUF_xxx)|
|stm32_assert_template.h||This file is required only when the LL drivers are used in standalone mode (without calling the HAL
APIs). It should be copied to the application folder and renamed to stm32_assert.h.|
The files stm32l4xx_ll_ppp.c/.h offer a set of inline functions for direct atomic register access, with the format:
__STATIC_INLINE return_type LL_PPP_Function (PPPx_TypeDef *PPPx, args). The “Function” naming is defined depending to the action category:
- Specific Interrupt, DMA request and status flags management: Set/Get/Clear/Enable/Disable flags on interrupt and status registers
- Peripheral clock activation/deactivation management: Enable/Disable/Reset a peripheral clock
- Peripheral activation/deactivation management : Enable/disable a peripheral or activate/deactivate specific peripheral features
- Peripheral configuration management : Set/get a peripheral configuration settings
- Peripheral register management : Write/read the content of a register/return DMA relative register address
The main APIs for the Low Power software lab
The following table gives brief details about the most important driver files for the project. All the details about the provided functions and defines are given in
the mentioned chapter of the User Manual of LL library.
|Peripheral||Driver files||Brief decription|
|LL BUS Generic Driver||stm32l4xx_ll_bus.h (chapter 81)||Functions to enable/disable the different peripheral clock buses of the MCU (AHB, APB) according to the Run/low power mode.|
Example: LL_APB1_GRP1_EnableClock( LL_APB1_GRP1_PERIPH_PWR ): to enable the clock (APB1 clock bus) on the power control system (low power mode management, supervision, voltage scaling…)
|LL Cortex Driver||stm32l4xx_ll_cortex.h (Chapter 83)||Generic APIs that can be used, among others, to configure SYSTICK timer or low power modes (LPM).|
Example: LL_LPM_EnableSleep() : to activate sleep mode as low-power mode for the processor.
|LL GPIO Driver||stm32l4xx_ll_gpio.h/.c (chapter 91)||Functions to configure GPIOs (pin mode, output type, pull-up/down, alternate function…), set and reset output pin or port.|
Example: __STATIC_INLINE void LL_GPIO_SetPinMode (GPIO_TypeDef * GPIOx, uint32_t Pin, uint32_t Mode): to set the mode of a GPIO pin of a dedicated port.
Example: __STATIC_INLINE void LL_GPIO_SetOutputPin (GPIO_TypeDef * GPIOx, uint32_t PinMask): set GPIO pin to ‘1’.
|LL Power Generic Driver||stm32l4xx_ll_pwr.h/.c (chapter 98)||Configuration of the power control module, especially the run and low-power modes, the regulator voltage
scaling and the power of backup domain.|
Example: __STATIC_INLINE void LL_PWR_SetPowerMode (uint32_t LowPowerMode): to set the low power mode (STOP0/1/2, STANDBY, SHUTDOWN). It does not force the entry in low power mode !
|LL RCC (Reset and Clock Control) Generic Driver||stm32l4xx_ll_rcc.h/.c (chapter 99)||Configuration of reset and clock control module: activate/configure
oscillators, PLL, set clock sources of peripheral clocks, prescalers of clock buses, MSI calibration, enable/disable RTC, backup domain reset…|
Example: __STATIC_INLINE void LL_RCC_SetSysClkSource (uint32_t Source): configure the system clock source.
Example: __STATIC_INLINE void LL_RCC_MSI_SetRange (uint32_t Range): set the frequency range of the MSI oscillator.
|LL RTC Generic Driver||stm32l4xx_ll_rtc.h/.c (chapter 101)||Configuration of the RTC: initialization mode, enable/disable write protection,
set prescaler, wakeup configuration, date, hour and alarm configuration.|
Example: __STATIC_INLINE void LL_RTC_EnableInitMode (RTC_TypeDef * RTCx): Enable initialization mode of RTC, to configure prescaler, date and hour.