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/LSI
  RCC_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; //配置为48MHz
  RCC_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输入,48MHz
  RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;     // AHB时钟为系统时钟1分频,48MHz/1 =48MHz
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;       // APB1时钟为系统时钟1分频,48MHz/1 =48MHz
  RCC_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 ≤ 20
	1 WS (2 CPU cycles)  30 < HCLK ≤ 60   24 < HCLK ≤ 48    22 < HCLK ≤ 44     20 < HCLK ≤ 40
	2 WS (3 CPU cycles)  60 < HCLK ≤ 90   48 < HCLK ≤ 72    44 < HCLK ≤ 66     40 < HCLK ≤ 60
	3 WS (4 CPU cycles)  90 < HCLK ≤ 120  72 < HCLK ≤ 96    66 < HCLK ≤ 88     60 < HCLK ≤ 80
	4 WS (5 CPU cycles) 120 < HCLK ≤ 150  96 < HCLK ≤ 120   88 < HCLK ≤ 110    80 < HCLK ≤ 100
	5 WS (6 CPU cycles) 150 < HCLK ≤ 180 120 < HCLK ≤ 144  110 < HCLK ≤ 132   100 < HCLK ≤ 120
	6 WS (7 CPU cycles)                  144 < HCLK ≤ 168  132 < HCLK ≤ 154   120 < HCLK ≤ 140
	7 WS (8 CPU cycles)                  168 <HCLK ≤ 180   154 < HCLK ≤ 176   140 < HCLK ≤ 160
	8 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/RTC
  PeriphClkInit.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,系统频率高达80MHz
  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) Error_Handler();
  /__HAL_RCC_RTC_ENABLE();//RTC时钟使能(功能需要时)
  // 配置系统定时器中断时间,配置为HCLK的千分频
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  // 配置系统定时器,配置为HCLK
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  // 系统定时器中断配置,设置系统定时器中断优先级最高(为0),且子优先级最高(为0)
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值