Skip to main content
DKuro.1
Associate III
April 23, 2020
Question

Fault input for HRTIM is configured as output?

  • April 23, 2020
  • 2 replies
  • 978 views

Hi, I am working with the HRTIM in the STM32G474 Nucleo and trying to configure the fault input to reset the outputs.

When I see in the GPIO config of the HRTIM in the STM32CubeIDE I see that the fault input pin HRTIM_FLT1 is configured as Alternate Function Push Pull and if I use a 220 ohm resistor (to prevent a short circuit) in the HRTIM_FLT1 pin and also measure the input, it still 0V. It seems that the input is... not an input :\

Also in the attached code I see that pTimerCfg.FaultEnable = HRTIM_TIMFAULTENABLE_NONE, and I think it should be HRTIM_TIMFAULTENABLE_FAULT1, it is right?

Also in the registers I can see that FLTxR = 0 and it should be 1:

Bit 0 FLT1EN: Fault 1 enable

0: Fault 1 input ignored

1: Fault 1 input is active and disables HRTIM outputs

What I am doing wrong?

The HRTIM initialization code is attached

This topic has been closed for replies.

2 replies

DKuro.1
DKuro.1Author
Associate III
April 23, 2020
/**
 * @brief HRTIM1 Initialization Function
 * @param None
 * @retval None
 */
