stm32L4,时钟切换问题,HSE换到MSI,程序不执行
现在是出现一个问题,如果我设置了外部HSE晶振,然后通过pll 倍频到24MHZ,如果我用内部MSI 8Mhz也倍频到24Mhz,程序里面切换是切换不了,直接设置时钟哪里卡死,如果我单独24MHZ,两种都能正常运行,程序里面自由切换 切换不了这是MSI的
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSICalibrationValue = 0;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_7;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 12;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){ _Error_Handler(__FILE__, __LINE__);}
下面是HSE的
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 12;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
用的是hal的库,上面程序都是软件stm32cubemx自动配置出来的。
之所以我想这样应用,是想低功耗100khz运行,目前来说msi来配置高频或者100khz,最终100khz运行的时候电流都可以达到手册上面说的30ua。
但是一旦我应用了HSE作为时钟源,100khz,最终最低是90ua左右,多了60ua左右,PLL和HSE我都设置关闭了。
__HAL_RCC_HSE_CONFIG(RCC_HSE_OFF);
__HAL_RCC_PLL_DISABLE();
所以最后的问题PLL配置这边的问题。没有找到方法。
你是说从HES/PLL 供时钟改为MSI直接供时钟吗?
平常没这么玩过,应该可以。 我先试试后再这里回复你。
本帖最后由 香水城 于 2022-5-5 16:02 编辑
我找了块L4的板测试了下,切换还挺顺畅的。
先是基于HSI时钟源并启用PLL,令其输出系统时钟。
后来,我将系统时钟切换为MSI【24MHz】并关闭PLL.
测试代码如下:
while (1)
{
if (counter < 10)
{ HAL_Delay(200);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5 );
counter++;
}
else
{
if(flag!=0xa5)
{
switch_Clock();//switch clock into MSI with PLL off
flag = 0xa5;
__HAL_RCC_PLLCLKOUT_DISABLE(RCC_PLL_SYSCLK);
__HAL_RCC_PLL_DISABLE();
}
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5 );
}
}
void switch_Clock(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
{
Error_Handler();
}
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSICalibrationValue = 0;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_9;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler();
}
}
页:
[1]