Preskočiť na hlavný obsah

Prehľad MCAL

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

Štandardizované softvérové rozhranie k vnútorným perifériám STM32, vytvorené s dôrazom na modularitu, prenosnosť a testovateľnosť.


Prehľad​

Microcontroller Abstraction Layer (MCAL) sa nachádza priamo nad hardvérovými registrami a poskytuje čisté, jednotné API na prístup k vnútorným perifériám STM32. Softvérové komponenty vyšších vrstiev komunikujú s hardvérom prostredníctvom tejto vrstvy — bez akejkoľvek znalosti nízkoúrovňových detailov registrov.

MCAL je súčasťou BSP (Board Support Package) a na prístup na úrovni registrov využíva ovládače CMSIS a STM32 LL (Low-Layer).

Kľúčový cieľ návrhu: jedna periféria, jedno rozhranie. Napríklad ovládač I2C môže interne spravovať DMA bez toho, aby musel používateľ samostatne konfigurovať modul DMA — všetko spracovanie závislostí je zapuzdrené v samotnom ovládači.


Architektúra​

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

Podporované periférie​

PerifériaPopis
GPIOVstupno-výstupné piny všeobecného určenia
USART / UARTSériová komunikácia
SPISerial Peripheral Interface
I2CInter-Integrated Circuit (s voliteľným DMA)
TimersČasovače všeobecného určenia a pokročilé časovače
ADC / DACAnalógovo-digitálna / digitálno-analógová konverzia
NVIC / EXTIRadič prerušení a externé prerušenia
RCCRiadenie hodín a resetov
FlashPrístup k pamäti Flash
PWRNapájanie a systémová konfigurácia

Štruktúra repozitára​

Každá periféria má vlastný samostatný priečinok obsahujúci:

SúborÚčel
<Peripheral>.cImplementácia ovládača
<Peripheral>.hDeklarácie verejného API
<Peripheral>_Port.hKonfigurácia portu špecifická pre hardvér
<Peripheral>_Types.hDefinície typov a enumerácií
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ávislosťÚčel
CMSISZákladné rozhranie k procesoru ARM Cortex-M a systémovým perifériám
STM32 LL DriversĽahký prístup k registrom s nízkou réžiou, bez abstrakcie HAL

Obe sú súčasťou balíka STM32Cube Firmware Package a v BSP sú integrované pod vrstvou RAL.


Priebeh inicializácie​

Odporúčaná štartovacia postupnosť:

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

Túto postupnosť je možné vykonať ako súčasť štartu systému alebo ju aplikácia môže spustiť na požiadanie.


Návrhové zásady​

  • Všetok kód špecifický pre hardvér je zapuzdrený v MCAL — mimo tejto vrstvy sa k registrom nepristupuje
  • Jednotná konvencia pomenovania: <Module>_<Action> (napr. Gpio_Init, Usart_Send, Rcc_SetClock)
  • Tam, kde je kritický výkon, sa používajú makrá a inline funkcie
  • Žiadne pevne zakódované hodnoty registrov — všade sa používajú makrá CMSIS/LL
  • Každý ovládač periférie je samostatný a spravuje si vlastné vnútorné závislosti (napr. DMA)
  • Všetky verejné API sú zdokumentované

Príklad použitia​

Inicializácia 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šenia​

  • Framework na integračné testovanie
  • Pokrytie unit testami pre každý ovládač periférie
  • Podpora ďalších rodín STM32

Licencia​

Tento projekt je licencovaný pod licenciou Creative Commons Attribution–NonCommercial 4.0 International (CC BY-NC 4.0).

Toto dielo môžete slobodne používať, upravovať a zdieľať na nekomerčné účely, pokiaľ uvediete primeraný zdroj.

Úplné znenie podmienok nájdete v LICENSE.md alebo na creativecommons.org/licenses/by-nc/4.0.


Autori​

Príspevky sú vítané! Otvorte prosím pull request.


Podpora rodín​

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