2014-07-22 01:03 PM
Hi, I've been trying to generate complementary PWM output on TIM1 Channel 1, but there is no example of this for the STM32F4 Discovery, so I wrote the code based on several examples for other chips/boards, but the code doesn't work at all. The output pin is always low. I would really appreciate it if anyone can find the problem, thanks!
__GPIOA_CLK_ENABLE(); __GPIOE_CLK_ENABLE(); GPIO_InitStructure.Pin = GPIO_PIN_7; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.Pin = GPIO_PIN_9; HAL_GPIO_Init(GPIOE, &GPIO_InitStructure); __TIM1_CLK_ENABLE(); uwPrescalerValue =0; TimHandle.Instance = TIM1; TimHandle.Init.Period = 1680 - 1; TimHandle.Init.Prescaler = uwPrescalerValue; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK) { Error_Handler(); } PWMConfig.Pulse = 840; PWMConfig.OCMode = TIM_OCMODE_PWM1; PWMConfig.OCPolarity = TIM_OCPOLARITY_HIGH; PWMConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; PWMConfig.OCIdleState = TIM_OCIDLESTATE_SET; PWMConfig.OCNIdleState= TIM_OCNIDLESTATE_RESET; PWMConfig.OCFastMode = TIM_OCFAST_DISABLE; if(HAL_TIM_PWM_ConfigChannel(&TimHandle,&PWMConfig,TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } DeadConfig.AutomaticOutput=TIM_AUTOMATICOUTPUT_ENABLE; DeadConfig.BreakPolarity=0; DeadConfig.BreakState=0; DeadConfig.DeadTime=100; DeadConfig.LockLevel=0; DeadConfig.OffStateIDLEMode=1; DeadConfig.OffStateRunMode=1; if(HAL_TIMEx_ConfigBreakDeadTime(&TimHandle,&DeadConfig) != HAL_OK) { Error_Handler(); } if(HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } if(HAL_TIMEx_PWMN_Start(&TimHandle,TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); }2014-07-22 01:10 PM
You're on your own with the HAL stuff, but you might want to make sure you've associated the pins with the timer, and enabled the PWM output for TIM1
2014-07-22 01:18 PM
2014-07-22 01:41 PM
Actually I'm wondering why others are not using the HAL stuff, I'm using it because those HAL stuff are the only examples I find. So where can I find the commonly-used examples others are using? Thank you!
The firmware libraries are well tested, mature, and in heavy use. The HAL/CUBE stuff is immature and buggy, and when it's production ready and validated I might expend effort porting to it. Red Download button, bottom of the pageshttp://www.st.com/web/en/catalog/tools/PF257904
http://www.st.com/web/en/catalog/tools/PF257901
2014-07-22 01:55 PM
2014-09-03 09:40 AM
Hi yi.fan.001,
After investigating you developped code based on STM32CubeF4 firmware, it turned out that yourGPIO Init structure for TIM1 output channel signals is missing the TIM1 alternate function configuration mode. That's why your project never come tofruition. Please find below the appropriateI/Os configuration:GPIO_InitStructure.Pin = GPIO_PIN_7;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_InitStructure.Alternate = GPIO_AF1_TIM1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_9;
HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
We've tested your example with the suggested modification and it's well working.
Hope that can help you.Keep us informed about your finding.
Regards.
2015-11-17 01:37 PM
Hi there,
I have been trying to replicate the PWM script above in the stm32f429i disco board without any success. The program compiles with no errors and, in debugging mode, I check that the program reaches the infinite loop with no problems. However, I am not able to see the PWM signal from the PA7 pin. Could you help? please. Please find the full code below: int main(int argc, char* argv[]) { GPIO_InitTypeDef GPIO_InitStructure; TIM_HandleTypeDef TimHandle; TIM_OC_InitTypeDef PWMConfig; TIM_BreakDeadTimeConfigTypeDef DeadConfig; __GPIOA_CLK_ENABLE(); __GPIOE_CLK_ENABLE(); GPIO_InitStructure.Pin = GPIO_PIN_7; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_InitStructure.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.Pin = GPIO_PIN_9; HAL_GPIO_Init(GPIOE, &GPIO_InitStructure); __TIM1_CLK_ENABLE(); uint16_t uwPrescalerValue =0; TimHandle.Instance = TIM1; TimHandle.Init.Period = 1680 - 1; TimHandle.Init.Prescaler = uwPrescalerValue; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK) { //Error_Handler(); } PWMConfig.Pulse = 840; PWMConfig.OCMode = TIM_OCMODE_PWM1; PWMConfig.OCPolarity = TIM_OCPOLARITY_HIGH; PWMConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; PWMConfig.OCIdleState = TIM_OCIDLESTATE_SET; PWMConfig.OCNIdleState= TIM_OCNIDLESTATE_RESET; PWMConfig.OCFastMode = TIM_OCFAST_DISABLE; if(HAL_TIM_PWM_ConfigChannel(&TimHandle,&PWMConfig,TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } DeadConfig.AutomaticOutput=TIM_AUTOMATICOUTPUT_ENABLE; DeadConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW; DeadConfig.BreakState = TIM_BREAK_DISABLE; DeadConfig.DeadTime = 0xFF; DeadConfig.LockLevel = TIM_LOCKLEVEL_OFF; DeadConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; DeadConfig.OffStateRunMode = TIM_OSSR_DISABLE; if(HAL_TIMEx_ConfigBreakDeadTime(&TimHandle,&DeadConfig) != HAL_OK) { Error_Handler(); } if(HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } if(HAL_TIMEx_PWMN_Start(&TimHandle,TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } // Add your code here. while(1) { } }2015-11-19 09:48 AM
Be careful for the systemClock configuration transition between two devices; STM32407 max frequency is 168MHz and STM32F429 is 180 MHz
-> So you should review the prescaler and the period implemented according to TIMER counter clock. (not the same as the example for STM32F407)