打印
[STM32U0]

[STM32U0] STM32U083测评】-03-MSI时钟初识

[复制链接]
309|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
说实话,没有使用过MSI,对于MSI的相关知识也是比较陌生的,所以今天就先过来看看,给大家科普一下MSI时钟,自己的理解不一定到位或者正确,大家一起学习进步吧,

我们首先信官方的文档里面来做了解,首先说一下什么是MSI,MSI是芯片内部的一个时钟信号单元,由内部RC振荡器产生,并且可以通过寄存器实现频率的调节作用,在低功耗以及极简的低功耗系统中,降低系统功耗,并且可以通过调节时钟实现低功耗以及正常工作状态的状态切换,从而实现功耗的动态调整的功能。我直接百度翻译了一下上面的文字,供大家参考。

    MSI时钟信号是从内部RC振荡器产生的。其频率范围可以是  通过软件使用时钟控制寄存器中的MSIRANGE[3:0]位进行调整  (RCC_CR)。十二个频率范围可用:100kHz、200kHz、400kHz、800kHz,  1 MHz、2 MHz、4 MHz(默认值)、8 MHz、16 MHz、24 MHz、32 MHz和48 MHz。  MSI时钟在从“重置”重新启动、从“待机”唤醒和  关闭低功率模式。从“重置”重新启动后,MSI频率设置为其默认值  值4MHz。请参阅第5.3节:低功率模式。  MSI时钟可以被选择为从停止模式唤醒之后的系统时钟(停止0,  停止1或停止2)。请参阅第5.3节:低功率模式。它也可以用作备份  时钟源(辅助时钟),如果HSE晶体振荡器出现故障。参考第5.2.10节:时钟  安全系统(CSS)。  MSI RC振荡器具有提供低成本(无外部组件)的优点  低功耗时钟源。此外,当与LSE一起用于PLL模式时,它提供  非常精确的时钟源,可供USB FS设备使用,并向主  PLL以80 MHz的最高速度运行系统。

    我去查看了一下U0系列的时钟树的概述,在U0的系统中,除了HSI48、HSI16、LSI、PLL、HSE、LSE、以及MSI,我当时一直在想已经有了这些时钟了,为啥还会多出一个MSI,那么MSI的优势到底在哪里?为啥有了MSI还需要HSI48和HSI16?其实个人看来,无论是HSI还是MSI,都是为了更方便的视线功耗调节和低功耗模式唤醒,但是HSI的时钟实际上是可以做一些省略的,设计上更加简洁,降低功耗,整体的一个初始化的代码我们可以做一下查看,具体代码如下,大家可以根据自己的需求去官网下载代码
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_CRSInitTypeDef RCC_CRSInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11;
  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV8;
  RCC_OscInitStruct.PLL.PLLN = 16;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Enable the CRS clock
  */
  __HAL_RCC_CRS_CLK_ENABLE();

  /** Configures CRS
  */
  RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
  RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_GPIO;
  RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
  RCC_CRSInitStruct.ReloadValue = __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000,1);
  RCC_CRSInitStruct.ErrorLimitValue = 34;
  RCC_CRSInitStruct.HSI48CalibrationValue = 32;

  HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
  HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI48, RCC_MCO1DIV_1);
}


上面就是使用MSI作为系统时钟的一种配置方式,大家可以做为参考。(这个自己还没有做验证,大家见谅)

使用特权

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

本版积分规则

认证:运达电气-产品经理
简介:毕业于西南科技大学,从事MCU、MPU开发工作近8年,熟悉嵌入式软硬件开发流程,产品管理以及现场项目管理。

42

主题

541

帖子

5

粉丝