cancel
Showing results for 
Search instead for 
Did you mean: 

Unable to get PWM OUTPUT for TIM_1_CH3N on PB15 in STM32F103c8t6

ADIt
Associate II

hi ,

I want to generate PWM Output on PIN PB15 of STM32F103

This PIN has a default alternate function -> TIM1_CH3N for PWM output

Unable to get it Working.

I have give the code below

Can anyone let me know what is missing??

Thanks

-Aditya

main.c

/**

 * @brief System Clock Configuration

 * @retval None

 */

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct;

 RCC_ClkInitTypeDef RCC_ClkInitStruct;

   /**Initializes the CPU, AHB and APB busses clocks

   */

 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

 RCC_OscInitStruct.HSEState = RCC_HSE_ON;

 RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

 RCC_OscInitStruct.HSIState = RCC_HSI_ON;

 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

 {

   _Error_Handler(__FILE__, __LINE__);

 }

   /**Initializes the CPU, AHB and APB busses clocks

   */

 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                             |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

 {

   _Error_Handler(__FILE__, __LINE__);

 }

   /**Configure the Systick interrupt time

   */

 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  /**Configure the Systick

   */

 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

 /* SysTick_IRQn interrupt configuration */

 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}

/* TIM1 init function */

static void MX_TIM1_Init(void)

{

 TIM_ClockConfigTypeDef sClockSourceConfig;

 TIM_MasterConfigTypeDef sMasterConfig;

 TIM_OC_InitTypeDef sConfigOC;

 TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;

   uint32_t pp = 100;

 htim1.Instance = TIM1;

 htim1.Init.Prescaler = 72-1;

 htim1.Init.CounterMode = TIM_COUNTERMODE_UP;

 htim1.Init.Period = pp;

 htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

 htim1.Init.RepetitionCounter = 0;

 htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

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

 }

 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

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

 {

   _Error_Handler(__FILE__, __LINE__);

 }

 sConfigOC.OCMode = TIM_OCMODE_PWM1;

 sConfigOC.Pulse = pp*0.5;

 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

 sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW;

 sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;

 sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;

 sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;

 if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)

 {

   _Error_Handler(__FILE__, __LINE__);

 }

 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(__FILE__, __LINE__);

 }

 HAL_TIM_MspPostInit(&htim1);   

   htim1.Instance->BDTR = TIM_BDTR_MOE;

}

static void MX_GPIO_Init(void)

{

 /* GPIO Ports Clock Enable */

 __HAL_RCC_GPIOD_CLK_ENABLE();

 __HAL_RCC_GPIOB_CLK_ENABLE();

   __HAL_RCC_GPIOA_CLK_ENABLE();

}

/**

 * @brief This function is executed in case of error occurrence.

 * @param file: The file name as string.

 * @param line: The line in file as a number.

 * @retval None

 */

void _Error_Handler(char *file, int line)

{

 while(1){

 }

}

/**

 * @brief The application entry point.

 *

 * @retval None

 */

int main(void){

 HAL_Init();

 SystemClock_Config();

 MX_GPIO_Init();

   GPIO_InitTypeDef GPIO_InitStruct;

 GPIO_InitStruct.Pin = GPIO_PIN_8;

 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

 MX_TIM1_Init();   

   HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3); //Start Pwm signal on PB-15 Pin

 while (1){

      HAL_Delay(50);

      HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);

 }

}

/**********************************************************************************/

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)

{

 if(htim_base->Instance==TIM1)

 {

   __HAL_RCC_TIM1_CLK_ENABLE();

 }

}

/**********************************************************************************/

void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)

{

 GPIO_InitTypeDef GPIO_InitStruct;

 if(htim->Instance==TIM1)

 {

   GPIO_InitStruct.Pin = GPIO_PIN_15;

   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;      

   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

 }

}

/**********************************************************************************/

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)

{

 if(htim_base->Instance==TIM1)

 {

   __HAL_RCC_TIM1_CLK_DISABLE();

 }

}

/**********************************************************************************/

1 ACCEPTED SOLUTION
2 REPLIES 2
ADIt
Associate II

Thanks so much,

hi got it working

with this

HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);