/** * @brief HRTIM minimal configuration to have snippets running * HRTIM is clocked and DLL is started * @param None * @retval None */ static void HRTIM_Minimal_Config(void) { /* Use the PLLx2 clock for HRTIM */ __HAL_RCC_HRTIM1_CONFIG(RCC_HRTIM1CLK_PLLCLK); /* Enable HRTIM clock*/ __HAL_RCC_HRTIM1_CLK_ENABLE(); /* DLL calibration: periodic calibration enabled, period set to 14µs */ HRTIM1->sCommonRegs.DLLCR = HRTIM_CALIBRATIONRATE_14| HRTIM_DLLCR_CALEN; /* Check DLL end of calibration flag */ while((HRTIM1->sCommonRegs.ISR & HRTIM_IT_DLLRDY) == RESET); }
/** * @brief HRTIM configuration at register level (no HAL call) * @param None * @retval None */ static void HRTIM_Config_NoHAL(void) { GPIO_InitTypeDef GPIO_InitStruct; /* --------------------------*/ /* HRTIM Input and NVIC init */ /* --------------------------*/ __GPIOA_CLK_ENABLE(); /* Configure HRTIM input: FAULT1 (PA12) */ GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP;; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;; GPIO_InitStruct.Alternate = GPIO_AF13_HRTIM1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* Configure and enable HRTIM TIMERA interrupt channel in NVIC */ HAL_NVIC_SetPriority(HRTIM1_TIMA_IRQn, 0, 0); HAL_NVIC_EnableIRQ(HRTIM1_TIMA_IRQn); /* --------------------------*/ /* HRTIM Clock and DLL init */ /* --------------------------*/ /* Use the PLLx2 clock for HRTIM */ __HAL_RCC_HRTIM1_CONFIG(RCC_HRTIM1CLK_PLLCLK); /* Enable HRTIM clock*/ __HRTIM1_CLK_ENABLE(); /* DLL calibration: periodic calibration enabled, period set to 14µs */ HRTIM1->sCommonRegs.DLLCR = HRTIM_CALIBRATIONRATE_14| HRTIM_DLLCR_CALEN; /* Check DLL end of calibration flag */ while(HRTIM1->sCommonRegs.ISR & HRTIM_IT_DLLRDY == RESET); /* -------------------------------------------------------- */ /* TIMERA initialization: PWM frequency and Repetition rate */ /* Continuous mode, preload enabled on REP event */ /* -------------------------------------------------------- */ HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].PERxR = BUCK_PWM_PERIOD; /* 400kHz switching frequency */ HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].REPxR = 127; /* 1 ISR every 128 PWM periods */ HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].TIMxCR = HRTIM_TIMCR_CONT + HRTIM_TIMCR_PREEN + HRTIM_TIMCR_TREPU; /* Enable REP interrupts */ HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].TIMxDIER = HRTIM_TIMDIER_REPIE; /* --------------------------------------------------------------- */ /* TA1 and TA2 waveforms description: Set on period, reset on CMP1 */ /* deadtime enabled, fault1 selected, disabling both outputs */ /* --------------------------------------------------------------- */ HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].SETx1R = HRTIM_SET1R_PER; HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].RSTx1R = HRTIM_RST1R_CMP1; HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].OUTxR = HRTIM_OUTR_DTEN + HRTIM_OUTR_FAULT1_1 + HRTIM_OUTR_FAULT2_1; HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].FLTxR = HRTIM_FLTR_FLT1EN; /* Set compare registers for duty cycle on TA1 */ HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].CMP1xR = BUCK_PWM_PERIOD/20; /* 5% duty cycle */ /* Set deadtime values and lock deadtime signs */ HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].DTxR = HRTIM_DTR_DTFSLK + (DT_FALLING<<16) + HRTIM_DTR_DTRSLK + DT_RISING; /* ------------------------------------------- */ /* ADC trigger intialization (with CMP2 event) */ /* ------------------------------------------- */ HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].CMP2xR = BUCK_PWM_PERIOD/10; /* Samples in middle of ON time */ HRTIM1->sCommonRegs.CR1 = HRTIM_CR1_ADC2USRC_0; /* ADC trigger update: TimerA */ HRTIM1->sCommonRegs.ADC2R = HRTIM_ADC2R_AD2TAC2; /* ADC trigger event: Timer A compare 2*/ /* ---------------------------------------------------------- */ /* FAULT1 global init: no filter, low polarity, Fault1 enable */ /* ---------------------------------------------------------- */ HRTIM1->sCommonRegs.FLTINR1 = HRTIM_FLTINR1_FLT1E; /* ---------------*/ /* HRTIM start-up */ /* ---------------*/ /* Force register update before starting (optional) */ HRTIM1->sCommonRegs.CR2 |= HRTIM_CR2_TASWU; /* Enable HRTIM's outputs TA1 and TA2 */ /* Note: it is necessary to enable also GPIOs to have outputs functional */ /* This must be done after HRTIM initialization */ HRTIM1->sCommonRegs.OENR = HRTIM_OENR_TA1OEN + HRTIM_OENR_TA2OEN; /* Start HRTIM's TIMER A */ HRTIM1->sMasterRegs.MCR = HRTIM_MCR_TACEN; }