embedded stm32 hal
via PatrickJS/awesome-cursorrules
Embedded C/C++ patterns for STM32 HAL, interrupts, DMA, and memory-constrained MCU development.
What is embedded stm32 hal?
Guides safe, efficient firmware development on STM32 microcontrollers using the HAL abstraction layer. Covers peripheral initialization, interrupt handling, DMA configuration, memory constraints, and testing strategies for embedded systems where timing, resource limits, and hardware interaction are critical.
- Enforce separation of generated vendor code, drivers, and application logic with hardware abstraction layers
- Establish safe patterns for interrupt handlers, DMA operations, and shared data protection in concurrent contexts
- Require HAL error checking, timeout handling, and avoidance of blocking calls in time-critical paths
- Mandate fixed-width types, const lookup tables in flash, and explicit avoidance of heap allocation in firmware
- Provide testing and debugging strategies including host-based unit tests, hardware-in-the-loop validation, and fault handler instrumentation
Applies to
File patterns this rule matches.
Rule definition (reference)
Source of truth, from the repository.
Embedded MCU, STM32, and HAL Rules
Project Structure
- Keep board support, drivers, middleware, application logic, and tests separate.
- Isolate generated CubeMX or vendor code from hand-written application code.
- Put hardware abstraction behind narrow interfaces so logic can be tested without hardware.
- Document clock tree, pin mappings, peripheral ownership, and interrupt priorities.
STM32 HAL and Peripherals
- Initialize peripherals in one place and avoid hidden reconfiguration.
- Check return values from HAL calls and handle timeout/error cases.
- Keep blocking HAL calls out of time-critical paths.
- Use DMA for high-throughput UART, SPI, I2C, ADC, or timer capture paths when appropriate.
- Document buffer ownership and lifetime for DMA operations.
- Use
volatileonly for memory shared with ISRs or hardware registers.
Interrupts and Concurrency
- Keep ISRs short and deterministic.
- Defer heavy work from interrupts to the main loop, RTOS task, or event queue.
- Protect shared data with critical sections, atomics, queues, or RTOS primitives.
- Avoid dynamic allocation in interrupts.
- Make interrupt priority decisions explicit.
Memory and Timing
- Avoid heap allocation in firmware unless the project explicitly allows it.
- Check stack usage for ISRs and RTOS tasks.
- Keep lookup tables
constso they can live in flash. - Use fixed-width integer types for hardware-facing code.
- Add timeouts for hardware waits.
- Treat watchdog configuration as part of application design, not a late add-on.
Testing and Debugging
- Unit test pure logic on host builds.
- Use hardware-in-the-loop tests for peripheral behavior.
- Add assertions for impossible hardware states in debug builds.
- Use SWD/JTAG, logic analyzers, and serial logs with rate limits.
- Keep fault handlers useful: capture reset reason, fault registers, and build version when possible.
Common Mistakes
- Do not modify generated files unless the workflow preserves changes.
- Do not busy-wait forever on hardware flags.
- Do not share buffers between DMA and CPU without synchronization.
- Do not assume peripheral reset state after low-power modes.
Related rules
Senior full-stack TypeScript, React, Node.js guidance with clean architecture, testing, and WHY-oriented reasoning.
Quantitative factor research skills for designing, evaluating, and mining alpha factors in equities markets.
Android development with Jetpack Compose, clean architecture, and Material Design 3.
Angular development with Novo Elements UI library using standalone components.
Expert Angular 18 + TypeScript development with Jest, emphasizing clean code and performance.
Manage Kubernetes clusters, add-ons, stacks, and credentials via the Ankra CLI platform.