Přeskočit na hlavní obsah

Přehled MCAL

Podporované rodiny STM32: G4 · H5 · H7 · L4 · U5

Standardizované softwarové rozhraní k vnitřním periferiím STM32, vytvořené pro modularitu, přenositelnost a testovatelnost.


Přehled​

Microcontroller Abstraction Layer (MCAL) leží přímo nad hardwarovými registry a poskytuje čisté, jednotné API pro přístup k vnitřním periferiím STM32. Softwarové komponenty vyšší úrovně komunikují s hardwarem prostřednictvím této vrstvy — bez jakékoli znalosti nízkoúrovňových detailů registrů.

MCAL je součástí BSP (Board Support Package) a pro přístup na úrovni registrů využívá CMSIS a ovladače STM32 LL (Low-Layer).

Klíčový návrhový cíl: jedna periferie, jedno rozhraní. Například ovladač I2C může interně spravovat DMA, aniž by uživatel musel modul DMA konfigurovat zvlášť — veškerá obsluha závislostí je zapouzdřena přímo v ovladači.


Architektura​

┌─────────────────────────────────────┐
│ Application Layer │
├─────────────────────────────────────┤
│ MCAL │
│ (Gpio, Usart, Rcc, I2C, SPI, ...) │
├─────────────────────────────────────┤
│ RAL — Register Abstraction Layer │
│ (CMSIS + STM32 LL Drivers) │
├─────────────────────────────────────┤
│ STM32 Hardware │
└─────────────────────────────────────┘

Podporované periferie​

PeriferiePopis
GPIOUniverzální vstupy/výstupy
USART / UARTSériová komunikace
SPISerial Peripheral Interface
I2CInter-Integrated Circuit (s volitelným DMA)
ČasovačeUniverzální a pokročilé časovače
ADC / DACAnalogově-digitální / digitálně-analogový převod
NVIC / EXTIŘadič přerušení a externí přerušení
RCCŘízení hodin a resetu
FlashPřístup k paměti Flash
PWRNapájení a systémová konfigurace

Struktura repozitáře​

Každá periferie má vlastní vyhrazenou složku obsahující:

SouborÚčel
<Peripheral>.cImplementace ovladače
<Peripheral>.hDeklarace veřejného API
<Peripheral>_Port.hKonfigurace portu specifická pro hardware
<Peripheral>_Types.hDefinice typů a výčtů
Mcal/
├── Gpio/
│ ├── Gpio.c
│ ├── Gpio.h
│ ├── Gpio_Port.h
│ └── Gpio_Types.h
├── Usart/
│ ├── Usart.c
│ ├── Usart.h
│ ├── Usart_Port.h
│ └── Usart_Types.h
├── Rcc/
│ ├── Rcc.c
│ ├── Rcc.h
│ ├── Rcc_Port.h
│ └── Rcc_Types.h
├── I2c/
├── Spi/
├── Adc/
└── ...

Závislosti​

ZávislostÚčel
CMSISZákladní rozhraní k procesoru ARM Cortex-M a systémovým periferiím
Ovladače STM32 LLLehký přístup k registrům s nízkou režií, bez abstrakce HAL

Obojí je převzato z balíčku STM32Cube Firmware Package a integrováno v BSP pod vrstvou RAL.


Průběh inicializace​

Doporučená startovací sekvence:

1. NVIC — Interrupt controller setup
2. RCC — System clock and voltage configuration
3. GPIO — Pin multiplexing and output configuration
4. USART / SPI / I2C / ... — Peripheral initialization
5. DMA / Timers / SysTick — Optional, as needed

Tuto sekvenci lze provést jako součást startu systému, nebo ji aplikace může spustit na vyžádání.


Návrhové zásady​

  • Veškerý kód specifický pro hardware je zapouzdřen v MCAL — mimo tuto vrstvu se k registrům nepřistupuje
  • Jednotná konvence pojmenování: <Module>_<Action> (např. Gpio_Init, Usart_Send, Rcc_SetClock)
  • Tam, kde je kritický výkon, se používají makra a inline funkce
  • Žádné napevno zadané hodnoty registrů — všude se používají makra CMSIS/LL
  • Každý ovladač periferie je soběstačný a spravuje si vlastní interní závislosti (např. DMA)
  • Všechna veřejná API jsou zdokumentována

Příklad použití​

Inicializace GPIO​

static gpioHal_PinConfig_t gpioHal_GpioConfiguration[GPIOHAL_IO_CNT] =
{
{
.GpioId = GPIOHAL_IO_USR_BTN,
.ConfigStruct = {
.PortId = GPIO_PORT_C,
.PinId = GPIO_PIN_13,
.PinMode = GPIO_PIN_MODE_INPUT,
.PinPull = GPIO_PIN_PULL_NONE,
.PinSpeed = GPIO_PIN_SPEED_LOW,
.PinOutType = GPIO_PIN_OUTPUT_PUSHPULL,
.PinAltFunction = GPIO_ALT_FUNC_CNT,
.PinActiveLevel = GPIO_PIN_LEVEL_HIGH
}
}
};

void GpioHal_Init(void)
{
for (uint16_t i = 0u; i < GPIOHAL_IO_CNT; i++)
{
Gpio_Init(&gpioHal_GpioConfiguration[i].ConfigStruct);
}
}

Plánovaná vylepšení​

  • Framework pro integrační testování
  • Pokrytí unit testy pro každý ovladač periferie
  • Podpora dalších rodin STM32

Licence​

Tento projekt je licencován pod licencí Creative Commons Uveďte původ–Neužívejte komerčně 4.0 Mezinárodní (CC BY-NC 4.0).

Toto dílo můžete volně používat, upravovat a sdílet pro nekomerční účely za předpokladu, že uvedete odpovídající autorství.

Úplné podmínky najdete v LICENSE.md nebo navštivte creativecommons.org/licenses/by-nc/4.0.


Autoři​

Příspěvky jsou vítány! Otevřete prosím pull request.


Podpora rodin​

G4H5U5
Core✅—✅
RCC✅✅✅
GPIO✅✅✅
EXTI✅✅✅
NVIC✅✅✅
TIM✅—✅
USART✅✅✅
I2C—✅—
ADC—✅—
CRC——✅
RNG——✅
IWDG—✅—
DMA✅——
GPDMA—✅✅