RCC:Reset and Clock Control,復(fù)位與時(shí)鐘控制系統(tǒng)。系統(tǒng)復(fù)位有三種:系統(tǒng)復(fù)位、電源復(fù)位、RTC domain復(fù)位。本文重點(diǎn)詳解Clock Control部分。下面看下STM32L152芯片的時(shí)鐘框圖和cubeMX軟件中的時(shí)鐘框圖。
如上圖所示,在STM32中,有五個(gè)時(shí)鐘源,為HSI、HSE、LSI、LSE、PLL。
①HSI:High Speed Internal,高速內(nèi)部時(shí)鐘,RC振蕩器;
②HSE:High Speed External,高速外部時(shí)鐘,可接石英/陶瓷諧振器,或者接外部時(shí)鐘源;
③LSI:Low Speed Internal,低速內(nèi)部時(shí)鐘,RC振蕩器,頻率為37kHz;
④LSE:Low Speed External,低速外部時(shí)鐘,接頻率為32.768kHz的石英晶體;
⑤PLL:Phase Locked Loop,鎖相環(huán)倍頻分頻輸出。
另外,STM32還具有雙時(shí)鐘機(jī)制,即時(shí)鐘安全系統(tǒng)CSS(Clock Security System)。在外部晶振不工作時(shí),轉(zhuǎn)而使用內(nèi)部RC振蕩器作為自己時(shí)鐘心跳保證系統(tǒng)正常運(yùn)行。當(dāng)外部晶振恢復(fù)正常后,重新使用外部晶振。
上圖中也提到3種時(shí)鐘,F(xiàn)CLK、HCLK和PCLK。簡單介紹下三種時(shí)鐘。
(1)FCLK:Free Running Clock,為CPU提供時(shí)鐘信號(hào),平時(shí)說的CPU主頻,就是這個(gè)時(shí)鐘信號(hào),1/Fclk即為CPU時(shí)鐘周期;
(2)HCLK:為AHB bus peripherals提供時(shí)鐘信號(hào),AHB:advanced high-performance bus;HCLK是高速外設(shè)時(shí)鐘,一般給內(nèi)存、flash提供時(shí)鐘。
(3)PCLK:為APB bus peripherals供給時(shí)鐘信號(hào),APB:advanced peripherals bus;PCLK是低速外設(shè)時(shí)鐘,一般給CAN、USB、I2C、USART、SPI、Timer、ADC和DAC提供時(shí)鐘信號(hào)。下面結(jié)合Cubemx生成的系統(tǒng)時(shí)鐘原程序進(jìn)行分析。
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);//設(shè)置調(diào)壓器輸出電壓級(jí)別1,用來設(shè)置調(diào)壓器輸出電壓級(jí)別,器件未以最大頻率工作,達(dá)到性能和功耗平衡
/**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時(shí)鐘16M
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;//PLL時(shí)鐘源為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時(shí)鐘選擇LSI
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);//滴答定時(shí)器配置
/**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//滴答定時(shí)器選擇HCLK 不分頻
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);//滴答定時(shí)器中斷優(yōu)先級(jí)
責(zé)任編輯:gt
-
電源
+關(guān)注
關(guān)注
184文章
17488瀏覽量
249170 -
控制系統(tǒng)
+關(guān)注
關(guān)注
41文章
6511瀏覽量
110384 -
時(shí)鐘
+關(guān)注
關(guān)注
10文章
1714瀏覽量
131277
發(fā)布評論請先 登錄
相關(guān)推薦
評論