之前的推文中說到,當使用一個外設時,必須先使能它的時鍾。怎么通過庫函數使能時鍾呢?如需了解寄存器配置時鍾,可以參考《STM32F10x中文參考手冊》“復位和時鍾控制(RCC)”章節,其中有詳細的寄存器介紹。固件庫已經把時鍾相關寄存器的使能配置都封裝好,放在stm32f10x_rcc.c和stm32f10x_rcc.h中。只需要打開stm32f10x_rcc.h文件,會發現有很多的宏定義和時鍾使能函數的聲明。這些時鍾函數可大致分為三類。一類是外設時鍾使能函數,一類是時鍾源和倍頻因子配置函數,還有一類是外設復位函數。當然還有幾個獲取時鍾源配置的函數。下面就來簡單介紹下這些函數的使用。
首先看一下時鍾使能函數,時鍾使能函數包括外設時鍾使能和時鍾源使能。外設時鍾使能相關函數如下:
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
上面3個時鍾使能函數也正是STM32的3條總線(這個在前面介紹存儲器與寄存器章節講過)。由於STM32的外設都是掛接在AHB和APB總線上的,所以要使能外設時鍾,也就是使能對應外設所掛接的總線時鍾。比如GPIO外設它是掛接在APB2總線上的,如果使用GPIO外設,就需要先使能APB2總線時鍾,使能時鍾代碼如下。
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph,FunctionalState NewState);
要想哪個外設掛接在哪個總線上呢,可以通過STM32中文參考手冊查找,還可以在固件庫stm32f10x_rcc.h文件中查找。其實這些知識在存儲器與寄存器推文中已經介紹過,大家可往回翻看下。
外設時鍾使能函數有兩個形參,第一個是你所使用的外設所掛接的時鍾,第二個是選擇你用的外設時鍾使能還是失能。比如我們要使能端口GPIOC,那么第一個傳遞的參數是:RCC_APB2Periph_GPIOC宏,第二個傳遞的參數是ENABLE使能。從第一個參數名來看也非常好理解,RCC表示復位和時鍾控制器,APB2表示GPIOC是掛接在APB2總線上,Periph表示外設,后面的GPIOC表示我們使能的是GPIOC端口。第二個參數ENABLE表示使能。假如使能GPIOA端口時鍾,那么只需要修改第一個參數值即可,按照剛才介紹的函數命名規律,無需查找即可寫出RCC_APB2Periph_GPIOA。其他的外設初始化方法類似。
下面介紹下時鍾源使能函數,通過前面的講解,知道STM32有5大類時鍾源, 這里我們只挑幾個重要的時鍾源使能函數介紹,如下:
void RCC_HSICmd(FunctionalState NewState);
void RCC_LSICmd(FunctionalState NewState);
void RCC_PLLCmd(FunctionalState NewState);
void RCC_RTCCLKCmd(FunctionalState NewState);
這些函數都是用來使能相應的時鍾源,比如我們要使能PLL時鍾,那么就調用RCC_PLLCmd函數,函數有一個形參,和前面外設時鍾的第二個參數一樣,如果為ENABLE表示使能,DISABLE表示失能。
我們再來介紹下另外一類時鍾函數——時鍾源和倍頻因子配置函數。這類函數主要用來選擇相應的時鍾源和配置時鍾倍頻因子,比如系統時鍾,它可以由HSE、HSI或者PLLCLK作為它的時鍾源,具體選擇哪個,就是通過時鍾源配置函數實現。比如我們設置HSE作為系統時鍾源,那么調用的函數就是:
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);//配置時鍾源為 HSE
在前面也介紹了APB1的時鍾頻率是HCLK的2分頻。那么可以調用下面這個函數來實現:
RCC_PCLK1Config(RCC_HCLK_Div2);//設置低速 APB1 時鍾(PCLK1)
時鍾倍頻因子配置函數主要用來修改系統的時鍾頻率。最后我們會通過一個簡單LED閃爍程序來說明修改倍頻因子后時鍾的變化。
最后介紹下另外一類時鍾函數——外設復位函數。其函數如下:
void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
在STM32F10x高容量的芯片中沒有RCC_AHBPeriphResetCmd函數。這類函數與前面講解的外設時鍾使能函數用法一樣,只不過外設時鍾使能函數是用於使能外設時鍾,而這類函數是用於外設復位,從函數名也可以區分出來。其他的函數大家可以自行查找其功能和用法。

