NVIC MCAL Module
Supported STM32 families: F4 · G4 · H5 · U5
Not supported: H7, L4
This repository provides the NVIC (Nested Vectored Interrupt Controller) MCAL module for STM32 microcontrollers.
The module is designed to be branch-specific, where each branch represents one STM32 family (e.g. L4, F4, U5).
Switching between branches allows developers to use the same interface across families.
Module Overview
The NVIC MCAL module provides an abstraction layer for configuring and handling interrupts on STM32 MCUs.
It exposes a unified API for all supported families to:
- Initialize / deinitialize NVIC configuration
- Register and manage interrupt handlers
- Configure priorities
- Control pending and active states
- Support both peripheral interrupts and core system interrupts
- Provide default handler management
Public API
Module Information
nvic_ModuleVersion_t Nvic_Get_ModuleVersion(void);
Initialization
void Nvic_Init(void);
void Nvic_Deinit(void);
void Nvic_Task(void);
Stack Pointer Access
uint32_t Nvic_Get_StackPointerAddr(void);
Default Handler
nvic_RequestState_t Nvic_Set_DefaultHandler(nvic_IsrCallback_t defaultHandler);
Peripheral IRQ Handling
nvic_RequestState_t Nvic_Set_PeriphIrq_Handler (nvic_PeriphIrqList_t irqId, const nvic_IsrCallback_t irqHandler);
nvic_RequestState_t Nvic_Get_PeriphIrq_Handler (nvic_PeriphIrqList_t irqId, nvic_IsrCallback_t *irqHandler);
nvic_RequestState_t Nvic_Set_PeriphIrq_Prio (nvic_PeriphIrqList_t irqId, nvic_IrqPrio_t irqPrio);
nvic_RequestState_t Nvic_Get_PeriphIrq_Prio (nvic_PeriphIrqList_t irqId, nvic_IrqPrio_t *irqPrio);
nvic_RequestState_t Nvic_Set_PeriphIrq_Active (nvic_PeriphIrqList_t irqId);
nvic_RequestState_t Nvic_Set_PeriphIrq_Inactive(nvic_PeriphIrqList_t irqId);
nvic_RequestState_t Nvic_Set_PeriphIrq_Pending (nvic_PeriphIrqList_t irqId, nvic_IrqFlag_t irqFlag);
nvic_RequestState_t Nvic_Get_PeriphIrq_Pending (nvic_PeriphIrqList_t irqId, nvic_IrqFlag_t *irqFlag);
Core IRQ Handling
nvic_RequestState_t Nvic_Set_CoreIrq_Handler(nvic_CoreIrqList_t irqId, const nvic_IsrCallback_t irqHandler);
nvic_RequestState_t Nvic_Get_CoreIrq_Handler(nvic_CoreIrqList_t irqId, nvic_IsrCallback_t *irqHandler);
nvic_RequestState_t Nvic_Set_CoreIrq_Prio (nvic_CoreIrqList_t irqId, nvic_IrqPrio_t irqPrio);
nvic_RequestState_t Nvic_Get_CoreIrq_Prio (nvic_CoreIrqList_t irqId, nvic_IrqPrio_t *irqPrio);
Branch Strategy
- Each branch corresponds to a specific STM32 family (e.g.
STM32L4,STM32F4,STM32U5). - The public API remains consistent across branches.
- Only the low-level implementation differs, ensuring portability of higher layers.
Usage Example
// Example: Setting up IRQ handler for a peripheral
Nvic_Set_PeriphIrq_Handler(UART1_IRQn, MyUartHandler);
Nvic_Set_PeriphIrq_Prio(UART1_IRQn, NVIC_PRIORITY_HIGH);
Nvic_Set_PeriphIrq_Active(UART1_IRQn);
🛠 CMake Integration
- Include
Nvic_Libin your CMake library. - Include
Nvic_Port.hin your project. - Link against the Nvic module implementation files.
- Configure the module as needed for your hardware.
License
This project is licensed under the Creative Commons Attribution–NonCommercial 4.0 International (CC BY-NC 4.0).
You are free to use, modify, and share this work for non-commercial purposes, provided appropriate credit is given.
See LICENSE.md for full terms or visit creativecommons.org/licenses/by-nc/4.0.
Authors
- Mr.Nobody — embedbits.com
Contributions are welcome! Please open a pull request.