在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32F10x芯片時(shí)鐘控制總結(jié)

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

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

            1、介紹

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            lCortex-M3內(nèi)核的自由運(yùn)行時(shí)間是FCLK。

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

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

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

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

            lAPB2外設(shè)復(fù)位寄存器:RCC_APB2RSTR

            lAPB1外設(shè)復(fù)位寄存器:RCC_APB1RSTR

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

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

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

            l備份域控制寄存器:RCC_BDCR

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

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

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

            l調(diào)用RCC_DeInit()函數(shù)將外設(shè)RCC寄存器重置為缺省值;

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

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

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

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

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

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

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

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

            注意:使能外設(shè)時(shí)鐘的函數(shù)必須在調(diào)用外設(shè)初始化函數(shù)XXX_Init()函數(shù)之前,否則可能會(huì)導(dǎo)致對(duì)應(yīng)外設(shè)初始化失敗,編譯器卻不會(huì)因此報(bào)錯(cuò)。

            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、系統(tǒng)時(shí)鐘安全系統(tǒng)CSS

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

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

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

            7、系統(tǒng)時(shí)鐘安全系統(tǒng)CSS應(yīng)用

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

            RCC_ClockSecuritySystemCmd(ENABLE);

            編寫NMI中斷處理函數(shù):

            void NMI_Handler(void)

            {

            if(RESET != RCC_GetITStatus(RCC_IT_CSS))

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

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

            /*下面添加HSE恢復(fù)后的預(yù)設(shè)代碼*/

            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ù),將發(fā)生HSERDY中斷,在RCC中斷處理程序中,可以將系統(tǒng)時(shí)鐘設(shè)置到以前的狀態(tài)*/

            }

            }

            編寫RCC中斷處理函數(shù):

            void RCC_IRQHandler(void)

            {

            if(RESET != RCC_GetITStatus(RCC_IT_HSERDY))

            {

            /*添加相應(yīng)處理*/

            RCC_ClearITPendingBit(RCC_IT_HSERDY);

            }

            if(RESET != RCC_GetITStatus(RCC_IT_PLLRDY))

            {

            /*添加相應(yīng)處理*/

            RCC_ClearITPendingBit(RCC_IT_PLLRDY);

            }

            }

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

            STM32F10x芯片支持將內(nèi)部時(shí)鐘通過(guò)PA.8輸出,但是必須注意GPIO輸出管腳最大響應(yīng)頻率為50MHz,如果超過(guò)這個(gè)頻率,輸出的波形將會(huì)失真。應(yīng)用實(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);

            然后調(diào)用函數(shù)RCC_MCOConfig(RCC_MCO)選擇要輸出的內(nèi)部時(shí)鐘:RCC_MCO可以是:

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

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

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

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

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



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

            評(píng)論


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

            關(guān)閉