打印
[STM32U5]

STM32U5在退出LPBAM后,重新配置时钟发现MSIS时钟正常,MSIK时钟和配置不一致。

[复制链接]
27|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laocuo1142|  楼主 | 2025-2-27 12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在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(); }

使用特权

评论回复
沙发
香水城| | 2025-2-27 15:01 | 只看该作者
本帖最后由 香水城 于 2025-2-27 15:02 编辑

你这是从ST 中文社区拷贝过来的,人家发帖人已经解释原因了,只是代码写法上的一个小误会。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1265

主题

5867

帖子

14

粉丝