说实话,没有使用过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作为系统时钟的一种配置方式,大家可以做为参考。(这个自己还没有做验证,大家见谅)
|