static void MX_HRTIM1_Init(void)
{
 
 /* USER CODE BEGIN HRTIM1_Init 0 */
 /* USER CODE END HRTIM1_Init 0 */
 
 HRTIM_FaultCfgTypeDef pFaultCfg = {0};
 HRTIM_FaultBlankingCfgTypeDef pFaultBlkCfg = {0};
 HRTIM_TimeBaseCfgTypeDef pTimeBaseCfg = {0};
 HRTIM_TimerCfgTypeDef pTimerCfg = {0};
 HRTIM_CompareCfgTypeDef pCompareCfg = {0};
 HRTIM_TimerCtlTypeDef pTimerCtl = {0};
 HRTIM_DeadTimeCfgTypeDef pDeadTimeCfg = {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_FLT1;
 hhrtim1.Init.SyncOptions = HRTIM_SYNCOPTION_MASTER;
 hhrtim1.Init.SyncOutputSource = HRTIM_SYNCOUTPUTSOURCE_MASTER_CMP1;
 hhrtim1.Init.SyncOutputPolarity = HRTIM_SYNCOUTPUTPOLARITY_POSITIVE;
 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();
 }
 if (HAL_HRTIM_FaultPrescalerConfig(&hhrtim1, HRTIM_FAULTPRESCALER_DIV1) != HAL_OK)
 {
 Error_Handler();
 }
 pFaultCfg.Source = HRTIM_FAULTSOURCE_DIGITALINPUT;
 pFaultCfg.Polarity = HRTIM_FAULTPOLARITY_HIGH;
 pFaultCfg.Filter = HRTIM_FAULTFILTER_NONE;
 pFaultCfg.Lock = HRTIM_FAULTLOCK_READONLY;
 if (HAL_HRTIM_FaultConfig(&hhrtim1, HRTIM_FAULT_1, &pFaultCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pFaultBlkCfg.Threshold = 0;
 pFaultBlkCfg.ResetMode = HRTIM_FAULTCOUNTERRST_UNCONDITIONAL;
 pFaultBlkCfg.BlankingSource = HRTIM_FAULTBLANKINGMODE_RSTALIGNED;
 if (HAL_HRTIM_FaultCounterConfig(&hhrtim1, HRTIM_FAULT_1, &pFaultBlkCfg) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_FaultBlankingConfigAndEnable(&hhrtim1, HRTIM_FAULT_1, &pFaultBlkCfg) != HAL_OK)
 {
 Error_Handler();
 }
 HAL_HRTIM_FaultModeCtl(&hhrtim1, HRTIM_FAULT_1, HRTIM_FAULTMODECTL_ENABLED);
 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_NONE;
 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 = 9066;
 if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_1, &pCompareCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pTimeBaseCfg.Mode = HRTIM_MODE_SINGLESHOT;
 if (HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, &pTimeBaseCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pTimerCtl.UpDownMode = HRTIM_TIMERUPDOWNMODE_UP;
 pTimerCtl.GreaterCMP1 = HRTIM_TIMERGTCMP1_GREATER;
 pTimerCtl.DualChannelDacEnable = HRTIM_TIMER_DCDE_DISABLED;
 if (HAL_HRTIM_WaveformTimerControl(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, &pTimerCtl) != HAL_OK)
 {
 Error_Handler();
 }
 pTimerCfg.InterruptRequests = HRTIM_TIM_IT_NONE;
 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_ENABLED;
 pTimerCfg.DelayedProtectionMode = HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED;
 pTimerCfg.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_NONE;
 pTimerCfg.ResetTrigger = HRTIM_TIMRESETTRIGGER_MASTER_PER;
 pTimerCfg.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
 if (HAL_HRTIM_WaveformTimerConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, &pTimerCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pTimerCfg.DMASrcAddress = 0x0000;
 pTimerCfg.DMADstAddress = 0x0000;
 pTimerCfg.DMASize = 0x1;
 if (HAL_HRTIM_WaveformTimerConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, &pTimerCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pTimerCfg.DMASrcAddress = 0x0000;
 pTimerCfg.DMADstAddress = 0x0000;
 pTimerCfg.DMASize = 0x1;
 if (HAL_HRTIM_WaveformTimerConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_C, &pTimerCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pCompareCfg.CompareValue = 8984;
 if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, &pCompareCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pDeadTimeCfg.Prescaler = HRTIM_TIMDEADTIME_PRESCALERRATIO_MUL8;
 pDeadTimeCfg.RisingValue = 0x000;
 pDeadTimeCfg.RisingSign = HRTIM_TIMDEADTIME_RISINGSIGN_POSITIVE;
 pDeadTimeCfg.RisingLock = HRTIM_TIMDEADTIME_RISINGLOCK_WRITE;
 pDeadTimeCfg.RisingSignLock = HRTIM_TIMDEADTIME_RISINGSIGNLOCK_WRITE;
 pDeadTimeCfg.FallingValue = 0x000;
 pDeadTimeCfg.FallingSign = HRTIM_TIMDEADTIME_FALLINGSIGN_POSITIVE;
 pDeadTimeCfg.FallingLock = HRTIM_TIMDEADTIME_FALLINGLOCK_WRITE;
 pDeadTimeCfg.FallingSignLock = HRTIM_TIMDEADTIME_FALLINGSIGNLOCK_WRITE;
 if (HAL_HRTIM_DeadTimeConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, &pDeadTimeCfg) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_DeadTimeConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, &pDeadTimeCfg) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_DeadTimeConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_C, &pDeadTimeCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
 pOutputCfg.SetSource = HRTIM_OUTPUTSET_MASTERPER;
 pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;
 pOutputCfg.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
 pOutputCfg.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
 pOutputCfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_INACTIVE;
 pOutputCfg.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
 pOutputCfg.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
 if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &pOutputCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pOutputCfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
 if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_TB1, &pOutputCfg) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_C, HRTIM_OUTPUT_TC1, &pOutputCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pOutputCfg.SetSource = HRTIM_OUTPUTSET_NONE;
 pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_NONE;
 pOutputCfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_INACTIVE;
 if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA2, &pOutputCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pOutputCfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
 if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_TB2, &pOutputCfg) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_C, HRTIM_OUTPUT_TC2, &pOutputCfg) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, &pTimeBaseCfg) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_WaveformTimerControl(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, &pTimerCtl) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, &pCompareCfg) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_C, &pTimeBaseCfg) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_WaveformTimerControl(&hhrtim1, HRTIM_TIMERINDEX_TIMER_C, &pTimerCtl) != HAL_OK)
 {
 Error_Handler();
 }
 if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_C, HRTIM_COMPAREUNIT_1, &pCompareCfg) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN HRTIM1_Init 2 */
 
 
 /* USER CODE END HRTIM1_Init 2 */
 HAL_HRTIM_MspPostInit(&hhrtim1);
 
}

waclawek.jan
Super User
April 23, 2020

There's not much activity around HRTIM on this forum.

In any case, read out and check the relevant GPIO and HRTIM registers' content.

JW