У меня тоже было, включаемый содержит static const struct и выбор
макросом флага прерывания, тактирования, и номера прерывания. Нечто
вроде недавно расспрашиваемого мной механизма consteval
// Timers helper struct tmr_x_str { /* Timer descriptor structure. */ TMR_TypeDef* Timer; IRQn_Type IRQn; uint32_t tim_clock; uint32_t tmr_isr_mask; }; // Timers list static const struct tmr_x_str timers[5] = { { TMR0, TMR0_IRQn, (1<<(0+8)), (1<<0)}, { TMR1, TMR1_IRQn, (1<<(1+8)), (1<<1)}, { TMR2, TMR2_IRQn, (1<<(2+8)), (1<<2)}, { TMR3, TMR3_IRQn, (1<<(3+8)), (1<<3)}, { TMR4, TMR4_IRQn, (1<<(4+8)), (1<<4)}, }; // Selector IRQ number #define Tim_Irq(T) (\ (T == TMR0) ? timers[0].IRQn :\ (T == TMR1) ? timers[1].IRQn :\ (T == TMR2) ? timers[2].IRQn :\ (T == TMR3) ? timers[3].IRQn :\ timers[4].IRQn ) // Selector PCLKEN0 bit #define Tim_ClockEn(T) (\ (T == TMR0) ? timers[0].tim_clock :\ (T == TMR1) ? timers[1].tim_clock :\ (T == TMR2) ? timers[2].tim_clock :\ (T == TMR3) ? timers[3].tim_clock :\ timers[4].tim_clock ) // Selector TMR_ISR mask #define Tim_MaskISR(T) (\ (T == TMR0) ? timers[0].tmr_isr_mask :\ (T == TMR1) ? timers[1].tmr_isr_mask :\ (T == TMR2) ? timers[2].tmr_isr_mask :\ (T == TMR3) ? timers[3].tmr_isr_mask :\ timers[4].tmr_isr_mask )