<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32F10x芯片時(shí)鐘控制總結

STM32F10x芯片時(shí)鐘控制總結

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò ) 收藏

1、介紹

STM32F10x芯片的時(shí)鐘控制主要包括以下幾個(gè)方面知識:時(shí)鐘源的選擇(HSE、HIS、PLL)、系統時(shí)鐘頻率的配置、總線(xiàn)(AHB、APB2、APB1)時(shí)鐘的配置、總線(xiàn)(AHB、APB2、APB1)設備時(shí)鐘的使能/除能、總線(xiàn)(AHB、APB2、APB1)設備的復位。

本文引用地址:http://dyxdggzs.com/article/201611/316901.htm

2、系統時(shí)鐘框圖

STM32F10x可以用三種不同的時(shí)鐘源來(lái)驅動(dòng)系統時(shí)鐘(SYSCLK):HSI振蕩器時(shí)鐘;HSE外部時(shí)鐘和PLL時(shí)鐘。他們之間的關(guān)系如附件所示(時(shí)鐘樹(shù))。

從時(shí)鐘樹(shù)中可以看出一下幾點(diǎn):

l系統時(shí)鐘的來(lái)源可以是HSI振蕩器時(shí)鐘、PLL時(shí)鐘、或者HSE時(shí)鐘;且系統總線(xiàn)時(shí)鐘最大值為72MHz,AHB和APB2總線(xiàn)最大頻率也是72MHz,APB1總線(xiàn)最大允許頻率是36MHz;而Cortex-M3核的自由運行時(shí)鐘是FCLK(來(lái)源于A(yíng)HB總線(xiàn));

lstm32f10x芯片總共有四個(gè)時(shí)鐘源:HSE、LSE(外部時(shí)鐘信號);HIS、LSI(內部時(shí)鐘信號),芯片內的其他所有時(shí)鐘都是通過(guò)如上四個(gè)時(shí)鐘源分頻得來(lái);

lRTC的時(shí)鐘來(lái)源可以是HSE外部時(shí)鐘128分頻之后的時(shí)鐘、或者LSE外部時(shí)鐘(32.768kHz)或者內部LSI振蕩器時(shí)鐘;

lIWDG的時(shí)鐘來(lái)源必須是內部LSI振蕩器時(shí)鐘;

lMCO引腳的時(shí)鐘輸出源的來(lái)源有:PLL時(shí)鐘的2分頻、內部HIS時(shí)鐘、外部HSE時(shí)鐘以及系統時(shí)鐘。

lPLL時(shí)鐘的來(lái)源可以是HIS振蕩器時(shí)鐘或者HSE外部提供的時(shí)鐘;

lUSB外設是直接使用PLL輸出時(shí)鐘(如果使用USB外設,HSE和PLL時(shí)鐘都必須使能,且系統時(shí)鐘必須是48MHz或者72MHz);AHB總線(xiàn)的時(shí)鐘輸入源的是系統時(shí)鐘;APB1和APB2的時(shí)鐘來(lái)源是AHB;

l始終安全系統(CSS)必須由HSE提供時(shí)鐘源;若CSS激活且HSE時(shí)鐘出現故障,則引發(fā)CSS中斷,同時(shí)產(chǎn)生NMI(NMI中斷是不可屏蔽的),NMI將被不斷執行,知道CSS中斷掛起位被清除;

l定時(shí)器時(shí)鐘要么等于總線(xiàn)時(shí)鐘,要么等于總線(xiàn)時(shí)鐘頻率的兩倍,這取決于總線(xiàn)分頻系數的值是否為1;

l當HIS被用于作為PLL時(shí)鐘輸入時(shí),系統時(shí)鐘能得到的最大頻率是64MHz;

lCortex-M3內核的自由運行時(shí)間是FCLK。

3、時(shí)鐘寄存器描述

l時(shí)鐘控制寄存器:RCC_CR

l時(shí)鐘配置寄存器:RCC_CFGR

l時(shí)鐘中斷寄存器:RCC_CIR

lAPB2外設復位寄存器:RCC_APB2RSTR

lAPB1外設復位寄存器:RCC_APB1RSTR

lAHB外設時(shí)鐘使能寄存器:RCC_AHBENR

lAPB2外設時(shí)鐘使能寄存器:RCC_APB2ENR

lAPB1外設時(shí)鐘使能寄存器:RCC_APB1ENR

