У меня тоже было, включаемый содержит 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 )