@@ -23,14 +23,29 @@ class TimerRegister : public RegisterBase<TimReg, Reg> {
2323 using RegisterBase<TimReg, Reg>::operator =;
2424};
2525
26+
2627static_assert (sizeof (TimerRegister<Reg_CR1>) == sizeof (uint32_t ) );
2728
2829
2930class TIM_TypeDef {
3031public:
3132 TIM_TypeDef (void (* irq_handler)(void ),IRQn_Type irq_n):
32- callback{irq_handler},irq_n{irq_n}
33+ // PSC(*this), callback{irq_handler}, irq_n{irq_n}
34+ callback{irq_handler}, irq_n{irq_n}
3335 {}
36+
37+ // NOTE: This ruins the address offsets but I couldn't get it to work any other way
38+ template <TimReg Reg>
39+ struct PrescalerRegister : public RegisterBase <TimReg, Reg> {
40+ PrescalerRegister& operator =(uint32_t val) {
41+ this ->set (val);
42+ // esto es lo más feo que he hecho en mucho tiempo pero no he conseguido otra cosa
43+ TIM_TypeDef *parent = (TIM_TypeDef*)((uint8_t *)&this ->reg - offsetof (TIM_TypeDef, PSC ));
44+ parent->active_PSC = val;
45+ return *this ;
46+ }
47+ };
48+
3449 void generate_update ();
3550 TimerRegister<Reg_CR1> CR1 ; /* !< TIM control register 1, Address offset: 0x00 */
3651 TimerRegister<Reg_CR2> CR2 ; /* !< TIM control register 2, Address offset: 0x04 */
@@ -42,7 +57,7 @@ class TIM_TypeDef{
4257 TimerRegister<Reg_CCMR2> CCMR2 ; /* !< TIM capture/compare mode register 2, Address offset: 0x1C */
4358 TimerRegister<Reg_CCER> CCER ; /* !< TIM capture/compare enable register, Address offset: 0x20 */
4459 TimerRegister<Reg_CNT> CNT ; /* !< TIM counter register, Address offset: 0x24 */
45- TimerRegister <Reg_PSC> PSC ; /* !< TIM prescaler, Address offset: 0x28 */
60+ PrescalerRegister <Reg_PSC> PSC ; /* !< TIM prescaler, Address offset: 0x28 */
4661 TimerRegister<Reg_ARR> ARR ; /* !< TIM auto-reload register, Address offset: 0x2C */
4762 TimerRegister<Reg_RCR> RCR ; /* !< TIM repetition counter register, Address offset: 0x30 */
4863 TimerRegister<Reg_CCR1> CCR1 ; /* !< TIM capture/compare register 1, Address offset: 0x34 */
0 commit comments