Přehled MCAL
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
| Periferie | Popis |
|---|---|
| GPIO | Univerzální vstupy/výstupy |
| USART / UART | Sériová komunikace |
| SPI | Serial Peripheral Interface |
| I2C | Inter-Integrated Circuit (s volitelným DMA) |
| Časovače | Univerzální a pokročilé časovače |
| ADC / DAC | Analogově-digitální / digitálně-analogový převod |
| NVIC / EXTI | Řadič přerušení a externí přerušení |
| RCC | Řízení hodin a resetu |
| Flash | Přístup k paměti Flash |
| PWR | Napájení a systémová konfigurace |
Struktura repozitáře
Každá periferie má vlastní vyhrazenou složku obsahující:
| Soubor | Účel |
|---|---|
<Peripheral>.c | Implementace ovladače |
<Peripheral>.h | Deklarace veřejného API |
<Peripheral>_Port.h | Konfigurace portu specifická pro hardware |
<Peripheral>_Types.h | Definice 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 |
|---|---|
| CMSIS | Základní rozhraní k procesoru ARM Cortex-M a systémovým periferiím |
| Ovladače STM32 LL | Lehký 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
- Mr.Nobody — embedbits.com
Příspěvky jsou vítány! Otevřete prosím pull request.
Podpora rodin
| G4 | H5 | U5 | |
|---|---|---|---|
| Core | ✅ | — | ✅ |
| RCC | ✅ | ✅ | ✅ |
| GPIO | ✅ | ✅ | ✅ |
| EXTI | ✅ | ✅ | ✅ |
| NVIC | ✅ | ✅ | ✅ |
| TIM | ✅ | — | ✅ |
| USART | ✅ | ✅ | ✅ |
| I2C | — | ✅ | — |
| ADC | — | ✅ | — |
| CRC | — | — | ✅ |
| RNG | — | — | ✅ |
| IWDG | — | ✅ | — |
| DMA | ✅ | — | — |
| GPDMA | — | ✅ | ✅ |