晶振使用"/>
STM32L432的内部MSI晶振使用
----记录一下STM32L432芯片的功能开发使用。
-由于板载尺寸的尺寸限制,硬件未配置外置晶振,故而只能使用内部晶振作为系统时钟源。
配置流程如下:
/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
/*可以使用四种不同的时钟源来驱动系统时钟(SYSCLK): • HSI (高速内部) 16 MHz RC 振荡器时钟• MSI (多速内部)RC 振荡器时钟• HSE 振荡器时钟,4 至 48 MHz• PLL 时钟从复位中启动后, MSI用作系统时钟源,配置为4 MHz。器件具有以下附加时钟源:• 32 kHz低速内部RC (LSI RC),该 RC 用于驱动独立看门狗,也可选择提供给hrtc 用于停止 / 待机模式下的自动唤醒。• 32.768 kHz低速外部晶振(LSE 晶振),用于驱动实时时钟 (RTCCLK)对于每个时钟源来说,在未使用时都可单独打开或者关闭,以降低功耗。MSI 时钟信号是从内部 RC 振荡器生成的。其频率范围可通过时钟控制寄存器 (RCC_CR)中的 MSIRANGE[3:0] 位进行软件调节。有 12 个频率范围可用:100 kHz、200 kHz、400 kHz、800 kHz、1 MHz、2 MHz、4 MHz(默认值)、8 MHz、16 MHz、24 MHz、32 MHz和 48 MHz。在从复位重启、从待机、关断低功耗模式后唤醒, MSI 时钟被用作系统时钟。从复位重启后,MSI 频率被置位其默认值 4 MHz。
*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_MSI;// 设置需要配置的振荡器为MSI/LSIRCC_OscInitStruct.LSIState = RCC_LSI_ON; // 激活LSI时钟(32kHz低速内部RC振荡器时钟)RCC_OscInitStruct.MSIState = RCC_MSI_ON; // 激活MSI时钟(100KHz-48MHz多速内部RC振荡器时钟)RCC_OscInitStruct.MSICalibrationValue = 0;RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11; //配置为48MHzRCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) Error_Handler();// 需要配置的时钟HCLK(APB1/APB2总线时钟源)、SYSCLK(系统时钟源)、PCLK1(APB1上外设时钟源)、PCLK2(APB2上外设时钟源)RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;// 配置系统时钟为MSI输入,48MHzRCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟为系统时钟1分频,48MHz/1 =48MHzRCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; // APB1时钟为系统时钟1分频,48MHz/1 =48MHzRCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2时钟为系统时钟1分频,48MHz/1 =48MHz /*
--@from --RM0390 Reference manual---
--->>FLASH_ACR 0 WS (1 CPU cycle) 0 < HCLK ≤ 30 0 <HCLK ≤ 24 0 < HCLK ≤ 22 0 < HCLK ≤ 201 WS (2 CPU cycles) 30 < HCLK ≤ 60 24 < HCLK ≤ 48 22 < HCLK ≤ 44 20 < HCLK ≤ 402 WS (3 CPU cycles) 60 < HCLK ≤ 90 48 < HCLK ≤ 72 44 < HCLK ≤ 66 40 < HCLK ≤ 603 WS (4 CPU cycles) 90 < HCLK ≤ 120 72 < HCLK ≤ 96 66 < HCLK ≤ 88 60 < HCLK ≤ 804 WS (5 CPU cycles) 120 < HCLK ≤ 150 96 < HCLK ≤ 120 88 < HCLK ≤ 110 80 < HCLK ≤ 1005 WS (6 CPU cycles) 150 < HCLK ≤ 180 120 < HCLK ≤ 144 110 < HCLK ≤ 132 100 < HCLK ≤ 1206 WS (7 CPU cycles) 144 < HCLK ≤ 168 132 < HCLK ≤ 154 120 < HCLK ≤ 1407 WS (8 CPU cycles) 168 <HCLK ≤ 180 154 < HCLK ≤ 176 140 < HCLK ≤ 1608 WS (9 CPU cycles) 176 < HCLK ≤ 180 160 < HCLK ≤ 168
*/ if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) Error_Handler();// 需要初始化的外设时钟:USART1/USART2/I2C1/RTCPeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_RTC;PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1; PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;//RTC时钟源为LSI if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) Error_Handler();// 配置内部主稳压器输出电压,配置为稳压器输出电压范围1模式,也就是:典型输出电压为1.2V,系统频率高达80MHzif (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) Error_Handler();/__HAL_RCC_RTC_ENABLE();//RTC时钟使能(功能需要时)// 配置系统定时器中断时间,配置为HCLK的千分频HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);// 配置系统定时器,配置为HCLKHAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);// 系统定时器中断配置,设置系统定时器中断优先级最高(为0),且子优先级最高(为0)HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
更多推荐
STM32L432的内部MSI晶振使用
发布评论