<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          STM32時(shí)鐘控制RCC

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


          我學(xué)習(xí)RCC的參考資料:
          技術(shù)文檔0427及其中文翻譯版STM32F10xxx_Library_Manual_ChineseV2的第十五章和RM0008_CH參考手冊。

          準(zhǔn)備知識:
          片上總線標(biāo)準(zhǔn)種類繁多,而由ARM公司推出的AMBA片上總線受到了廣大IP開發(fā)商和SoC系統(tǒng)集成者的青睞,已成為一種流行的工業(yè)標(biāo)準(zhǔn)片上結(jié)構(gòu)。AMBA規(guī)范主要包括了AHB(Advanced High performance Bus)系統(tǒng)總線和APB(Advanced Peripheral Bus)外圍總線。二者分別適用于高速與相對低速設(shè)備的連接。


          由于時(shí)鐘是一個(gè)由內(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;

          這些寄存器的具體定義和使用方式參見芯片手冊,在此不贅述,因?yàn)镃語言的開發(fā)可以不和他們直接打交道,當(dāng)然如果能夠加以理解和記憶,無疑是百利而無一害。

          相信細(xì)心的朋友早就發(fā)現(xiàn)板子上只有8Mhz的晶振,而增強(qiáng)型最高工作頻率為72Mhz,顯然需要用PLL倍頻9倍,這些設(shè)置都需要在初始化階段完成。為了方便說明,我借用一下例程的RCC設(shè)置函數(shù),并用中文注釋的形式加以說明:


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

          本文引用地址:http://www.ex-cimer.com/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í)鐘,注意各外設(shè)的隸屬情況,不同芯片的分配不同,到時(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è)定是比較復(fù)雜的,外設(shè)越多,需要考慮的因素就越多。同時(shí)這種設(shè)定也是有規(guī)律可循的,設(shè)定參數(shù)也是有順序規(guī)范的,這是應(yīng)用中應(yīng)當(dāng)注意的,例如PLL的設(shè)定需要在使能之前,一旦PLL使能后參數(shù)不可更改。

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

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


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

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();