Question
STM32F2 Change Clock while running: Problems with USB
Posted on September 21, 2015 at 09:40
Hello,
I have a STM32F215 running as USB Device. With a specific command I implemented a function to change the core clock speed to 30/60/120 MHz. This is already working, but the USB Port has a strange behavior. After changing the clock speed the Controller doesn't send any data back to the PC, but the data which is sent to the controller is still correct. The clock changing is done like this:
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
if
(ret == 0)
{
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 240;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
RCC_OscInitStruct.PLL.PLLQ = 5;
ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
if
(ret == HAL_OK)
{
RCC_ClkInitStruct.ClockType = 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_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV4;
ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
if
(ret == HAL_OK)
{
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/8000);
ret = HAL_OK;
SysFreq = 60;
}
}
}
The USB is clocked with the PLL and for changing I have to switch off the PLL and switch on after reconfig it. I guess this is the reason why the USB connection has this strange behavior afterwards.
Does any one know how to solve this problem?
Regards,
Chris
#stm32f2 #pll #usb #stm32 #clock