/* TIM3 init function */ void MX_TIM3_Init(void) { TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 0; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_OC_Init(&htim3); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig); sConfigOC.OCMode = TIM_OCMODE_TIMING; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3); HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4); HAL_TIM_MspPostInit(&htim3); }
/** * @brief Configures a Timer to emulate an encoder sensor outputs in Backward * direction * @param htim : TIM handle * @retval None */ static void Emulate_Backward_Direction(TIM_HandleTypeDef* htim) { /*## -1- Re-Configure the Pulse ########################################## */ sConfig.Pulse = (EMU_PERIOD * 3 )/4; if(HAL_TIM_OC_ConfigChannel(htim, &sConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } sConfig.Pulse = (EMU_PERIOD * 1 )/4; if(HAL_TIM_OC_ConfigChannel(htim, &sConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*## -2- Start signals generation ######################################### */ if(HAL_TIM_OC_Start(htim, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } if(HAL_TIM_OC_Start(htim, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } }
/* TIM2 init function */ void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim2.Instance = TIM2; htim2.Init.Prescaler = 83; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0xFFFFFFFF; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim2); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig); HAL_TIM_OC_Init(&htim2); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); sConfigOC.OCMode = TIM_OCMODE_TIMING; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2); HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3); HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4); }
/* TIM1 init function */ void MX_TIM1_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; TIM_OC_InitTypeDef sConfigOC; htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 0; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; HAL_TIM_Base_Init(&htim1); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig); HAL_TIM_OC_Init(&htim1); HAL_TIM_PWM_Init(&htim1); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig); sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig); sConfigOC.OCMode = TIM_OCMODE_TIMING; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2); HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3); sConfigOC.OCMode = TIM_OCMODE_PWM1; HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4); HAL_TIM_MspPostInit(&htim1); }
/* TIM17 init function */ void MX_TIM17_Init(void) { TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; TIM_OC_InitTypeDef sConfigOC; htim17.Instance = TIM17; htim17.Init.Prescaler = 0; htim17.Init.CounterMode = TIM_COUNTERMODE_UP; htim17.Init.Period = 0; htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim17.Init.RepetitionCounter = 0; HAL_TIM_Base_Init(&htim17); HAL_TIM_OC_Init(&htim17); sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; HAL_TIMEx_ConfigBreakDeadTime(&htim17, &sBreakDeadTimeConfig); sConfigOC.OCMode = TIM_OCMODE_TIMING; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; HAL_TIM_OC_ConfigChannel(&htim17, &sConfigOC, TIM_CHANNEL_1); }
/* TIM1 init function */ void MX_TIM1_Init(void) { TIM_OC_InitTypeDef sConfigOC; htim1.Instance = TIM1; htim1.Init.Prescaler = 9; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 999; HAL_TIM_Base_Init(&htim1); sConfigOC.OCMode = TIM_OCMODE_TOGGLE; sConfigOC.Pulse = 499; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); sConfigOC.Pulse = 999; /* Phase B is shifted by 90° */ HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2); }
void hubInit(void) { initIO(); calculatePeriod(); hubLUTInit(); initRows(); hubOrientation = HUB_ROTATE_0; hubSetOrient(hubOrientation); clearScreen(); //fillScreen(COLOR_RGB(255, 255, 255)); hubTestBmp(); screenRedraw(); // 100 Hz * 16 Phases HUB_TIMER_CLK_ENABLE(); TIM_ClockConfigTypeDef sClockSourceConfig; hubtim.Instance = HUB_TIMER; hubtim.Init.Prescaler = HUB_PRESCALER - 1; hubtim.Init.CounterMode = TIM_COUNTERMODE_UP; hubtim.Init.Period = period0 - 1; hubtim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&hubtim); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&hubtim, &sClockSourceConfig); HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); HAL_NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn); HAL_TIM_Base_Start_IT(&hubtim); // Timer 2 for NOE HUB_TIMER2_CLK_ENABLE(); TIM_OC_InitTypeDef sConfigOC; hubtim2.Instance = HUB_TIMER2; hubtim2.Init.Prescaler = 0; hubtim2.Init.CounterMode = TIM_COUNTERMODE_UP; hubtim2.Init.Period = 0xffff; hubtim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&hubtim2); HAL_TIM_OC_Init(&hubtim2); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = period2Min; sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_OC_ConfigChannel(&hubtim2, &sConfigOC, NOE_TIM_CHANNEL); HAL_TIM_PWM_Start(&hubtim2, NOE_TIM_CHANNEL); }
void STM32FrequencyChannel::Initialise () { TIM_OC_InitTypeDef sConfig; memset (&sConfig, 0, sizeof (TIM_OC_InitTypeDef)); sConfig.OCMode = TIM_OCMODE_TOGGLE; sConfig.OCPolarity = TIM_OCPOLARITY_LOW; sConfig.Pulse = 0xFFFF; HAL_TIM_OC_ConfigChannel (timer.handle, &sConfig, channel); }
// To trigger the ADC, we must use an output channel that is in PWM mode // However, CubeMX does not allow you to set up a channel as PWM without an output pin. // This will set OC4 to PWM mode. Also, triggering doesn't work if the compare register // (called pulse here) is 0, so we initialise it to 1. void OC4_PWM_Override(TIM_HandleTypeDef* htim) { TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM2; sConfigOC.Pulse = 1; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; HAL_TIM_OC_ConfigChannel(htim, &sConfigOC, TIM_CHANNEL_4); }
/** * @brief Initialize a Timer to emulate an encoder sensor * @param htim : TIM handle * @retval None */ static void Init_TIM_Emulator(TIM_HandleTypeDef* htim) { /* Initialize TIM3 peripheral as follow: + Prescaler = 0 + Period = 65535 + ClockDivision = 0 + Counter direction = Up */ htim->Instance = TIM3; htim->Init.Period = EMU_PERIOD; htim->Init.Prescaler = 0; htim->Init.ClockDivision = 0; htim->Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(htim) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*## Configure the Output Compare channels #########################################*/ /* Output Compare Toggle Mode configuration: Channel1 */ sConfig.OCMode = TIM_OCMODE_TOGGLE; sConfig.Pulse = (EMU_PERIOD * 1 )/4; sConfig.OCPolarity = TIM_OCPOLARITY_LOW; if(HAL_TIM_OC_ConfigChannel(htim, &sConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Output Compare Toggle Mode configuration: Channel2 */ sConfig.Pulse = (EMU_PERIOD * 3 )/4; if(HAL_TIM_OC_ConfigChannel(htim, &sConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } }
// Configures TIM4 Peripheral for LEDs lighting. static void TIM_LED_Config(void) { __HAL_RCC_TIM4_CLK_ENABLE(); HAL_NVIC_SetPriority(TIM4_IRQn, 7, 0); HAL_NVIC_EnableIRQ(TIM4_IRQn); /* ----------------------------------------------------------------------- TIM4 Configuration: Output Compare Timing Mode: To get TIM4 counter clock at 250 KHz, the prescaler is computed as follows: Prescaler = (TIM4CLK / TIM4 counter clock) - 1 Prescaler = ((f(APB1) * 2) / 250 KHz) - 1 CC update rate = TIM4 counter clock / CCR_Val = 32.687 Hz ==> Toggling frequency = 16.343 Hz ----------------------------------------------------------------------- */ /* Compute the prescaler value */ uint16_t prescalervalue = (uint16_t) ((HAL_RCC_GetPCLK1Freq() * 2) / 250000) - 1; /* Time base configuration */ ledTimer.Instance = TIM4; ledTimer.Init.Period = 65535; ledTimer.Init.Prescaler = prescalervalue; ledTimer.Init.ClockDivision = 0; ledTimer.Init.CounterMode = TIM_COUNTERMODE_UP; if (HAL_TIM_OC_Init(&ledTimer) != HAL_OK) { Error_Handler(); } /* Output Compare Timing Mode configuration: Channel1 */ ledConfig.OCMode = TIM_OCMODE_TIMING; ledConfig.OCIdleState = TIM_OCIDLESTATE_SET; ledConfig.Pulse = CCR1Val; ledConfig.OCPolarity = TIM_OCPOLARITY_HIGH; ledConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; ledConfig.OCFastMode = TIM_OCFAST_ENABLE; ledConfig.OCNIdleState = TIM_OCNIDLESTATE_SET; /* Initialize the TIM4 Channel1 with the structure above */ if (HAL_TIM_OC_ConfigChannel(&ledTimer, &ledConfig, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* Start the Output Compare */ if (HAL_TIM_OC_Start_IT(&ledTimer, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } }
void initializesync(void){ //Sets up TIM8 for sync pulse generation /* TIM8 init function */ TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; TIM_OC_InitTypeDef sConfigOC; htim8.Instance = TIM8; htim8.Init.Prescaler = 65535; htim8.Init.CounterMode = TIM_COUNTERMODE_UP; htim8.Init.Period = 160; //Sets the 30Hz pulse ~31.27Hz when = 80 //Right now ~16Hz htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim8.Init.RepetitionCounter = 0; HAL_TIM_Base_Init(&htim8); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim8, &sClockSourceConfig); HAL_TIM_OC_Init(&htim8); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig); sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 10; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; HAL_TIM_OC_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_1); }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* STM32F2xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 120 MHz */ SystemClock_Config(); /* Configure LED3 */ BSP_LED_Init(LED3); /*##-1- Configure the TIM peripheral #######################################*/ /* --------------------------------------------------------------------------- TIM3 Configuration: Output Compare Toggle Mode: To get TIM3 counter clock at 10 MHz, the prescaler is computed as follows: Prescaler = (TIM3CLK / TIM3 counter clock) - 1 Prescaler = ((SystemCoreClock/2) /10000000) - 1 CC1 update rate = TIM3 counter clock / uhCCR1_Val = 10 MHz/25641 = 390 Hz ==> So the TIM3 Channel 1 generates a periodic signal with a frequency equal to 195 Hz. CC2 update rate = TIM3 counter clock / uhCCR2_Val = 10 MHz/12820 = 780 Hz ==> So the TIM3 Channel 2 generates a periodic signal with a frequency equal to 390 Hz. CC3 update rate = TIM3 counter clock / uhCCR3_Val = 10 MHz/6410 = 1560 Hz ==> So the TIM3 Channel 3 generates a periodic signal with a frequency equal to 780 Hz. CC4 update rate = TIM3 counter clock / uhCCR4_Val = 10 MHz/3205 = 3120 Hz ==> So the TIM3 Channel 4 generates a periodic signal with a frequency equal to 1560 Hz. --------------------------------------------------------------------------- */ /* Compute the prescaler value to have TIM3 counter clock equal to 12.5 MHz */ uwPrescalerValue = (uint32_t)(((SystemCoreClock/2) / 10000000) - 1); TimHandle.Instance = TIM3; TimHandle.Init.Period = 65535; TimHandle.Init.Prescaler = uwPrescalerValue; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure the Output Compare channels ##############################*/ /* Common configuration for all channels */ sConfig.OCMode = TIM_OCMODE_TOGGLE; sConfig.OCPolarity = TIM_OCPOLARITY_LOW; /* Output Compare Toggle Mode configuration: Channel1 */ sConfig.Pulse = uhCCR1_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Output Compare Toggle Mode configuration: Channel2 */ sConfig.Pulse = uhCCR2_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Output Compare Toggle Mode configuration: Channel3 */ sConfig.Pulse = uhCCR3_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Output Compare Toggle Mode configuration: Channel4 */ sConfig.Pulse = uhCCR4_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_4) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-3- Start signals generation #######################################*/ /* Start channel 1 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 2 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 3 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 4 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_4) != HAL_OK) { /* Starting Error */ Error_Handler(); } while (1) {} }
/** * @brief TIM3, TIM4, TIM8 configuration * @param None * @retval None */ static void TIM_Config(void) { TIM_MasterConfigTypeDef sMasterConfig; /*########## TIM3 peripheral - PING (1 Hz) ##########*/ TimHandle3.Instance = TIM3; TimHandle3.Init.Period = 10000; TimHandle3.Init.Prescaler = (uint32_t)(((SystemCoreClock / 2) / 10000) - 1); //10kHz // T = 1/f = 1/10k = 0,0001 ; time = Period * T = 1s TimHandle3.Init.ClockDivision = 0; TimHandle3.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimHandle3) != HAL_OK) { Error_Handler(); } // Configure the Output Compare channel: sConfig.OCMode = TIM_OCMODE_TOGGLE; sConfig.Pulse = 100; sConfig.OCPolarity = TIM_OCPOLARITY_LOW; if(HAL_TIM_OC_ConfigChannel(&TimHandle3, &sConfig, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } if(HAL_TIM_OC_Start_IT(&TimHandle3, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /*########## TIM4 peripheral - UDP (10 Hz) ##########*/ TimHandle4.Instance = TIM4; TimHandle4.Init.Period = 10000; TimHandle4.Init.Prescaler = (uint32_t)(((SystemCoreClock / 2) / 100000) - 1); //100kHz // T = 1/f = 1/100k = 0,00001 ; time = Period * T = 0,1s TimHandle4.Init.ClockDivision = 0; TimHandle4.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimHandle4) != HAL_OK) { Error_Handler(); } if(HAL_TIM_OC_ConfigChannel(&TimHandle4, &sConfig, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } if(HAL_TIM_OC_Start_IT(&TimHandle4, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } /*########## TIM8 peripheral - ADC ##########*/ TimHandle8.Instance = TIM8; TimHandle8.Init.Period = 0x3C; TimHandle8.Init.Prescaler = 0; TimHandle8.Init.ClockDivision = 0; TimHandle8.Init.CounterMode = TIM_COUNTERMODE_UP; TimHandle8.Init.RepetitionCounter = 0x0; if(HAL_TIM_Base_Init(&TimHandle8) != HAL_OK) { Error_Handler(); } // TIM8 TRGO selection: sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if(HAL_TIMEx_MasterConfigSynchronization(&TimHandle8, &sMasterConfig) != HAL_OK) { Error_Handler(); //TIM8 TRGO selection Error } if(HAL_TIM_Base_Start(&TimHandle8) != HAL_OK) { Error_Handler(); //Counter Enable Error } /*########## TIM1 peripheral - PWM ##########*/ TimHandle1.Instance = TIM1; TimHandle1.Init.Period = uhTimerPeriod; TimHandle1.Init.RepetitionCounter = 3; TimHandle1.Init.Prescaler = 0; TimHandle1.Init.ClockDivision = 0; TimHandle1.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_PWM_Init(&TimHandle1) != HAL_OK) { Error_Handler(); } // Configure the PWM channel 3: sConfig.OCMode = TIM_OCMODE_PWM1; sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; sConfig.Pulse = aCCValue_Buffer; if(HAL_TIM_PWM_ConfigChannel(&TimHandle1, &sConfig, TIM_CHANNEL_3) != HAL_OK) { Error_Handler(); } // Start PWM signal generation in DMA mode: if(HAL_TIM_PWM_Start_DMA(&TimHandle1, TIM_CHANNEL_3, &aCCValue_Buffer, 1) != HAL_OK) { Error_Handler(); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Configure LED1 and LED3 */ BSP_LED_Init(LED1); BSP_LED_Init(LED3); /*##-1- Configure the TIM peripheral #######################################*/ /* --------------------------------------------------------------------------- TIM3 Configuration: Output Compare Toggle Mode: In this example TIM3 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1), since APB1 prescaler is different from 1. TIM3CLK = 2 * PCLK1 PCLK1 = HCLK / 4 => TIM3CLK = HCLK / 2 = SystemCoreClock /2 To get TIM3 counter clock at 18 MHz, the prescaler is computed as follows: Prescaler = (TIM3CLK / TIM3 counter clock) - 1 Prescaler = ((SystemCoreClock /2) /18 MHz) - 1 CC1 update rate = TIM3 counter clock / uhCCR1_Val = 439.44 Hz ==> So the TIM3 Channel 1 generates a periodic signal with a frequency equal to 219.72 Hz. CC2 update rate = TIM3 counter clock / uhCCR2_Val = 878.9 Hz ==> So the TIM3 Channel 2 generates a periodic signal with a frequency equal to 439.45 Hz. CC3 update rate = TIM3 counter clock / uhCCR3_Val = 1757.81 Hz ==> So the TIM3 Channel 3 generates a periodic signal with a frequency equal to 878.9 Hz. CC4 update rate = TIM3 counter clock / uhCCR4_Val = 3515.62 Hz ==> So the TIM3 Channel 4 generates a periodic signal with a frequency equal to 1757.81 Hz. Note: SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f4xx.c file. Each time the core clock (HCLK) changes, user had to update SystemCoreClock variable value. Otherwise, any configuration based on this variable will be incorrect. This variable is updated in three ways: 1) by calling CMSIS function SystemCoreClockUpdate() 2) by calling HAL API function HAL_RCC_GetSysClockFreq() 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency --------------------------------------------------------------------------- */ /* Compute the prescaler value to have TIMx counter clock equal to 21 MHz */ uwPrescalerValue = (uint32_t)(((SystemCoreClock /2) / 18000000) - 1); /* Initialize TIMx peripheral as follow: + Prescaler = ((SystemCoreClock /2) / 18000000) - 1 + Period = 65535 + ClockDivision = 0 + Counter direction = Up */ TimHandle.Instance = TIMx; TimHandle.Init.Period = 65535; TimHandle.Init.Prescaler = uwPrescalerValue; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure the Output Compare channels ##############################*/ /* Output Compare Toggle Mode configuration: Channel1 */ sConfig.OCMode = TIM_OCMODE_TOGGLE; sConfig.Pulse = uhCCR1_Val; sConfig.OCPolarity = TIM_OCPOLARITY_LOW; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Output Compare Toggle Mode configuration: Channel2 */ sConfig.Pulse = uhCCR2_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Output Compare Toggle Mode configuration: Channel3 */ sConfig.Pulse = uhCCR3_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Output Compare Toggle Mode configuration: Channel4 */ sConfig.Pulse = uhCCR4_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_4) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-3- Start signals generation ###########################################*/ /* Start channel 1 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 2 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 3 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 4 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_4) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Infinite loop */ while (1) { } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* This sample code shows how to use STM32L0xx TIM HAL API to generate 4 signals with four different frequencies.*/ /* STM32L0xx HAL library initialization: - Configure the Flash prefetch, Flash preread and Buffer caches - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Low Level Initialization */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize LED3 */ BSP_LED_Init(LED3); /*##-1- Configure the TIM peripheral #######################################*/ /* --------------------------------------------------------------------------- TIM2 Configuration: Output Compare Toggle Mode: To get TIM2 counter clock at 16 MHz, the prescaler is computed as follows: Prescaler = (TIM2CLK / TIM2 counter clock) - 1 Prescaler = (SystemCoreClock /16 MHz) - 1 CC1 update rate = TIM2 counter clock / uhCCR1_Val = 390.615 Hz ==> So the TIM2 Channel 1 generates a periodic signal with a frequency equal to 195.30 Hz. CC2 update rate = TIM2 counter clock / uhCCR2_Val = 781.25 Hz ==> So the TIM2 Channel 2 generates a periodic signal with a frequency equal to 390.625 Hz. CC3 update rate = TIM2 counter clock / uhCCR3_Val = 1562.5 Hz ==> So the TIM2 Channel 3 generates a periodic signal with a frequency equal to 781.25 Hz. CC4 update rate = TIM2 counter clock / uhCCR4_Val = 3125 Hz ==> So the TIM2 Channel 4 generates a periodic signal with a frequency equal to 1562.5 Hz. --------------------------------------------------------------------------- */ /* Compute the prescaler value to have TIM2 counter clock equal to 16 MHz */ uwPrescalerValue = (uint32_t)((SystemCoreClock / 16000000) - 1); TimHandle.Instance = TIM2; TimHandle.Init.Period = 65535; TimHandle.Init.Prescaler = uwPrescalerValue; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK) { /* Initialization Error */ ErrorHandler(); } /*##-2- Configure the Output Compare channels ##############################*/ /* Common configuration for all channels */ sConfig.OCMode = TIM_OCMODE_TOGGLE; sConfig.OCPolarity = TIM_OCPOLARITY_LOW; /* Output Compare Toggle Mode configuration: Channel1 */ sConfig.Pulse = uhCCR1_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ ErrorHandler(); } /* Output Compare Toggle Mode configuration: Channel2 */ sConfig.Pulse = uhCCR2_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ ErrorHandler(); } /* Output Compare Toggle Mode configuration: Channel3 */ sConfig.Pulse = uhCCR3_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK) { /* Configuration Error */ ErrorHandler(); } /* Output Compare Toggle Mode configuration: Channel4 */ sConfig.Pulse = uhCCR4_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_4) != HAL_OK) { /* Configuration Error */ ErrorHandler(); } /*##-3- Start signals generation #######################################*/ /* Start channel 1 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ ErrorHandler(); } /* Start channel 2 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ ErrorHandler(); } /* Start channel 3 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ ErrorHandler(); } /* Start channel 4 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_4) != HAL_OK) { /* Starting Error */ ErrorHandler(); } while (1) {} }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Configure LED1 and LED3 */ BSP_LED_Init(LED1); BSP_LED_Init(LED3); /* Compute the prescaler value to have TIMx counter clock equal to 2 KHz */ uwPrescalerValue = ((SystemCoreClock /2) / 2000) - 1; /*##-1- Configure the TIM peripheral #######################################*/ /* Initialize TIMx peripheral as follow: + Prescaler = (SystemCoreClock/2)/2000 + Period = 65535 + ClockDivision = 0 + Counter direction = Up */ TimHandle.Instance = TIMx; TimHandle.Init.Period = 65535; TimHandle.Init.Prescaler = uwPrescalerValue; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure the Output Compare channels ##############################*/ /* Common configuration for all channels */ sConfig.OCMode = TIM_OCMODE_ACTIVE; sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; /* Set the pulse (delay1) value for channel 1 */ sConfig.Pulse = PULSE1_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse (delay2) value for channel 2 */ sConfig.Pulse = PULSE2_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse (delay3) value for channel 3 */ sConfig.Pulse = PULSE3_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse (delay4) value for channel 4 */ sConfig.Pulse = PULSE4_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_4) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-3- Turn On LED1: use PG6 falling edge as reference ####################*/ /* Turn on LED1 */ BSP_LED_On(LED1); /*##-4- Start signals generation ###########################################*/ /* Start channel 1 in Output compare mode */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 2 in Output compare mode */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 3 in Output compare mode */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 4 in Output compare mode */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_4) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Infinite loop */ while (1) { } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization: global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Configure LED3 */ BSP_LED_Init(LED3); /*##-1- Configure the TIM peripheral #######################################*/ /* --------------------------------------------------------------------------- TIM1 Configuration: Output Compare Toggle Mode: To get TIM1 counter clock at 20 MHz, the prescaler is computed as follows: Prescaler = (TIM1CLK / TIM1 counter clock) - 1 Prescaler = (SystemCoreClock /20000000) - 1 CC1 update rate = TIM1 counter clock / uhCCR1_Val = 20 MHz/40961 = 488.269 Hz ==> So the TIM1 Channel 1 generates a periodic signal with a frequency equal to 244.13 Hz. CC2 update rate = TIM1 counter clock / uhCCR2_Val = 20 MHz/20480 = 976.56 Hz ==> So the TIM1 Channel 2 generates a periodic signal with a frequency equal to 488.28 Hz. CC3 update rate = TIM1 counter clock / uhCCR3_Val = 20 MHz/10240 = 1953.1 Hz ==> So the TIM1 Channel 3 generates a periodic signal with a frequency equal to 976.56 Hz. CC4 update rate = TIM1 counter clock / uhCCR4_Val = 20 MHz/5120 = 3906.25 Hz ==> So the TIM1 Channel 4 generates a periodic signal with a frequency equal to 1953.12 Hz. --------------------------------------------------------------------------- */ /* Compute the prescaler value to have TIM1 counter clock equal to 20 MHz */ uwPrescalerValue = (uint32_t)((SystemCoreClock / 20000000) - 1); TimHandle.Instance = TIM1; TimHandle.Init.Period = 65535; TimHandle.Init.Prescaler = uwPrescalerValue; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure the Output Compare channels ##############################*/ /* Common configuration for all channels */ sConfig.OCMode = TIM_OCMODE_TOGGLE; sConfig.OCPolarity = TIM_OCPOLARITY_LOW; /* Output Compare Toggle Mode configuration: Channel1 */ sConfig.Pulse = uhCCR1_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Output Compare Toggle Mode configuration: Channel2 */ sConfig.Pulse = uhCCR2_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Output Compare Toggle Mode configuration: Channel3 */ sConfig.Pulse = uhCCR3_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Output Compare Toggle Mode configuration: Channel4 */ sConfig.Pulse = uhCCR4_Val; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_4) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-3- Start signals generation #######################################*/ /* Start channel 1 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 2 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 3 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 4 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_4) != HAL_OK) { /* Starting Error */ Error_Handler(); } while (1) {} }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* Enable the CPU Cache */ CPU_CACHE_Enable(); /* STM32F7xx HAL library initialization: - Configure the Flash ART accelerator on ITCM interface - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the system clock to 216 MHz */ SystemClock_Config(); /* Configure LED3 */ BSP_LED_Init(LED3); /* Set Timers instance */ TimMasterHandle.Instance = TIM1; TimSlaveMasterHandle.Instance = TIM4; TimSlaveHandle.Instance = TIM5; /*======= Master1/Slave for an external trigger configuration : TIM1 =======*/ /* Initialize TIM1 peripheral in Output Compare mode*/ TimMasterHandle.Init.Period = 79; TimMasterHandle.Init.Prescaler = (SystemCoreClock / 16000000) - 1;; TimMasterHandle.Init.ClockDivision = 0; TimMasterHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimMasterHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the output: Channel_1 */ sOCConfig.OCMode = TIM_OCMODE_TOGGLE; sOCConfig.OCPolarity = TIM_OCPOLARITY_HIGH; if(HAL_TIM_OC_ConfigChannel(&TimMasterHandle, &sOCConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Configure the Input: channel_2 */ sICConfig.ICPolarity = TIM_ICPOLARITY_RISING; sICConfig.ICSelection = TIM_ICSELECTION_DIRECTTI; sICConfig.ICPrescaler = TIM_ICPSC_DIV1; sICConfig.ICFilter = 0; if(HAL_TIM_IC_ConfigChannel(&TimMasterHandle, &sICConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Configure TIM1 in Gated Slave mode for the external trigger (Filtered Timer Input 2) */ sSlaveConfig.InputTrigger = TIM_TS_TI2FP2; sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED; if( HAL_TIM_SlaveConfigSynchronization(&TimMasterHandle, &sSlaveConfig) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Configure TIM1 in Master Enable mode & use the update event as Trigger Output (TRGO) */ sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE; if( HAL_TIMEx_MasterConfigSynchronization(&TimMasterHandle, &sMasterConfig) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*=== End of Master1/Slave for an external trigger configuration : TIM1 ====*/ /*=================== Slave/Master configuration : TIM4 ====================*/ /* Initialize TIM4 peripheral in Output Compare mode*/ TimSlaveMasterHandle.Init.Period = 79; TimSlaveMasterHandle.Init.Prescaler = ((SystemCoreClock/2) / 16000000) - 1;; TimSlaveMasterHandle.Init.ClockDivision = 0; TimSlaveMasterHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimSlaveMasterHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Output Compare channel_1 */ sOCConfig.OCMode = TIM_OCMODE_TOGGLE; sOCConfig.OCPolarity = TIM_OCPOLARITY_HIGH; if(HAL_TIM_OC_ConfigChannel(&TimSlaveMasterHandle, &sOCConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Configure TIM4 in Gated Slave mode for the internal trigger 0(ITR0) */ sSlaveConfig.InputTrigger = TIM_TS_ITR0; sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED; if( HAL_TIM_SlaveConfigSynchronization(&TimSlaveMasterHandle, &sSlaveConfig) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Configure TIM4 in Master Enable mode & use the update event as Trigger Output (TRGO) */ sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE; if( HAL_TIMEx_MasterConfigSynchronization(&TimSlaveMasterHandle, &sMasterConfig) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*=============== End of Slave/Master configuration : TIM4 =================*/ /*====================== Slave configuration : TIM5 ========================*/ /* Initialize TIM5 peripheral in Output Compare mode*/ TimSlaveHandle.Init.Period = 79; TimSlaveHandle.Init.Prescaler = ((SystemCoreClock/2) / 16000000) - 1;; TimSlaveHandle.Init.ClockDivision = 0; TimSlaveHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimSlaveHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Output Compare channel_1 */ sOCConfig.OCMode = TIM_OCMODE_TOGGLE; sOCConfig.OCPolarity = TIM_OCPOLARITY_HIGH; if(HAL_TIM_OC_ConfigChannel(&TimSlaveHandle, &sOCConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Configure TIM5 in Gated Slave mode for the internal trigger 2(ITR2) */ sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED; sSlaveConfig.InputTrigger = TIM_TS_ITR2; if(HAL_TIM_SlaveConfigSynchronization(&TimSlaveHandle, &sSlaveConfig) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*================== End of Slave configuration : TIM5 =====================*/ /* 1- Start Timer1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */ /* Start Channel2 in Input Capture */ if(HAL_TIM_IC_Start(&TimMasterHandle, TIM_CHANNEL_2) != HAL_OK) { /* Start Error */ Error_Handler(); } /* Start the Output Compare */ if(HAL_TIM_OC_Start(&TimMasterHandle, TIM_CHANNEL_1) != HAL_OK) { /* Start Error */ Error_Handler(); } /* 2- Start Timer3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */ /* Start the Output Compare */ if(HAL_TIM_OC_Start(&TimSlaveMasterHandle, TIM_CHANNEL_1) != HAL_OK) { /* Start Error */ Error_Handler(); } /* 3- Start Timer3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */ /* Start the Output Compare */ if(HAL_TIM_OC_Start(&TimSlaveHandle, TIM_CHANNEL_1) != HAL_OK) { /* Start Error */ Error_Handler(); } /* Infinite loop */ while (1) { } }
/* TIM1 init function */ void MX_TIM1_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3; htim1.Init.Period = TIM_1_8_PERIOD_CLOCKS; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = TIM_1_8_RCR; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } if (HAL_TIM_OC_Init(&htim1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sConfigOC.OCMode = TIM_OCMODE_PWM2; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sConfigOC.OCMode = TIM_OCMODE_TIMING; if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_ENABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = TIM_1_8_DEADTIME_CLOCKS; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } HAL_TIM_MspPostInit(&htim1); }
/** * @brief Period elapsed callback in non blocking mode * @param htim : TIM handle * @retval None */ void timesBaseInit(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; uint32_t uwPrescalerValue = 0; /*##-1- Configure the TIM peripheral #######################################*/ /* ----------------------------------------------------------------------- In this example TIM3 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1), since APB1 prescaler is different from 1. TIM3CLK = 2 * PCLK1 PCLK1 = HCLK / 4 => TIM3CLK = HCLK / 2 = SystemCoreClock /2 To get TIM3 counter clock at 10 KHz, the Prescaler is computed as following: Prescaler = (TIM3CLK / TIM3 counter clock) - 1 Prescaler = ((SystemCoreClock /2) /10 KHz) - 1 ----------------------------------------------------------------------- */ /* Compute the prescaler value to have TIM7 counter clock equal to 10 KHz */ uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / (HI_TIME_FREQ * 2)); htim7.Instance = TIM7; htim7.Init.Prescaler = uwPrescalerValue; htim7.Init.CounterMode = TIM_COUNTERMODE_UP; htim7.Init.Period = 2-1; htim7.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim7); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig); HAL_TIM_Base_Start_IT(&htim7); uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / (LOW_TIME_FREQ * 100)); htim6.Instance = TIM6; htim6.Init.Prescaler = uwPrescalerValue; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 100-1; HAL_TIM_Base_Init(&htim6); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig); if(HAL_TIM_Base_Start_IT(&htim6) != HAL_OK) { /* Starting Error */ // Error_Handler(); } /*## Configure the TIM peripheral for ADC123 injected trigger ####################*/ /* ----------------------------------------------------------------------- Use TIM5 for start Injected conversion on ADC1 (gyro rate). Use TIM5 for start Injected conversion on ADC2 (not use). Use TIM5 for start Injected conversion on ADC3 (not use). ----------------------------------------------------------------------- */ /* Compute the prescaler value to have TIM5 counter clock equal to 10 KHz */ uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / (GYRO_TIME_FREQ * 100)); htim5.Instance = TIM5; htim5.Init.Prescaler = uwPrescalerValue; htim5.Init.CounterMode = TIM_COUNTERMODE_UP; htim5.Init.Period = 100-1; htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // htim5.Init.RepetitionCounter = 0x0; HAL_TIM_Base_Init(&htim5); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig); sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; //TIM_TRGO_UPDATE see adc.c => ADC1 injected section sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig); HAL_TIM_Base_Start_IT(&htim5); /*## Configure the TIM peripheral for ADC23 regular trigger ####################*/ /* ----------------------------------------------------------------------- Use TIM2 for start Regular conversion on ADC2 (telemeters, just use in timer base). Use TIM2 for start Regular conversion on ADC3 (not use). ----------------------------------------------------------------------- */ /* Compute the prescaler value to have TIM2 counter clock equal to 10 KHz */ uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / (TELEMETERS_TIME_FREQ * 100)); htim2.Instance = TIM2; htim2.Init.Prescaler = uwPrescalerValue; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 100-1; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.RepetitionCounter = 0x0; HAL_TIM_Base_Init(&htim2); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig); sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); HAL_TIM_Base_Start_IT(&htim2); /*## Configure the TIM peripheral for ADC1 regular trigger ####################*/ /* ----------------------------------------------------------------------- Use TIM4 for start Regular conversion on ADC1 (vbat, gyro_temp, internal_temps, internal vbat). ----------------------------------------------------------------------- */ /* Compute the prescaler value to have TIM4 counter clock equal to 1 Hz */ uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / (MULTIMMETER_TIME_FREQ * 10000)); htim4.Instance = TIM4; htim4.Init.Prescaler = uwPrescalerValue; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 10000-1; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim4); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig); HAL_TIM_OC_Init(&htim4); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig); sConfigOC.OCMode = TIM_OCMODE_TOGGLE; sConfigOC.Pulse = 1; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_OC_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4); HAL_TIM_OC_Start_IT(&htim4, TIM_CHANNEL_4); }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* Enable the CPU Cache */ CPU_CACHE_Enable(); /* STM32F7xx HAL library initialization: - Configure the Flash ART accelerator on ITCM interface - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the system clock to 216 MHz */ SystemClock_Config(); /* Configure LED3 */ BSP_LED_Init(LED3); /*##-1- Configure the TIM peripheral #######################################*/ /* --------------------------------------------------------------------------- TIM1 input clock (TIM1CLK) is set to 2 * APB2 clock (PCLK2), since APB2 prescaler is different from 1. TIM1CLK = 2 * PCLK2 PCLK1 = HCLK / 2 => TIM1CLK = HCLK = SystemCoreClock --------------------------------------------------------------------------- */ /* Initialize TIMx peripheral as follow: + Prescaler = 0 + Period = 4095 + ClockDivision = 0 + Counter direction = Up */ TimHandle.Instance = TIM1; TimHandle.Init.Period = 4095; TimHandle.Init.Prescaler = 0; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; TimHandle.Init.RepetitionCounter = 0; if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure the output channels ######################################*/ /* Common configuration for all channels */ sPWMConfig1.OCMode = TIM_OCMODE_TIMING; sPWMConfig1.OCPolarity = TIM_OCPOLARITY_HIGH; sPWMConfig1.OCNPolarity = TIM_OCNPOLARITY_HIGH; sPWMConfig1.OCIdleState = TIM_OCIDLESTATE_SET; sPWMConfig1.OCNIdleState = TIM_OCNIDLESTATE_SET; sPWMConfig1.OCFastMode = TIM_OCFAST_DISABLE; /* Set the pulse value for channel 1 */ sPWMConfig1.Pulse = 2047; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sPWMConfig1, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse value for channel 2 */ sPWMConfig2 = sPWMConfig1; sPWMConfig2.Pulse = 1023; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sPWMConfig2, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse value for channel 3 */ sPWMConfig3 = sPWMConfig1; sPWMConfig3.Pulse = 511; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sPWMConfig3, TIM_CHANNEL_3) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-3- Configure the Break stage ##########################################*/ sBreakConfig.OffStateRunMode = TIM_OSSR_ENABLE; sBreakConfig.OffStateIDLEMode = TIM_OSSI_ENABLE; sBreakConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakConfig.BreakState = TIM_BREAK_ENABLE; sBreakConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE; sBreakConfig.DeadTime = 1; if(HAL_TIMEx_ConfigBreakDeadTime(&TimHandle, &sBreakConfig) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-4- Configure the commutation event: software event ####################*/ HAL_TIMEx_ConfigCommutationEvent_IT(&TimHandle, TIM_TS_NONE, TIM_COMMUTATION_SOFTWARE); /*##-5- Start signals generation ###########################################*/ /*--------------------------------------------------------------------------*/ /* Start channel 1 */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 1N */ if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ /* Start channel 2 */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 2N */ if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ /* Start channel 3 */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 3N */ if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Authorize TIM COM event generation */ uwAuthorizeTimComEvent = 1; while (1) { } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Configure LED1, LED2 and LED3 */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); BSP_LED_Init(LED3); /* Turn off LED1 */ BSP_LED_Off(LED1); /* De-assert trig ouput pin */ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7, GPIO_PIN_RESET); /* TIM3 input clock is set to APB1 clock (PCLK1), * if (APB1 prescaler = 1) x1 else x2 * prescaler is 4. * TIM3CLK = (HCLK/4) x2 = (HCLK/2) * Compute the prescaler value to have TIMx counter clock equal to 10 kHz */ uwPrescalerValue = ((SystemCoreClock/2) / 10000) - 1; /*##-1- Configure the TIM peripheral #######################################*/ /* Initialize TIMx peripheral as follow: + Prescaler = (SystemCoreClock)/10000 - 1; + Period = 65535 + ClockDivision = 0 + Counter direction = Up */ TimHandle.Instance = TIM3; TimHandle.Init.Period = 65535; TimHandle.Init.Prescaler = uwPrescalerValue; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure the Output Compare channels #########################################*/ /* Common configuration for all channels */ sConfig.OCMode = TIM_OCMODE_ACTIVE; sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; /* Set the pulse (delay1) value for channel 1 */ sConfig.Pulse = PULSE1_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse (delay2) value for channel 2 */ sConfig.Pulse = PULSE2_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse (delay3) value for channel 3 */ sConfig.Pulse = PULSE3_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse (delay4) value for channel 4 */ sConfig.Pulse = PULSE4_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_4) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-3- Turn On LED2: use PB.07 edge as reference ####################*/ /* Turn on LED2 */ BSP_LED_On(LED2); /* Assert trig ouput pin */ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET); /*##-4- Start signals generation #######################################*/ /* Start channel 1 in Output compare mode */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 2 in Output compare mode */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 3 in Output compare mode */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 4 in Output compare mode */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_4) != HAL_OK) { /* Starting Error */ Error_Handler(); } while (1) { } }
/** * @brief Configures TIM4 Peripheral for LEDs lighting. * @param None * @retval None */ static void TIM_LED_Config(void) { uint16_t prescalervalue = 0; uint32_t tmpvalue = 0; /* TIM4 clock enable */ __HAL_RCC_TIM4_CLK_ENABLE(); /* Enable the TIM4 global Interrupt */ HAL_NVIC_SetPriority(TIM4_IRQn, 7, 0); HAL_NVIC_EnableIRQ(TIM4_IRQn); /* ----------------------------------------------------------------------- TIM4 Configuration: Output Compare Timing Mode: To get TIM4 counter clock at 550 KHz, the prescaler is computed as follows: Prescaler = (TIM4CLK / TIM4 counter clock) - 1 Prescaler = ((f(APB1) * 2) /550 KHz) - 1 CC update rate = TIM4 counter clock / CCR_Val = 32.687 Hz ==> Toggling frequency = 16.343 Hz ----------------------------------------------------------------------- */ /* Compute the prescaler value */ tmpvalue = HAL_RCC_GetPCLK1Freq(); prescalervalue = (uint16_t) ((tmpvalue * 2) / 550000) - 1; /* Time base configuration */ hTimLed.Instance = TIM4; hTimLed.Init.Period = 65535; hTimLed.Init.Prescaler = prescalervalue; hTimLed.Init.ClockDivision = 0; hTimLed.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&hTimLed) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Output Compare Timing Mode configuration: Channel1 */ sConfigLed.OCMode = TIM_OCMODE_TIMING; sConfigLed.OCIdleState = TIM_OCIDLESTATE_SET; sConfigLed.Pulse = CCR1Val; sConfigLed.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigLed.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigLed.OCFastMode = TIM_OCFAST_ENABLE; sConfigLed.OCNIdleState = TIM_OCNIDLESTATE_SET; /* Initialize the TIM4 Channel1 with the structure above */ if(HAL_TIM_OC_ConfigChannel(&hTimLed, &sConfigLed, TIM_CHANNEL_1) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Start the Output Compare */ if(HAL_TIM_OC_Start_IT(&hTimLed, TIM_CHANNEL_1) != HAL_OK) { /* Start Error */ Error_Handler(); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 168 MHz */ SystemClock_Config(); /* Configure LED3 */ BSP_LED_Init(LED3); /*##-1- Configure the TIM peripheral #######################################*/ /*---------------------------------------------------------------------------- The STM32F4xx TIM1 peripheral offers the possibility to program in advance the configuration for the next TIM1 outputs behaviour (step) and change the configuration of all the channels at the same time. This operation is possible when the COM (commutation) event is used. The COM event can be generated by software by setting the COM bit in the TIM1_EGR register or by hardware (on TRC rising edge). In this example, a software COM event is generated each 1 ms: using the SysTick interrupt. The TIM1 is configured in Timing Mode, each time a COM event occurs, a new TIM1 configuration will be set in advance. ----------------------------------------------------------------------------*/ /* Initialize TIMx peripheral as follow: + Prescaler = 0 + Period = 4095 + ClockDivision = 0 + Counter direction = Up */ TimHandle.Instance = TIM1; TimHandle.Init.Period = 4095; TimHandle.Init.Prescaler = 0; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; TimHandle.Init.RepetitionCounter = 0; if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure the output channels ######################################*/ /* Common configuration for all channels */ sConfig.OCMode = TIM_OCMODE_TIMING; sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfig.OCIdleState = TIM_OCIDLESTATE_SET; sConfig.OCNIdleState = TIM_OCNIDLESTATE_SET; sConfig.OCFastMode = TIM_OCFAST_DISABLE; /* Set the pulse value for channel 1 */ sConfig.Pulse = 2047; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse value for channel 2 */ sConfig.Pulse = 1023; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse value for channel 3 */ sConfig.Pulse = 511; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-3- Configure the Break stage ##########################################*/ sConfigBK.OffStateRunMode = TIM_OSSR_ENABLE; sConfigBK.OffStateIDLEMode = TIM_OSSI_ENABLE; sConfigBK.LockLevel = TIM_LOCKLEVEL_OFF; sConfigBK.BreakState = TIM_BREAK_ENABLE; sConfigBK.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sConfigBK.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE; sConfigBK.DeadTime = 1; if(HAL_TIMEx_ConfigBreakDeadTime(&TimHandle, &sConfigBK) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-4- Configure the commutation event: software event ####################*/ HAL_TIMEx_ConfigCommutationEvent_IT(&TimHandle, TIM_TS_NONE, TIM_COMMUTATION_SOFTWARE); /*##-5- Start signals generation ###########################################*/ /*--------------------------------------------------------------------------*/ /* Start channel 1 */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 1N */ if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ /* Start channel 2 */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 2N */ if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ /* Start channel 3 */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 3N */ if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /*--------------------------------------------------------------------------*/ /* Infinite loop */ while (1) { } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { GPIO_InitTypeDef GPIO_InitStruct; /* STM32F4xx HAL library initialization: - Configure the Flash prefetch - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Enable GPIO Clock */ __HAL_RCC_GPIOB_CLK_ENABLE(); /* Configure the GPIO pins: used to display the 4 wave forms */ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; /* Configure PB.00 to display wave form of channel1 */ GPIO_InitStruct.Pin = GPIO_PIN_0; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Configure PB.01 to display wave form of channel2 */ GPIO_InitStruct.Pin = GPIO_PIN_1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Configure PB.03 to display wave form of channel3 */ GPIO_InitStruct.Pin = GPIO_PIN_3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Configure PB.05 to display wave form of channel4 */ GPIO_InitStruct.Pin = GPIO_PIN_5; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Compute the prescaler value to have TIMx counter clock equal to 10 kHz */ uwPrescalerValue = ((SystemCoreClock) / 10000) - 1; /*##-1- Configure the TIM peripheral #######################################*/ /* Initialize TIMx peripheral as follow: + Prescaler = (SystemCoreClock)/10000 - 1; + Period = 65535 + ClockDivision = 0 + Counter direction = Up */ TimHandle.Instance = TIM1; TimHandle.Init.Period = 65535; TimHandle.Init.Prescaler = uwPrescalerValue; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure the Output Compare channels #########################################*/ /* Common configuration for all channels */ sConfig.OCMode = TIM_OCMODE_INACTIVE; sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; /* Set the pulse (delay1) value for channel 1 */ sConfig.Pulse = PULSE1_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse (delay2) value for channel 2 */ sConfig.Pulse = PULSE2_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse (delay3) value for channel 3 */ sConfig.Pulse = PULSE3_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse (delay4) value for channel 4 */ sConfig.Pulse = PULSE4_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_4) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-3- Set GPIO Pins PB.00, PB.01, PB.03 and PB.05 as reference ###################*/ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); /*##-4- Start signals generation #######################################*/ /* Start channel 1 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 2 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 3 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 4 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_4) != HAL_OK) { /* Starting Error */ Error_Handler(); } while (1) { } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F2xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 120 MHz */ SystemClock_Config(); /* Configure LED3 */ BSP_LED_Init(LED3); /* Timers synchronisation in cascade mode with an external trigger ----- 1/TIM1 is configured as Master Timer: - Toggle Mode is used - The TIM1 Enable event is used as Trigger Output 2/TIM1 is configured as Slave Timer for an external Trigger connected to TIM1 TI2 pin (TIM1 CH2 configured as input pin): - The TIM1 TI2FP2 is used as Trigger Input - Rising edge is used to start and stop the TIM1: Gated Mode. 3/TIM3 is slave for TIM1 and Master for TIM4, - Toggle Mode is used - The ITR1(TIM1) is used as input trigger - Gated mode is used, so start and stop of slave counter are controlled by the Master trigger output signal(TIM1 enable event). - The TIM3 enable event is used as Trigger Output. 4/TIM4 is slave for TIM3, - Toggle Mode is used - The ITR2(TIM3) is used as input trigger - Gated mode is used, so start and stop of slave counter are controlled by the Master trigger output signal(TIM3 enable event). TIM1 input clock (TIM1CLK) is set to 2 * APB2 clock (PCLK2), since APB2 prescaler is different from 1. TIM1CLK = 2 * PCLK2 PCLK2 = HCLK / 2 => TIM1CLK = 2 * (HCLK / 2) = HCLK = SystemCoreClock TIM3/TIM4 input clock (TIM3CLK/TIM4CLK) is set to 2 * APB1 clock (PCLK1), since APB1 prescaler is different from 1. TIM3CLK/TIM4CLK = 2 * PCLK1 PCLK1 = HCLK / 4 => TIM3CLK/TIM4CLK = HCLK / 2 = SystemCoreClock /2 The TIM1CLK is fixed to 120 MHZ, the Prescaler is equal to 5 so the TIMx clock counter is equal to 28 MHz. The TIM3CLK and TIM4CLK are fixed to 84 MHZ, the Prescaler is equal to 5 so the TIMx clock counter is equal to 14 MHz. The Three Timers are running at: TIMx frequency = TIMx clock counter/ 2*(TIMx_Period + 1) = 93,3 KHz. The starts and stops of the TIM1 counters are controlled by the external trigger. The TIM3 starts and stops are controlled by the TIM1, and the TIM4 starts and stops are controlled by the TIM3. Note: SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f2xx.c file. Each time the core clock (HCLK) changes, user had to update SystemCoreClock variable value. Otherwise, any configuration based on this variable will be incorrect. This variable is updated in three ways: 1) by calling CMSIS function SystemCoreClockUpdate() 2) by calling HAL API function HAL_RCC_GetSysClockFreq() 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency -------------------------------------------------------------------- */ /* Set Timers instance */ TimMasterHandle.Instance = TIM1; TimSlaveMasterHandle.Instance = TIM3; TimSlaveHandle.Instance = TIM4; /*======= Master1/Slave for an external trigger configuration : TIM1 =======*/ /* Initialize TIM1 peripheral in Output Compare mode*/ TimMasterHandle.Init.Period = 149; TimMasterHandle.Init.Prescaler = 5; TimMasterHandle.Init.ClockDivision = 0; TimMasterHandle.Init.CounterMode = TIM_COUNTERMODE_UP; TimMasterHandle.Init.RepetitionCounter = 0; if(HAL_TIM_OC_Init(&TimMasterHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the output: Channel_1 */ sOCConfig.OCMode = TIM_OCMODE_TOGGLE; sOCConfig.OCPolarity = TIM_OCPOLARITY_HIGH; if(HAL_TIM_OC_ConfigChannel(&TimMasterHandle, &sOCConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Configure the Input: channel_2 */ sICConfig.ICPolarity = TIM_ICPOLARITY_RISING; sICConfig.ICSelection = TIM_ICSELECTION_DIRECTTI; sICConfig.ICPrescaler = TIM_ICPSC_DIV1; sICConfig.ICFilter = 0; if(HAL_TIM_IC_ConfigChannel(&TimMasterHandle, &sICConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Configure TIM1 in Gated Slave mode for the external trigger (Filtered Timer Input 2) */ sSlaveConfig.InputTrigger = TIM_TS_TI2FP2; sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED; if( HAL_TIM_SlaveConfigSynchronization(&TimMasterHandle, &sSlaveConfig) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Configure TIM1 in Master Enable mode & use the update event as Trigger Output (TRGO) */ sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE; if( HAL_TIMEx_MasterConfigSynchronization(&TimMasterHandle, &sMasterConfig) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*=== End of Master1/Slave for an external trigger configuration : TIM1 ====*/ /*=================== Slave/Master configuration : TIM3 ====================*/ /* Initialize TIM3 peripheral in Output Compare mode*/ TimSlaveMasterHandle.Init.Period = 74; TimSlaveMasterHandle.Init.Prescaler = 5; TimSlaveMasterHandle.Init.ClockDivision = 0; TimSlaveMasterHandle.Init.CounterMode = TIM_COUNTERMODE_UP; TimSlaveMasterHandle.Init.RepetitionCounter = 0; if(HAL_TIM_OC_Init(&TimSlaveMasterHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Output Compare channel_1 */ sOCConfig.OCMode = TIM_OCMODE_TOGGLE; sOCConfig.OCPolarity = TIM_OCPOLARITY_HIGH; if(HAL_TIM_OC_ConfigChannel(&TimSlaveMasterHandle, &sOCConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Configure TIM3 in Gated Slave mode for the internal trigger 0(ITR0) */ sSlaveConfig.InputTrigger = TIM_TS_ITR0; sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED; if( HAL_TIM_SlaveConfigSynchronization(&TimSlaveMasterHandle, &sSlaveConfig) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Configure TIM3 in Master Enable mode & use the update event as Trigger Output (TRGO) */ sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE; if( HAL_TIMEx_MasterConfigSynchronization(&TimSlaveMasterHandle, &sMasterConfig) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*=============== End of Slave/Master configuration : TIM3 =================*/ /*====================== Slave configuration : TIM4 ========================*/ /* Initialize TIM4 peripheral in Output Compare mode*/ TimSlaveHandle.Init.Period = 74; TimSlaveHandle.Init.Prescaler = 5; TimSlaveHandle.Init.ClockDivision = 0; TimSlaveHandle.Init.CounterMode = TIM_COUNTERMODE_UP; TimSlaveHandle.Init.RepetitionCounter = 0; if(HAL_TIM_OC_Init(&TimSlaveHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Configure the Output Compare channel_1 */ sOCConfig.OCMode = TIM_OCMODE_TOGGLE; sOCConfig.OCPolarity = TIM_OCPOLARITY_HIGH; if(HAL_TIM_OC_ConfigChannel(&TimSlaveHandle, &sOCConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Configure TIM4 in Gated Slave mode for the internal trigger 2(ITR2) */ sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED; sSlaveConfig.InputTrigger = TIM_TS_ITR2; if(HAL_TIM_SlaveConfigSynchronization(&TimSlaveHandle, &sSlaveConfig) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*================== End of Slave configuration : TIM4 =====================*/ /* 1- Start Timer1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */ /* Start Channel2 in Input Capture */ if(HAL_TIM_IC_Start(&TimMasterHandle, TIM_CHANNEL_2) != HAL_OK) { /* Start Error */ Error_Handler(); } /* Start the Output Compare */ if(HAL_TIM_OC_Start(&TimMasterHandle, TIM_CHANNEL_1) != HAL_OK) { /* Start Error */ Error_Handler(); } /* 2- Start Timer3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */ /* Start the Output Compare */ if(HAL_TIM_OC_Start(&TimSlaveMasterHandle, TIM_CHANNEL_1) != HAL_OK) { /* Start Error */ Error_Handler(); } /* 3- Start Timer3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */ /* Start the Output Compare */ if(HAL_TIM_OC_Start(&TimSlaveHandle, TIM_CHANNEL_1) != HAL_OK) { /* Start Error */ Error_Handler(); } /* Infinite loop */ while (1) { } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 168 MHz */ SystemClock_Config(); /* Configure LED1, LED2, LED3 and LED4 */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); BSP_LED_Init(LED3); BSP_LED_Init(LED4); /* Compute the prescaler value to have TIMx counter clock equal to 2 KHz */ uwPrescalerValue = ((SystemCoreClock /2) / 2000) - 1; /*##-1- Configure the TIM peripheral #######################################*/ /* --------------------------------------------------------------- TIM2 Configuration: Output Compare Inactive Mode: In this example TIM2 input clock (TIM2CLK) is set to 2 * APB1 clock (PCLK1), since APB1 prescaler is different from 1. TIM2CLK = 2 * PCLK1 PCLK1 = HCLK / 4 => TIM2CLK = HCLK / 2 = SystemCoreClock /2 To get TIM2 counter clock at 2 KHz, the prescaler is computed as follows: Prescaler = (TIM2CLK / TIM2 counter clock) - 1 Prescaler = ((SystemCoreClock /2) /2 KHz) - 1 Generate 4 signals with 4 different delays: TIM2_CH1 delay = uhCCR1_Val/TIM2 counter clock = 500 ms TIM2_CH2 delay = uhCCR2_Val/TIM2 counter clock = 250 ms TIM2_CH3 delay = uhCCR3_Val/TIM2 counter clock = 125 ms TIM2_CH4 delay = uhCCR4_Val/TIM2 counter clock = 62.5 ms Note: SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f4xx.c file. Each time the core clock (HCLK) changes, user had to update SystemCoreClock variable value. Otherwise, any configuration based on this variable will be incorrect. This variable is updated in three ways: 1) by calling CMSIS function SystemCoreClockUpdate() 2) by calling HAL API function HAL_RCC_GetSysClockFreq() 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency --------------------------------------------------------------- */ /* Initialize TIMx peripheral as follow: + Prescaler = (SystemCoreClock/2)/2000 + Period = 65535 + ClockDivision = 0 + Counter direction = Up */ TimHandle.Instance = TIMx; TimHandle.Init.Period = 65535; TimHandle.Init.Prescaler = uwPrescalerValue; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure the Output Compare channels ##############################*/ /* Common configuration for all channels */ sConfig.OCMode = TIM_OCMODE_INACTIVE; sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; /* Set the pulse (delay1) value for channel 1 */ sConfig.Pulse = PULSE1_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse (delay2) value for channel 2 */ sConfig.Pulse = PULSE2_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse (delay3) value for channel 3 */ sConfig.Pulse = PULSE3_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse (delay4) value for channel 4 */ sConfig.Pulse = PULSE4_VALUE; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_4) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-3- Turn on LED1, LED2, LED3 and LED4 ##################################*/ BSP_LED_On(LED1); BSP_LED_On(LED2); BSP_LED_On(LED3); BSP_LED_On(LED4); /*##-4- Start signals generation ###########################################*/ /* Start channel 1 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 2 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 3 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 4 in Output compare mode */ if(HAL_TIM_OC_Start_IT(&TimHandle, TIM_CHANNEL_4) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Infinite loop */ while (1) { } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Configure LED3 */ BSP_LED_Init(LED3); /*##-1- Configure the TIM peripheral #######################################*/ /* Initialize TIMx peripheral as follow: + Prescaler = 0 + Period = 4095 + ClockDivision = 0 + Counter direction = Up */ TimHandle.Instance = TIM1; TimHandle.Init.Period = 4095; TimHandle.Init.Prescaler = 0; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; TimHandle.Init.RepetitionCounter = 0; if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure the output channels ######################################*/ /* Common configuration for all channels */ sConfig.OCMode = TIM_OCMODE_TIMING; sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfig.OCIdleState = TIM_OCIDLESTATE_SET; sConfig.OCNIdleState = TIM_OCNIDLESTATE_SET; sConfig.OCFastMode = TIM_OCFAST_DISABLE; /* Set the pulse value for channel 1 */ sConfig.Pulse = 2047; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse value for channel 2 */ sConfig.Pulse = 1023; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /* Set the pulse value for channel 3 */ sConfig.Pulse = 511; if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-3- Configure the Break stage ##########################################*/ sConfigBK.OffStateRunMode = TIM_OSSR_ENABLE; sConfigBK.OffStateIDLEMode = TIM_OSSI_ENABLE; sConfigBK.LockLevel = TIM_LOCKLEVEL_OFF; sConfigBK.BreakState = TIM_BREAK_ENABLE; sConfigBK.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sConfigBK.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE; sConfigBK.DeadTime = 1; if(HAL_TIMEx_ConfigBreakDeadTime(&TimHandle, &sConfigBK) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-4- Configure the commutation event: software event ####################*/ HAL_TIMEx_ConfigCommutationEvent_IT(&TimHandle, TIM_TS_NONE, TIM_COMMUTATION_SOFTWARE); /*##-5- Start signals generation ###########################################*/ /*--------------------------------------------------------------------------*/ /* Start channel 1 */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 1N */ if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { /* Starting Error */ Error_Handler(); } /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ /* Start channel 2 */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 2N */ if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK) { /* Starting Error */ Error_Handler(); } /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ /* Start channel 3 */ if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Start channel 3N */ if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /*--------------------------------------------------------------------------*/ /* Infinite loop */ while (1) { } }