STM32: Unterschied zwischen HAL_xxx_Init() und HAL_xxx_MspInit()

Bei Verwendung der HAL (Hardware Abstraction Library) für einen der STM32-Mikrocontroller:

Warum müssen Sie für ein bestimmtes Peripheriegerät sowohl ein HAL_... init() als auch ein HAL ..._MspInit() aufrufen - warum werden mehrere 'inits' getrennt?

Antworten (1)

Das ST-Benutzerhandbuch UM1725 - Beschreibung der STM32F4 HAL- und LL-Treiber , siehe Seiten 61 - 63, enthält eine Erklärung:

Die Peripherie-Initialisierung erfolgt durch HAL_PPP_Init() , während
die Hardware-Ressourcen-Initialisierung, die von einem Peripheriegerät ( PPP ) verwendet wird, während dieser Initialisierung durch Aufrufen der MSP- Callback-Funktion HAL_PPP_MspInit() durchgeführt wird .
Der MspInit- Rückruf führt die Low-Level-Initialisierung in Bezug auf die verschiedenen zusätzlichen Hardwareressourcen durch: RCC, GPIO, NVIC und DMA.

( MSP: M CU Support P ackage)

Und

2.12.2 Globale HAL-Initialisierung:

HAL_Init(): Diese Funktion muss beim Anwendungsstart aufgerufen werden, um
- den Daten-/Befehls-Cache und die Pre-Fetch-Warteschlange zu initialisieren
- den SysTick-Timer so einzustellen, dass er alle 1 ms (basierend auf dem HSI-Takt) einen Interrupt mit der niedrigsten Priorität generiert
- die Prioritätsgruppierung auf 4 setzt Preemption-Bits
- Rufen Sie die Benutzer-Callback-Funktion HAL_MspInit() auf, um Initialisierungen auf Systemebene durchzuführen (Uhr, GPIOs, DMA, Interrupts). HAL_MspInit() ist in den HAL-Treibern als „schwache“ leere Funktion definiert.