Покопался в кишках CubeMX, теперь могу генерировать шаблон для
конфигурации pll stm-ок, а заодно проверять параметры в
compile-time. Всю работу выполняет питонячий скрипт, его ещё нужно
доработать, но результат примерно следующий: [name: kHsiFrequencyHz, type: fixed_src, signal: HSI, input: None, output: ['SysClkSource', 'PLLSource', 'MCO1Mult', 'FMPI2C1Mult', 'LPTIM1Mult']]
[name: kHseFrequencyHz, type: varied_src, signal: HSE, input: None, output: ['SysClkSource', 'HSERTCDevisor', 'PLLSource', 'MCO1Mult', 'MCO2Mult']]
[name: kLsiFrequencyHz, type: fixed_src, signal: LSI, input: None, output: ['IWDGOutput', 'RTCClkSource', 'LPTIM1Mult']]
[name: kLseFrequencyHz, type: varied_src, signal: LSE, input: None, output: ['RTCClkSource', 'MCO1Mult', 'LPTIM1Mult']]
[name: kRtcClkSource, type: mux, signal: RTCCLK, input: ['HSERTCDevisor', 'LSEOSC', 'LSIRC'], output: ['RTCOutput']]
[name: kRtcClkHz, type: out, signal: None, input: ['RTCClkSource'], output: None]
[name: kIwdgClkHz, type: out, signal: None, input: ['LSIRC'], output: None]
Как видно из выхлопа скрипта, я строю дерево, по которому, двигаясь от вершины, генерируется код.