Skip to main content
victagayun
Senior III
January 13, 2021
Solved

HRTIM-E1 Interrupt not firing

  • January 13, 2021
  • 1 reply
  • 1889 views

HRTIMe1 Interrupt needs HRTIM-MASTER Interrupt to fire?

I saw similar issue in GitHub but it pertains to Source of fault.

Anyway, I am using STM32G4 V1.3 on STMcubeIDE V1.5.1 on win10 machines (2 PCs)

It seems that HRTIM-E1 will not fire up the interrupt unless I enable HRTIM-MASTER and its interrupt via CubeMX.

Here is the setup of HRTIM-E1:

in main()

HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TE1 );
HAL_HRTIM_WaveformCountStart_IT(&hhrtim1, HRTIM_TIMERID_TIMER_E );

in MX_HRTIM1_Init()

static void MX_HRTIM1_Init(void)
{
 
 /* USER CODE BEGIN HRTIM1_Init 0 */
 
 /* USER CODE END HRTIM1_Init 0 */
 
 HRTIM_TimeBaseCfgTypeDef pTimeBaseCfg = {0};
 HRTIM_TimerCfgTypeDef pTimerCfg = {0};
 HRTIM_CompareCfgTypeDef pCompareCfg = {0};
 HRTIM_TimerCtlTypeDef pTimerCtl = {0};
 HRTIM_OutputCfgTypeDef pOutputCfg = {0};
 
 /* USER CODE BEGIN HRTIM1_Init 1 */
 
 /* USER CODE END HRTIM1_Init 1 */
 hhrtim1.Instance = HRTIM1;
 hhrtim1.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
 hhrtim1.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;
 if (HAL_HRTIM_Init(&hhrtim1) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_DLLCalibrationStart(&hhrtim1, HRTIM_CALIBRATIONRATE_3) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_PollForDLLCalibration(&hhrtim1, 10) != HAL_OK)
 {
 Error_Handler();
 }
 pTimeBaseCfg.Period = 27200;
 pTimeBaseCfg.RepetitionCounter = 0x00;
 pTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL8;
 pTimeBaseCfg.Mode = HRTIM_MODE_CONTINUOUS;
 if (HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, &pTimeBaseCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pTimerCfg.InterruptRequests = HRTIM_MASTER_IT_MREP;
 pTimerCfg.DMARequests = HRTIM_MASTER_DMA_NONE;
 pTimerCfg.DMASrcAddress = 0x0000;
 pTimerCfg.DMADstAddress = 0x0000;
 pTimerCfg.DMASize = 0x1;
 pTimerCfg.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
 pTimerCfg.InterleavedMode = HRTIM_INTERLEAVED_MODE_DISABLED;
 pTimerCfg.StartOnSync = HRTIM_SYNCSTART_DISABLED;
 pTimerCfg.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
 pTimerCfg.DACSynchro = HRTIM_DACSYNC_NONE;
 pTimerCfg.PreloadEnable = HRTIM_PRELOAD_DISABLED;
 pTimerCfg.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
 pTimerCfg.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
 pTimerCfg.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;
 pTimerCfg.ReSyncUpdate = HRTIM_TIMERESYNC_UPDATE_UNCONDITIONAL;
 if (HAL_HRTIM_WaveformTimerConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, &pTimerCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pCompareCfg.CompareValue = 5000;
 if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_1, &pCompareCfg) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_E, &pTimeBaseCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pTimerCtl.UpDownMode = HRTIM_TIMERUPDOWNMODE_UP;
 pTimerCtl.GreaterCMP1 = HRTIM_TIMERGTCMP1_EQUAL;
 pTimerCtl.DualChannelDacEnable = HRTIM_TIMER_DCDE_DISABLED;
 if (HAL_HRTIM_WaveformTimerControl(&hhrtim1, HRTIM_TIMERINDEX_TIMER_E, &pTimerCtl) != HAL_OK)
 {
 Error_Handler();
 }
 pTimerCfg.InterruptRequests = HRTIM_MASTER_IT_MREP;
 pTimerCfg.DMARequests = HRTIM_TIM_DMA_NONE;
 pTimerCfg.DMASrcAddress = 0x0000;
 pTimerCfg.DMADstAddress = 0x0000;
 pTimerCfg.DMASize = 0x1;
 pTimerCfg.RepetitionUpdate = HRTIM_UPDATEONREPETITION_DISABLED;
 pTimerCfg.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;
 pTimerCfg.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;
 pTimerCfg.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;
 pTimerCfg.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED;
 pTimerCfg.DelayedProtectionMode = HRTIM_TIMER_D_E_DELAYEDPROTECTION_DISABLED;
 pTimerCfg.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_NONE;
 pTimerCfg.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;
 pTimerCfg.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
 if (HAL_HRTIM_WaveformTimerConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_E, &pTimerCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pCompareCfg.CompareValue = 10000;
 if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_E, HRTIM_COMPAREUNIT_1, &pCompareCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
 pOutputCfg.SetSource = HRTIM_OUTPUTSET_TIMPER;
 pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;
 pOutputCfg.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
 pOutputCfg.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
 pOutputCfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
 pOutputCfg.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
 pOutputCfg.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
 if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_E, HRTIM_OUTPUT_TE1, &pOutputCfg) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN HRTIM1_Init 2 */
 
 /* USER CODE END HRTIM1_Init 2 */
 HAL_HRTIM_MspPostInit(&hhrtim1);
 
}

in CubeMX

0693W000007B3DhQAK.png 

Period to set the IO and COMP1 to reset it

I have the output, but it will not enter the interrupt.

0693W000007B3E1QAK.png 

I use another I/O to check whether it entered or not.

void HRTIM1_TIME_IRQHandler(void)
{
 /* USER CODE BEGIN HRTIM1_TIME_IRQn 0 */
 
	GPIOC->BSRR = (1<<11); // start
 
 /* USER CODE END HRTIM1_TIME_IRQn 0 */
 HAL_HRTIM_IRQHandler(&hhrtim1,HRTIM_TIMERINDEX_TIMER_E);
 /* USER CODE BEGIN HRTIM1_TIME_IRQn 1 */
 
 GPIOC->BSRR = (1<<(11+16)); // end
 
 /* USER CODE END HRTIM1_TIME_IRQn 1 */
}

If I enable MASTER HRTIM but disable NVIC call handler

void HAL_HRTIM_MspInit(HRTIM_HandleTypeDef* hhrtim)
{
 if(hhrtim->Instance==HRTIM1)
 {
 /* USER CODE BEGIN HRTIM1_MspInit 0 */
 
 /* USER CODE END HRTIM1_MspInit 0 */
 /* Peripheral clock enable */
 __HAL_RCC_HRTIM1_CLK_ENABLE();
 /* HRTIM1 interrupt Init */
 HAL_NVIC_SetPriority(HRTIM1_TIME_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(HRTIM1_TIME_IRQn);
 /* USER CODE BEGIN HRTIM1_MspInit 1 */
 
 /* USER CODE END HRTIM1_MspInit 1 */
 }
 
}

0693W000007B3MFQA0.png 

The interrupt would fire up as shown below.

CH1 yellow = HRTIM-E1

CH2 green = PC11

0693W000007B3PnQAK.jpg 

What's more troubling is that the postion of the interrupt would depent on the HRTIM MASTER interrupt source.

In this case, CMP1 and repetition will fire up HRTIM-E1 (but not "timer update").

Also CMP1 of HRTIM-E1 will be used in case CMP1 as the source for HRTIM-MASTER.

0693W000007B3RoQAK.png 

0693W000007B3SwQAK.png

This topic has been closed for replies.

1 reply

Associate III
February 6, 2024

Would you mind posting the answer? The link you posted doesn't work. All I get is this:

TechGuyMike_0-1707255256590.png