關於 STM32 RCC 的函數庫
在ST 的資料手冊中,關於 STM32 RCC 的函數庫的文件是UM0427 .
based 32-bit MCU STM32F101xx and STM32F103xx firmware library
(網路上的文件為 stm32f_firmw.pdf)
在這份文件中Page 261 頁Firmware library functions 表339 中有所說明,
這個表格大致可說明下面RCC_Configuration程式碼的內容。
void RCC_Configuration(void)
{
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON); /使用HSE要確認有外部石英振盪器,否則要改用HSI
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/*令Flash處於等候狀態,2是針對高頻時鐘的,這兩句跟RCC沒直接關係,可以暫且略過 */
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/*上面藍色的部份要參考STM32 的時脈圖比較容理解 */
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
/*下面的部份是要啟動 通訊腳位或者GPIO腳位 的時脈 */
/* Enable USART1, GPIOA, GPIOx and AFIO clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOx
| RCC_APB2Periph_AFIO, ENABLE);
/* Enable USART2 clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
}
/*至於 APB21 還是 APB2要參考技術手冊上的說明,也可參考下圖 */
based 32-bit MCU STM32F101xx and STM32F103xx firmware library
(網路上的文件為 stm32f_firmw.pdf)
在這份文件中Page 261 頁Firmware library functions 表339 中有所說明,
函數名
|
描述
|
RCC_DeInit
|
將外設 RCC暫存器重設為內定值
|
RCC_HSEConfig
|
設置外部高速晶振(HSE)
|
RCC_WaitForHSEStartUp
|
等待 HSE起振
|
RCC_AdjustHSICalibrationValue
|
調整內部高速晶振(HSI)校準值
|
RCC_HSICmd
|
使能或者失能內部高速晶振(HSI)
|
RCC_PLLConfig
|
設置 PLL時鐘源及倍頻係數
|
RCC_PLLCmd
|
使能或者失能 PLL
|
RCC_SYSCLKConfig
|
設置系統時鐘(SYSCLK)
|
RCC_GetSYSCLKSource
|
返回用作系統時鐘的時鐘源
|
RCC_HCLKConfig
|
設置 AHB時鐘(HCLK)
|
RCC_PCLK1Config
|
設置低速 AHB時鐘(PCLK1)
|
RCC_PCLK2Config
|
設置高速 AHB時鐘(PCLK2)
|
RCC_ITConfig
|
使能或者失能指定的 RCC中斷
|
RCC_USBCLKConfig
|
設置 USB時鐘(USBCLK)
|
RCC_ADCCLKConfig
|
設置 ADC時鐘(ADCCLK)
|
RCC_LSEConfig
|
設置外部低速晶振(LSE)
|
RCC_LSICmd
|
使能或者失能內部低速晶振(LSI)
|
RCC_RTCCLKConfig
|
設置 RTC時鐘(RTCCLK)
|
RCC_RTCCLKCmd
|
使能或者失能 RTC時鐘
|
RCC_GetClocksFreq
|
返回不同片上時鐘的頻率
|
RCC_AHBPeriphClockCmd
|
使能或者失能 AHB外設時鐘
|
RCC_APB2PeriphClockCmd
|
使能或者失能 APB2外設時鐘
|
RCC_APB1PeriphClockCmd
|
使能或者失能 APB1外設時鐘
|
RCC_APB2PeriphResetCmd
|
強制或者釋放高速
APB(APB2)外設復位
|
RCC_APB1PeriphResetCmd
|
強制或者釋放低速
APB(APB1)外設復位
|
RCC_BackupResetCmd
|
強制或者釋放後備域復位
|
RCC_ClockSecuritySystemCmd
|
使能或者失能時鐘安全系統
|
RCC_MCOConfig
|
選擇在 MCO管腳上輸出的時鐘源
|
RCC_GetFlagStatus
|
檢查指定的 RCC標誌位元設置與否
|
RCC_ClearFlag
|
清除 RCC的重定標誌位元
|
RCC_GetITStatus
|
檢查指定的 RCC中斷發生與否
|
RCC_ClearITPendingBit
|
清除 RCC的中斷待處理位
|
這個表格大致可說明下面RCC_Configuration程式碼的內容。
void RCC_Configuration(void)
{
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON); /使用HSE要確認有外部石英振盪器,否則要改用HSI
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/*令Flash處於等候狀態,2是針對高頻時鐘的,這兩句跟RCC沒直接關係,可以暫且略過 */
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/*上面藍色的部份要參考STM32 的時脈圖比較容理解 */
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
/*下面的部份是要啟動 通訊腳位或者GPIO腳位 的時脈 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOx
| RCC_APB2Periph_AFIO, ENABLE);
/* Enable USART2 clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
}
/*至於 APB21 還是 APB2要參考技術手冊上的說明,也可參考下圖 */
留言
張貼留言