STM32 (LL)
Work with STM32 closer to the metal using LL (Low-Layer) drivers. Implement GPIO, timers, USART, ADC, and PWM by handling what HAL hides, and compare against the HAL version to see the real cost of abstraction.
Projects
Control GPIO directly with LL drivers
~100 minSign in & startControl GPIO with register-level functions like LL_GPIO_SetOutputPin, closer to the metal than HAL. Compare real HAL and LL code side by side to see what the abstraction layer actually hides.
Handle interrupts with LL timers
~110 minSign in & startConfigure timer interrupts directly with LL_TIM functions and NVIC settings. Handle the interrupt vector wiring and priority setup that HAL used to do automatically.
Implement USART communication with LL
~110 minSign in & startImplement communication by checking register flags directly with LL_USART_TransmitData8/IsActiveFlag_RXNE. Build the instinct for controlling polling/interrupt flow yourself, without HAL's callback structure.
Work with LL ADC conversions
~100 minSign in & startRead analog values by directly polling LL_ADC_REG_StartConversion and the conversion-complete flag. Actually compare how much latency drops versus HAL.
Control a motor with LL PWM output
~120 minSign in & startControl a motor by writing duty cycle straight to a register with LL_TIM_OC_SetCompareCH1. Combine GPIO, timers, and ADC into the LL version of the 'control motor speed with a potentiometer' capstone.