Prehľad MCAL
Š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éria | Popis |
|---|---|
| GPIO | Vstupno-výstupné piny všeobecného určenia |
| USART / UART | Sériová komunikácia |
| SPI | Serial Peripheral Interface |
| I2C | Inter-Integrated Circuit (s voliteľným DMA) |
| Timers | Časovače všeobecného určenia a pokročilé časovače |
| ADC / DAC | Analógovo-digitálna / digitálno-analógová konverzia |
| NVIC / EXTI | Radič prerušení a externé prerušenia |
| RCC | Riadenie hodín a resetov |
| Flash | Prístup k pamäti Flash |
| PWR | Napá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>.c | Implementácia ovládača |
<Peripheral>.h | Deklarácie verejného API |
<Peripheral>_Port.h | Konfigurácia portu špecifická pre hardvér |
<Peripheral>_Types.h | Definí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 |
|---|---|
| CMSIS | Zá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
- Mr.Nobody — embedbits.com
Príspevky sú vítané! Otvorte prosím pull request.
Podpora rodín
| G4 | H5 | U5 | |
|---|---|---|---|
| Core | ✅ | — | ✅ |
| RCC | ✅ | ✅ | ✅ |
| GPIO | ✅ | ✅ | ✅ |
| EXTI | ✅ | ✅ | ✅ |
| NVIC | ✅ | ✅ | ✅ |
| TIM | ✅ | — | ✅ |
| USART | ✅ | ✅ | ✅ |
| I2C | — | ✅ | — |
| ADC | — | ✅ | — |
| CRC | — | — | ✅ |
| RNG | — | — | ✅ |
| IWDG | — | ✅ | — |
| DMA | ✅ | — | — |
| GPDMA | — | ✅ | ✅ |