----记录一下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);
}