ST意法半导体
直播中

岳臻俊

9年用户 1167经验值
私信 关注
[问答]

STM32U5退出LPBAM后,重新配置时钟发现MSIK时钟和配置不一致是怎么回事?

  您好,我在LPBAM停止函数后调用时钟重新初始化函数(此函数和CUBEMX生成的SystemClock_Config()函数一致,仅仅只是重新写了一遍而已),通过串口输出MSIS和MSIK的寄存器值(通过调用HAL_RCC_GET_MSI_RANGE()和HAL_RCC_GET_MSIK_RANGE()宏),发现在时钟重新初始化函数执行完后,仅MSIS寄存器值正确(1MHz),MSIK寄存器值为0(对应是48MHz),导致部分使用MSIK时钟的外设运行异常!

/**

  • @brief  系统时钟配置(MSIS和MSIK)
  • @param  clockFlag         : 系统时钟配置标志 @ref sys_api_clock_flag
  • @arg  SYS_API_CLOCK_1M  : 1MHz
  • @arg  SYS_API_CLOCK_2M  : 2MHz
  • @arg  SYS_API_CLOCK_4M  : 4MHz
  • @arg  SYS_API_CLOCK_12M : 12MHz
  • @arg  SYS_API_CLOCK_16M : 16MHz
  • @arg  SYS_API_CLOCK_24M : 24MHz
  • @retval None
*/
void sys_api_system_clock_config(uint8_t clockFlag)
{
uint32_t clockRange;
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
switch(clockFlag)
{
case SYS_API_CLOCK_1M:    clockRange = RCC_MSIRANGE_7;    break;case SYS_API_CLOCK_2M:    clockRange = RCC_MSIRANGE_5;    break;case SYS_API_CLOCK_4M:    clockRange = RCC_MSIRANGE_4;    break;case SYS_API_CLOCK_12M:    clockRange = RCC_MSIRANGE_3;    break;case SYS_API_CLOCK_16M:    clockRange = RCC_MSIRANGE_2;    break;case SYS_API_CLOCK_24M:    clockRange = RCC_MSIRANGE_1;    break;default:    clockRange = RCC_MSIRANGE_7;    break;}
/** Configure the main internal regulator output voltage
*/
if(HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE4) != HAL_OK)
{
Error_Handler();}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_MSI|RCC_OSCILLATORTYPE_MSIK;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
RCC_OscInitStruct.MSIClockRange = clockRange;
RCC_OscInitStruct.LSIDiv = RCC_LSI_DIV1;
RCC_OscInitStruct.MSIKClockRange = clockRange;
RCC_OscInitStruct.MSIKState = RCC_MSIK_ON;
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_CLOCKTYPE_PCLK3;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;
if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();}
sys_api_clock_get();}

回帖(2)

徐非姗

2025-3-7 14:41:20
是RCC_MSIRANGE_1和RCC_MSIKRANGE_1弄错了,两个的宏定义不是一个
举报

美信电子

2025-3-8 17:22:59

在STM32U5系列微控制器中,LPBAM(Low Power Background Autonomous Mode)是一种低功耗模式,允许在低功耗状态下执行一些后台任务。当从LPBAM模式退出并重新配置时钟时,可能会遇到MSIK(MSI Kernel)时钟配置不一致的问题。以下是一些可能的原因和解决方法:


1. 时钟配置顺序问题


在重新配置时钟时,时钟的配置顺序非常重要。MSI(Multi-Speed Internal)时钟的配置可能需要在其他时钟配置之前完成。如果MSIK时钟的配置在MSIS(MSI System)时钟之后进行,可能会导致MSIK时钟配置不正确。


解决方法:
确保在SystemClock_Config()函数中,MSI时钟的配置(包括MSIS和MSIK)在其他时钟配置之前完成。可以尝试调整时钟配置的顺序,确保MSIK时钟在MSIS时钟之后立即配置。


2. 时钟源选择问题


在从LPBAM模式退出后,时钟源可能需要重新选择。如果时钟源选择不正确,可能会导致MSIK时钟无法正确配置。


解决方法:
在重新配置时钟时,确保时钟源选择正确。可以使用__HAL_RCC_MSI_ENABLE()__HAL_RCC_MSIK_ENABLE()宏来确保MSI和MSIK时钟源被正确启用。


3. 时钟稳定时间问题


在重新配置时钟后,时钟可能需要一定的时间来稳定。如果时钟配置后立即读取寄存器值,可能会得到不正确的值。


解决方法:
在时钟配置后,添加适当的延时(例如使用HAL_Delay()函数)以确保时钟稳定后再读取寄存器值。


4. 寄存器锁定问题


某些时钟寄存器可能被锁定,导致配置无法生效。例如,如果某些寄存器被写保护,配置可能不会应用到实际时钟。


解决方法:
检查时钟相关寄存器是否被锁定,并确保在配置时钟之前解除锁定。可以使用__HAL_RCC_MSI_DISABLE()__HAL_RCC_MSIK_DISABLE()宏来禁用MSI和MSIK时钟,然后再重新配置。


5. 固件版本问题


如果使用的STM32 HAL库或固件版本较旧,可能存在一些已知的时钟配置问题。


解决方法:
确保使用的STM32 HAL库或固件是最新版本。可以尝试更新到最新版本的HAL库,并重新生成代码。


6. 硬件问题


在某些情况下,硬件问题(例如时钟电路故障)也可能导致时钟配置不一致。


解决方法:
如果以上方法都无法解决问题,可以尝试在另一块硬件上测试,或者联系STMicroelectronics的技术支持以获取进一步的帮助。


示例代码


以下是一个可能的时钟配置示例,确保MSIK时钟正确配置:


void SystemClock_Config(void)
{
    // 1. 禁用MSI和MSIK时钟
    __HAL_RCC_MSI_DISABLE();
    __HAL_RCC_MSIK_DISABLE();

    // 2. 配置MSI时钟
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
    RCC_OscInitStruct.MSIState = RCC_MSI_ON;
    RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
    RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_1; // 1MHz
    HAL_RCC_OscConfig(&RCC_OscInitStruct);

    // 3. 配置MSIK时钟
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSIK;
    RCC_OscInitStruct.MSIKState = RCC_MSIK_ON;
    RCC_OscInitStruct.MSIKClockRange = RCC_MSIKRANGE_48; // 48MHz
    HAL_RCC_OscConfig(&RCC_OscInitStruct);

    // 4. 等待时钟稳定
    HAL_Delay(10);

    // 5. 配置系统时钟
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | 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;
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
}

通过以上步骤,应该能够解决MSIK时钟配置不一致的问题。如果问题仍然存在,建议进一步调试或联系技术支持。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分