RCC:Reset and Clock Control,復位與時鐘控制系統。系統復位有三種:系統復位、電源復位、RTC domain復位。本文重點詳解Clock Control部分。下面看下STM32L152芯片的時鐘框圖和cubeMX軟件中的時鐘框圖。
如上圖所示,在STM32中,有五個時鐘源,為HSI、HSE、LSI、LSE、PLL。
①HSI:High Speed Internal,高速內部時鐘,RC振蕩器;
②HSE:High Speed External,高速外部時鐘,可接石英/陶瓷諧振器,或者接外部時鐘源;
③LSI:Low Speed Internal,低速內部時鐘,RC振蕩器,頻率為37kHz;
④LSE:Low Speed External,低速外部時鐘,接頻率為32.768kHz的石英晶體;
⑤PLL:Phase Locked Loop,鎖相環倍頻分頻輸出。
另外,STM32還具有雙時鐘機制,即時鐘安全系統CSS(Clock Security System)。在外部晶振不工作時,轉而使用內部RC振蕩器作為自己時鐘心跳保證系統正常運行。當外部晶振恢復正常后,重新使用外部晶振。
上圖中也提到3種時鐘,FCLK、HCLK和PCLK。簡單介紹下三種時鐘。
(1)FCLK:Free Running Clock,為CPU提供時鐘信號,平時說的CPU主頻,就是這個時鐘信號,1/Fclk即為CPU時鐘周期;
(2)HCLK:為AHB bus peripherals提供時鐘信號,AHB:advanced high-performance bus;HCLK是高速外設時鐘,一般給內存、flash提供時鐘。
(3)PCLK:為APB bus peripherals供給時鐘信號,APB:advanced peripherals bus;PCLK是低速外設時鐘,一般給CAN、USB、I2C、USART、SPI、Timer、ADC和DAC提供時鐘信號。下面結合Cubemx生成的系統時鐘原程序進行分析。
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;
/**Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//設置調壓器輸出電壓級別1,用來設置調壓器輸出電壓級別,器件未以最大頻率工作,達到性能和功耗平衡
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI
|RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;//HSI時鐘16M
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;//PLL時鐘源為HSE
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;//8倍頻
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV2;//2分頻
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)//初始化
{
_Error_Handler(__FILE__, __LINE__);
}
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;//AHB 1分頻
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;//APB1 1分頻
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;//APB2 1分頻
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)//初始化
{
_Error_Handler(__FILE__, __LINE__);
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;//RTC時鐘選擇LSI
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);//滴答定時器配置
/**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//滴答定時器選擇HCLK 不分頻
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);//滴答定時器中斷優先級
責任編輯:gt
-
電源
+關注
關注
184文章
17704瀏覽量
249964 -
控制系統
+關注
關注
41文章
6604瀏覽量
110576 -
時鐘
+關注
關注
10文章
1733瀏覽量
131451
發布評論請先 登錄
相關推薦
評論