STM32時鐘控制RCC
我學習RCC的參考資料:
技術(shù)文檔0427及其中文翻譯版STM32F10xxx_Library_Manual_ChineseV2的第十五章和RM0008_CH參考手冊。
準備知識:
片上總線標準種類繁多,而由ARM公司推出的AMBA片上總線受到了廣大IP開發(fā)商和SoC系統(tǒng)集成者的青睞,已成為一種流行的工業(yè)標準片上結(jié)構(gòu)。AMBA規(guī)范主要包括了AHB(Advanced High performance Bus)系統(tǒng)總線和APB(Advanced Peripheral Bus)外圍總線。二者分別適用于高速與相對低速設備的連接。
由于時鐘是一個由內(nèi)而外的東西,具體設置要從寄存器開始。
RCC 寄存器結(jié)構(gòu),RCC_TypeDeff,在文件“stm32f10x_map.h”中定義如下:
typedef struct
{
vu32 CR;
vu32 CFGR;
vu32 CIR;
vu32 APB2RSTR;
vu32 APB1RSTR;
vu32 AHBENR;
vu32 APB2ENR;
vu32 APB1ENR;
vu32 BDCR;
vu32 CSR;
} RCC_TypeDef;
這些寄存器的具體定義和使用方式參見芯片手冊,在此不贅述,因為C語言的開發(fā)可以不和他們直接打交道,當然如果能夠加以理解和記憶,無疑是百利而無一害。
相信細心的朋友早就發(fā)現(xiàn)板子上只有8Mhz的晶振,而增強型最高工作頻率為72Mhz,顯然需要用PLL倍頻9倍,這些設置都需要在初始化階段完成。為了方便說明,我借用一下例程的RCC設置函數(shù),并用中文注釋的形式加以說明:
//在此指出上面的注釋頭應該是復制過來的,寫錯了...不過沒關(guān)系,反正沒參數(shù)需要說明,重要的是函數(shù)體。
static void RCC_Config(void)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if (HSEStartUpStatus == SUCCESS)
{
}
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
}
由上述程序可以看出系統(tǒng)時鐘的設定是比較復雜的,外設越多,需要考慮的因素就越多。同時這種設定也是有規(guī)律可循的,設定參數(shù)也是有順序規(guī)范的,這是應用中應當注意的,例如PLL的設定需要在使能之前,一旦PLL使能后參數(shù)不可更改。
經(jīng)過此番設置后,由于我的電路板上是8Mhz晶振,所以系統(tǒng)時鐘為72Mhz,高速總線和低速總線2都為72Mhz,低速總線1為36Mhz,ADC時鐘為12Mhz,USB時鐘經(jīng)過1.5分頻設置就可以實現(xiàn)48Mhz的數(shù)據(jù)傳輸。
一般性的時鐘設置需要先考慮系統(tǒng)時鐘的來源,是內(nèi)部RC還是外部晶振還是外部的振蕩器,是否需要PLL。然后考慮內(nèi)部總線和外部總線,最后考慮外設的時鐘信號。遵從先倍頻作為CPU時鐘,然后在由內(nèi)向外分頻,下級遷就上級的原則有點兒類似PCB制圖的規(guī)范化要求,在這里也一樣。
評論