l備份域控制寄存器:RCC_BDCR

l控制/狀態(tài)寄存器:RCC_CSR

4、時(shí)鐘控制主要按照以下五步進(jìn)行控制

l系統復位后,HSI振蕩器被選為系統時(shí)鐘;

l調用RCC_DeInit()函數將外設RCC寄存器重置為缺省值;

l選擇系統時(shí)鐘:

?若選擇HSE做系統時(shí)鐘:先調用RCC_HSEConfig()使能HSE,然后調用RCC_WaitForHSEStartUp()函數等待HSE起震,最后調用RCC_GetFlagStatus()函數獲取HSE晶振狀態(tài),查看HIE晶振是否就緒;;

?若選擇HSI做系統時(shí)鐘:首先調用RCC_AdjustHSICalibrationValue()函數調整內部高速晶振校準值(也可以不用,使用系統預留值),然后調用RCC_HSICmd()函數使能HSI,最后調用RCC_GetFlagStatus()函數獲取HSI晶振狀態(tài),查看HIS晶振是否就緒;

?若要使用PLL做系統時(shí)鐘,如前面兩步將HSE和HIS設定好之后,調用RCC_PLLConig()選擇PLL時(shí)鐘源并設定倍頻系數,最后調用RCC_PLLCmd()使能PLL,最后調用RCC_GetFlagStatus()函數獲取PLL晶振狀態(tài),查看PLL是否就緒;。

l最后,在以上時(shí)鐘配置就緒之后,調用RCC_SYSCLKConfig()函數選擇系統時(shí)鐘輸入源:HSE/HIS/PLL。

至此,系統時(shí)鐘設定完成,可以調用RCC_GetSYSCLKSource()函數來(lái)獲取當前系統時(shí)鐘是使用的哪個(gè)時(shí)鐘(檢測設置是否成功):0x010:HIS;x040:HSE;x08:PLL。

l然后是總線(xiàn)時(shí)鐘設置:設置AHB總線(xiàn)時(shí)鐘:調用RCC_HCLKConfig()函數;設置APB1總線(xiàn)時(shí)鐘:調用RCC_PCLK1Config()函數;設置APB2總線(xiàn)時(shí)鐘:調用RCC_PCLK2Config()函數。其中AHB總線(xiàn)時(shí)鐘來(lái)源于SYSCLK總線(xiàn)時(shí)鐘,APB1和APB2總線(xiàn)時(shí)鐘來(lái)源于A(yíng)HB總線(xiàn)時(shí)鐘。注意:這三個(gè)時(shí)鐘的設置可以在系統時(shí)鐘、PLL、HSE、HIS啟動(dòng)之前設置,也可以在他們之后設置,但習慣在PLL配置之前。

l最后是根據應用需要配置各總線(xiàn)上的外圍設備,啟動(dòng)/停用外圍設備的函數有:RCC_AHBPeriphClockCmd();RCC_APB2PeriphClockCmd();RCC_APB1PeriphClockCmd();復位總線(xiàn)上的設備函數:RCC_APB2PeriphResetCmd();RCC_APB1PeriphResetCmd();具體可以查看RCC固件庫。

注意:使能外設時(shí)鐘的函數必須在調用外設初始化函數XXX_Init()函數之前,否則可能會(huì )導致對應外設初始化失敗,編譯器卻不會(huì )因此報錯。

5、時(shí)鐘控制例子

void SetSysClockToHSE(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(SUCCESS == HSEStartUpStatus)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_0);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div1);

RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);

while(0x04 != RCC_GetSYSCLKSource())

{

}

}

else

{

}

}

void SetSysClockTo20(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(SUCCESS == HSEStartUpStatus)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_0);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div1);

RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_5);

RCC_PLLCmd(ENABLE);

while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY))

{

}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(0x08 != RCC_GetSYSCLKSource())

{

}

}

else

{

}

}

void SetSysClockTo36(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(SUCCESS == HSEStartUpStatus)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_1);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div1);

RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);

RCC_PLLCmd(ENABLE);

while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY))

{

}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(0x08 != RCC_GetSYSCLKSource())

{

}

}

else

{

}

}

void SetSysClockTo48(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(SUCCESS == HSEStartUpStatus)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_1);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);

RCC_PLLCmd(ENABLE);

while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY))

{

}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(0x08 != RCC_GetSYSCLKSource())

{

}

}

else

{

}

}

