2018-01-24 10:23 AM
Hi All
I am trying to get the TIM16 to work in output compare mode especially generate a PWM signal on channel 1. I am using the LL libraries of STM32L4xxx to do the job. I am using NUCLEO L432KC board and probing PA6. What i see is I get an ISR call every period of the PWM time and in the ISR I clear the flag using LL_TIM_ClearFlag_CC1(TIM16). The thing is I do not see the output on GPIO ping A6. Please help!!!
The settings of TIM16 and GPIO A pin 6 is as below:
/******************************/ /* Peripheral clocks enabling */ /******************************/ /* Enable the timer peripheral clock */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM16); /*************************/ /* GPIO AF configuration */ /*************************/ /* Enable the peripheral clock of GPIOs */ LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); /* GPIO TIM2_CH3 configuration */ LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_6, LL_GPIO_MODE_ALTERNATE); LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_6, LL_GPIO_PULL_DOWN); LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_6, LL_GPIO_SPEED_FREQ_HIGH); LL_GPIO_SetAFPin_8_15(GPIOA, LL_GPIO_PIN_6, LL_GPIO_AF_14); /***********************************************/ /* Configure the NVIC to handle TIM16 interrupt */ /***********************************************/ NVIC_SetPriority(TIM1_UP_TIM16_IRQn, 0); NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); PrescalerValue= __LL_TIM_CALC_PSC(RCC_ClockFreq.SYSCLK_Frequency, 1000000); /* Compute the prescaler value */ LL_TIM_SetPrescaler(TIM16, __LL_TIM_CALC_PSC(RCC_ClockFreq.SYSCLK_Frequency, 1000000)); /* Set the auto-reload value to have an initial update event frequency of 10000 Hz */ InitialAutoreload = __LL_TIM_CALC_ARR(RCC_ClockFreq.SYSCLK_Frequency, LL_TIM_GetPrescaler(TIM16), 10000); /* Time base configuration */ TIM_TimeBaseStructure.Autoreload =InitialAutoreload; /* TIM16 is a 16bit timer */ TIM_TimeBaseStructure.Prescaler = PrescalerValue; TIM_TimeBaseStructure.ClockDivision = 0; TIM_TimeBaseStructure.CounterMode = LL_TIM_COUNTERMODE_UP; LL_TIM_DeInit(TIM16);LL_TIM_OC_Init(
TIM16,&TIM_TimeBaseStructure
); TIM_OCInitStructure.OCState=LL_TIM_OCSTATE_ENABLE; TIM_OCInitStructure.OCPolarity=LL_TIM_OCPOLARITY_HIGH; TIM_OCInitStructure.OCMode= LL_TIM_OCMODE_PWM1 ; TIM_OCInitStructure.CompareValue=((LL_TIM_GetAutoReload(TIM16)/2)); TIM_OC1Init(TIM16,&TIM_OCInitStructure); LL_TIM_EnableCounter(TIM16); /*Enable the interrupt for the CC1 chanel*/ LL_TIM_EnableIT_CC1(TIM16);2018-01-24 10:43 AM
>>
LL_GPIO_SetAFPin_8_15(GPIOA, LL_GPIO_PIN_6, LL_GPIO_AF_14);
A range Pin 8 thru 15 probably NOT appropriate for Pin 6
2018-01-24 11:50 AM
Hi Clive
I did this and still do not see the PWM signal....
LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_6, LL_GPIO_AF_14);
Regards
Bala
2018-01-24 12:10 PM
Check strapping of SB16
Not going to replicate from incomplete code fragments.
Initialize TIM_TimeBaseStructure and TIM_OCInitStructure with ' = { 0 }; ' to ensure all fields are valid.
2018-01-24 01:09 PM
Reading out and checking the relevant TIM and GPIO registers never can be a bad thing to do.
JW
2018-01-31 07:04 AM
I got the solution to the issue that I did not see the PWM output on TIM16,,, The solution is to turn on AOE bit in the TIMx_BDTR register...