2015-12-09 02:50 AM
Hello,
I have configured TIM1 as PWM source and enabled it. Its working becouse TIM1->CNT is incrementing and I have blinking LED based on value of TIM1->CNT. But now I need output it on PIN and its not workig. My configuration (generated mostly by CubeMX):[code]TIM_HandleTypeDef htim1;/* TIM1 init function */void MX_TIM1_Init(void){ GPIO_InitTypeDef GPIO_InitStruct; /* USER CODE BEGIN TIM1_MspInit 0 */ /* USER CODE END TIM1_MspInit 0 */ /* Peripheral clock enable */ __TIM1_CLK_ENABLE(); /**TIM1 GPIO Configuration PE12 ------> TIM1_CH3N PE13 ------> TIM1_CH3 */ GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); TIM_MasterConfigTypeDef sMasterConfig; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; TIM_OC_InitTypeDef sConfigOC; __HAL_RCC_TIM1_CLK_ENABLE(); htim1.Instance = TIM1; htim1.Init.Prescaler = 1000; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 8399; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; HAL_TIM_OC_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_PWM2; sConfigOC.Pulse = 4000; sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_SET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_SET; HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3);}void HAL_TIM_OC_MspInit(TIM_HandleTypeDef* htim_oc){ GPIO_InitTypeDef GPIO_InitStruct; if(htim_oc->Instance==TIM1) { /* USER CODE BEGIN TIM1_MspInit 0 */ /* USER CODE END TIM1_MspInit 0 */ /* Peripheral clock enable */ __TIM1_CLK_ENABLE(); /**TIM1 GPIO Configuration PE12 ------> TIM1_CH3N PE13 ------> TIM1_CH3 */ GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH ; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /* USER CODE BEGIN TIM1_MspInit 1 */ /* USER CODE END TIM1_MspInit 1 */ }}[/code]and main function:[code]int main(void){ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM1_Init(); HAL_TIM_OC_MspInit(&htim1); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_TIM_ENABLE(&htim1); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ if(TIM1->CNT > 4000) { HAL_GPIO_WritePin(GPIOE, LEDG_Pin, 0); } else { HAL_GPIO_WritePin(GPIOE, LEDG_Pin, 1); } /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */}[code]What am I missing?Thanks for any help. #timer-pwm-gpio-cube2015-12-09 03:26 AM
I don't speak the Cube gobbledygook, but the common gotcha with Advanced Timers (TIM1, TIM8, TIM15+) is that MOE in TIMx_BDTR needs to be set.
JW2015-12-09 04:10 AM
Thank you for interest.
setting this bit havn't help. I have uncomented:[code] 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_ENABLE; HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);[code]and set sBreakDeadTimeConfig.AutomaticOutput to enable so AOE bit is set and MOE is auto setting. Value of BDTR register is 0xE000 so MOE bit is set.Still no output on pin:/Currently I'm checking register by register what is set as Timer configuration;Thanks (Dziękuję)2015-12-09 07:15 AM
I think I'm missing something more basic. I have initialized TIMER4 with same configuration and I don't have output there also.
What I have:- Timer configuration (working because counting)- Timer clock enabled: __TIM1_CLK_ENABLE();- Timer enabled: __HAL_TIM_ENABLE(&htim1);- GPIO clock enabled: __GPIOE_CLK_ENABLE();- GPIO configured with AF: GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;- System clock is generated from HSIWhat else should I enable to make it working?It's my first contact with st uC so I'm little confused2015-12-09 08:07 AM
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
2015-12-09 01:11 PM
Once the Timer is configured can the output be directed to any pin? I have tried CubeMX and find that if I enable all the intended peripherals and GPIO's I cannot direct PWM to the desired pin.
2015-12-09 03:55 PM
bamboosso,
How do you observe the outcome? What is your hardware? Can you blinkey, i.e. produce pulses by putting the same pin as GP output and toggle it in a loop (together with some loop-delay, perhaps)? Post the timer's registers' content, and also the relevant GPIO registers'. (It's a risky business to try to guess one's nationality from his/her name - I understand Polish of course but I am from Bratislava, Slovakia, and my mother tongue is Hungarian, actually... welcome to Central Europe ;) )NStuff, please don't hijack threads - start your own, stating clearly and precisely what is your problem. JW2015-12-09 04:25 PM
Once the Timer is configured can the output be directed to any pin?
Well there a limited subset of choices. The Data Manual for the part has pin/function listings that associate TIMx_CHx functionality.2015-12-10 12:09 AM
Thank you all for help!
HAL_TIM_PWM_Start this is what I was missing!!
Thanks again!bamboosso