Skip to main content
Visitor II
July 31, 2019
Question

PWM generation TIM1 CH1N

  • July 31, 2019
  • 3 replies
  • 10479 views

I am trying to generate a regular PWM signal using TIM1 CH1N on the STM32-F411RE (pin PA7). I've seen a few posts on generating PWM using the advanced timers but nothing has seemed to work.

The code below is the automatically generated code called in the main, and afterwards I call HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1).

I set the pulse to 0 expecting there to be a constant low output from the pin but the output seems to be constantly high. I have changed the pulse around but the output stays the same.

Help is Apreciated!

Thanks!

static void MX_TIM1_Init(void)

{

 /* USER CODE BEGIN TIM1_Init 0 */

 /* USER CODE END TIM1_Init 0 */

 TIM_MasterConfigTypeDef sMasterConfig = {0};

 TIM_OC_InitTypeDef sConfigOC = {0};

 TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

 /* USER CODE BEGIN TIM1_Init 1 */

 /* USER CODE END TIM1_Init 1 */

 htim1.Instance = TIM1;

 htim1.Init.Prescaler = 0;

 htim1.Init.CounterMode = TIM_COUNTERMODE_UP;

 htim1.Init.Period = 2100-1;

 htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

 htim1.Init.RepetitionCounter = 0;

 htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

 if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)

 {

  Error_Handler();

 }

 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

 if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)

 {

  Error_Handler();

 }

 sConfigOC.OCMode = TIM_OCMODE_PWM1;

 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();

 }

 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;

 if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)

 {

  Error_Handler();

 }

 /* USER CODE BEGIN TIM1_Init 2 */

 /* USER CODE END TIM1_Init 2 */

 HAL_TIM_MspPostInit(&htim1);

}

    This topic has been closed for replies.

    3 replies

    Super User
    July 31, 2019

    Read out and check/post the timer and relevant GPIO registers' content.

    JW

    Visitor II
    December 7, 2023

    Some people think that they are helping or that they are better than others but they actually should not spend their time in forums like this one.

    Graduate
    September 18, 2019

    Hello !

    The complementary output is a "advanced" feature, you must use the dedicated function to start it : HAL_TIMEx_PWMN_Start

    best regards.

    Visitor II
    February 27, 2021

    Hello,

    You use these functions to start a complimentary function.

    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);