void SetSysClockTo72(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(SUCCESS == HSEStartUpStatus)

{

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_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

RCC_PLLCmd(ENABLE);

while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY))

{

}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(0x08 != RCC_GetSYSCLKSource())

{

}

}

else

{

}

}

6、系統時(shí)鐘安全系統CSS

在實(shí)際應用中,經(jīng)常出現由于晶體振蕩器在運行中失去作用,造成微處理器的時(shí)鐘源丟失,從而出現死機的現象,導致系統出錯。為避免發(fā)聲這種嚴重錯誤,STM32F10X系列芯片提供了一個(gè)時(shí)鐘安全系統CCS機制。如下圖:

時(shí)鐘安全系統被激活后,時(shí)鐘監控器將實(shí)時(shí)監控外部高速振蕩器;如果HSE時(shí)鐘發(fā)生故障,外部振蕩器自動(dòng)被關(guān)閉,產(chǎn)生時(shí)鐘安全中斷,此中斷被連接到Cortex-M3的NVIC中斷;與此同時(shí)CSS將內部RC振蕩器(HSI)切換為STM32的系統時(shí)鐘源。

注意:一旦CSS被激活,當HSE時(shí)鐘出現故障產(chǎn)生CSS中斷,同時(shí)自動(dòng)產(chǎn)生NMI,NMI將不斷執行,直到CSS中斷掛起位被清除。因此在NMI的處理程序中,必須通過(guò)設置時(shí)鐘中斷寄存器RCC_CIR中的CSSC位(軟件置1清除)來(lái)清除CSS中斷。(其實(shí)RCC的其他各時(shí)鐘源的就緒中斷標志,也都需要通過(guò)軟件置1來(lái)清除,只是CSS是NMI中斷(不可屏蔽中斷),其他中斷需要設置相應位允許中斷,并要在NVIC中打開(kāi)RCC的中斷通道)

7、系統時(shí)鐘安全系統CSS應用

啟動(dòng)時(shí)鐘安全系統CCS:

RCC_ClockSecuritySystemCmd(ENABLE);

編寫(xiě)NMI中斷處理函數:

void NMI_Handler(void)

{

if(RESET != RCC_GetITStatus(RCC_IT_CSS))

{/* HSE、PLL已經(jīng)被禁止,但PLL設置未變*/

……/*客戶(hù)添加相應的系統保護代碼處理*/

/*下面添加HSE恢復后的預設代碼*/

RCC_HSEConfig(RCC_HSE_ON);

RCC_ITConfig(RCC_IT_HSERDY,ENABLE);

RCC_ITConfig(RCC_IT_PLLRDY,ENABLE);

RCC_ClearITPendingBit(RCC_IT_CSS);

/*至此一旦HSE時(shí)鐘恢復,將發(fā)生HSERDY中斷,在RCC中斷處理程序中,可以將系統時(shí)鐘設置到以前的狀態(tài)*/

}

}

編寫(xiě)RCC中斷處理函數:

void RCC_IRQHandler(void)

{

if(RESET != RCC_GetITStatus(RCC_IT_HSERDY))

{

/*添加相應處理*/

RCC_ClearITPendingBit(RCC_IT_HSERDY);

}

if(RESET != RCC_GetITStatus(RCC_IT_PLLRDY))

{

/*添加相應處理*/

RCC_ClearITPendingBit(RCC_IT_PLLRDY);

}

}

8、輸出芯片內部時(shí)鐘

STM32F10x芯片支持將內部時(shí)鐘通過(guò)PA.8輸出,但是必須注意GPIO輸出管腳最大響應頻率為50MHz,如果超過(guò)這個(gè)頻率,輸出的波形將會(huì )失真。應用實(shí)例如下:

首先配置端口PA.8

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

然后調用函數RCC_MCOConfig(RCC_MCO)選擇要輸出的內部時(shí)鐘:RCC_MCO可以是:

RCC_MCO_NoClock——無(wú)時(shí)鐘輸出

RCC_MCO_SYSCLK——輸出系統時(shí)鐘

RCC_MCO_HSI——輸出內部高速8MHz的RC振蕩器時(shí)鐘

RCC_MCO_HSE——輸出外部時(shí)鐘信號

RCC_MCO_PLLCLK_Div2——輸出PLL倍頻后的二分頻時(shí)鐘



關(guān)鍵詞: STM32F10x時(shí)鐘控

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>