Skip to main content
Aqwer.1
Associate
December 9, 2020
Question

How to use the master Hi-res Timer as a prescaler for the slave Hi-res Timers?

  • December 9, 2020
  • 2 replies
  • 865 views

I have an H7 application where I need the HRTIM master (or another timer if that is the only option) to be the prescaler for HRTIM A~E timers. How do I do this?

This topic has been closed for replies.

2 replies

victagayun
Senior III
December 16, 2020

Hello

is it like this?

void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
 
 /** Supply configuration update enable
 */
 HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
 /** Configure the main internal regulator output voltage
 */
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
 
 while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
 /** Initializes the RCC Oscillators according to the specified parameters
 * in the RCC_OscInitTypeDef structure.
 */
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSE;
 RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
 RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
 RCC_OscInitStruct.PLL.PLLM = 1;
 RCC_OscInitStruct.PLL.PLLN = 120;
 RCC_OscInitStruct.PLL.PLLP = 2;
 RCC_OscInitStruct.PLL.PLLQ = 4;
 RCC_OscInitStruct.PLL.PLLR = 2;
 RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
 RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
 RCC_OscInitStruct.PLL.PLLFRACN = 0;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
 /** Initializes the CPU, AHB and APB buses clocks
 */
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV16;
 RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV16;
 RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
 
 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
 {
 Error_Handler();
 }
 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_HRTIM1|RCC_PERIPHCLK_USART3
 |RCC_PERIPHCLK_USB;
 PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
 PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
 PeriphClkInitStruct.Hrtim1ClockSelection = RCC_HRTIM1CLK_TIMCLK;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
 /** Enable USB Voltage detector
 */
 HAL_PWREx_EnableUSBVoltageDetector();
}

static void MX_HRTIM_Init(void)
{
 
 /* USER CODE BEGIN HRTIM_Init 0 */
 
 /* USER CODE END HRTIM_Init 0 */
 
 HRTIM_TimeBaseCfgTypeDef pTimeBaseCfg = {0};
 HRTIM_TimerCfgTypeDef pTimerCfg = {0};
 HRTIM_OutputCfgTypeDef pOutputCfg = {0};
 
 /* USER CODE BEGIN HRTIM_Init 1 */
 
 /* USER CODE END HRTIM_Init 1 */
 hhrtim.Instance = HRTIM1;
 hhrtim.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
 hhrtim.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;
 if (HAL_HRTIM_Init(&hhrtim) != HAL_OK)
 {
 Error_Handler();
 }
 pTimeBaseCfg.Period = 0xFFFD;
 pTimeBaseCfg.RepetitionCounter = 0x00;
 pTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV4;
 pTimeBaseCfg.Mode = HRTIM_MODE_CONTINUOUS;
 if (HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &pTimeBaseCfg) != 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.HalfModeEnable = HRTIM_HALFMODE_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_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_A_B_C_DELAYEDPROTECTION_DISABLED;
 pTimerCfg.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_NONE;
 pTimerCfg.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;
 pTimerCfg.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
 if (HAL_HRTIM_WaveformTimerConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &pTimerCfg) != HAL_OK)
 {
 Error_Handler();
 }
 pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
 pOutputCfg.SetSource = HRTIM_OUTPUTSET_NONE;
 pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_NONE;
 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(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &pOutputCfg) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN HRTIM_Init 2 */
 
 /* USER CODE END HRTIM_Init 2 */
 HAL_HRTIM_MspPostInit(&hhrtim);
 
}

HRTIM freq is 937500.

basically,

RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV16;
 
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV16;
 
PeriphClkInitStruct.Hrtim1ClockSelection = RCC_HRTIM1CLK_TIMCLK;
 
pTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV4;

Aqwer.1
Aqwer.1Author
Associate
December 18, 2020

Hello Victagayun,

Thanks for your input on this. I do have the slow clock version like you show here, working. However, this is only a partial solution for me. I really need HRTIM master (or another clock if that is the only way) to pre-scale the count before it gets to those HRTIM slave timers A, B, C, D, and E. I have re-worded the question appropriately.

victagayun
Senior III
December 19, 2020