新聞中心

STM32時鐘控制RCC

作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
對于單片機系統(tǒng)來說,CPU和總線以及外設(shè)的時鐘設(shè)置是非常重要的,因為沒有時鐘就沒有時序,組合電路能干什么想必各位心里都清楚。其實時鐘的學習這部分應該提前一些,但由于一開始時間比較短,有些急于求成,所以直接使用了萬利給的例程,姑且跳過了這一步。介于下面我計劃要學習的任務(wù)都涉及到兆級的高速傳輸,例如全速USB,DMA等等,所以不能再忽略時鐘啦,必須要仔細研究一下。


我學習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)外圍總線。二者分別適用于高速與相對低速設(shè)備的連接。


由于時鐘是一個由內(nèi)而外的東西,具體設(shè)置要從寄存器開始。

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倍,這些設(shè)置都需要在初始化階段完成。為了方便說明,我借用一下例程的RCC設(shè)置函數(shù),并用中文注釋的形式加以說明:


//在此指出上面的注釋頭應該是復制過來的,寫錯了...不過沒關(guān)系,反正沒參數(shù)需要說明,重要的是函數(shù)體。
static void RCC_Config(void)
{

本文引用地址:http://butianyuan.cn/article/201611/322968.htm


RCC_DeInit();


RCC_HSEConfig(RCC_HSE_ON);


HSEStartUpStatus = RCC_WaitForHSEStartUp();

if (HSEStartUpStatus == SUCCESS)
{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);


FLASH_SetLatency(FLASH_Latency_2);


RCC_HCLKConfig(RCC_SYSCLK_Div1);


RCC_PCLK2Config(RCC_HCLK_Div1);


RCC_PCLK1Config(RCC_HCLK_Div2);


RCC_ADCCLKConfig(RCC_PCLK2_Div6);


//上面這句例程中缺失了,但卻很關(guān)鍵

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);


RCC_PLLCmd(ENABLE);



while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{}


RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


while (RCC_GetSYSCLKSource() != 0x08)
{}
}


//使能外圍接口總線時鐘,注意各外設(shè)的隸屬情況,不同芯片的分配不同,到時候查手冊就可以
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |
RCC_APB2Periph_AFIO, ENABLE);
}


由上述程序可以看出系統(tǒng)時鐘的設(shè)定是比較復雜的,外設(shè)越多,需要考慮的因素就越多。同時這種設(shè)定也是有規(guī)律可循的,設(shè)定參數(shù)也是有順序規(guī)范的,這是應用中應當注意的,例如PLL的設(shè)定需要在使能之前,一旦PLL使能后參數(shù)不可更改。

經(jīng)過此番設(shè)置后,由于我的電路板上是8Mhz晶振,所以系統(tǒng)時鐘為72Mhz,高速總線和低速總線2都為72Mhz,低速總線1為36Mhz,ADC時鐘為12Mhz,USB時鐘經(jīng)過1.5分頻設(shè)置就可以實現(xiàn)48Mhz的數(shù)據(jù)傳輸。

一般性的時鐘設(shè)置需要先考慮系統(tǒng)時鐘的來源,是內(nèi)部RC還是外部晶振還是外部的振蕩器,是否需要PLL。然后考慮內(nèi)部總線和外部總線,最后考慮外設(shè)的時鐘信號。遵從先倍頻作為CPU時鐘,然后在由內(nèi)向外分頻,下級遷就上級的原則有點兒類似PCB制圖的規(guī)范化要求,在這里也一樣。


關(guān)鍵詞: STM32時鐘控制RC

評論


技術(shù)專區(qū)

關(guān)閉