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

          新聞中心

          STM32時(shí)鐘設(shè)置

          作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
          3.5的庫中什么也不用做。已經(jīng)在啟動(dòng)文件中設(shè)置好了時(shí)鐘。

          大家都知道在使用單片機(jī)時(shí),時(shí)鐘速度決定于外部晶振或內(nèi)部RC振蕩電路的頻率,是不可以改變的。而ARM的出現(xiàn)打破了這一傳統(tǒng)的法則,可以通過軟件隨意改變時(shí)鐘速度。這一出現(xiàn)讓我們的設(shè)計(jì)更加靈活,但是也給我們的設(shè)計(jì)增加了復(fù)雜性。為了讓用戶能夠更簡(jiǎn)單的使用這一功能,STM32的庫函數(shù)已經(jīng)為我們?cè)O(shè)計(jì)的更加簡(jiǎn)單方便。

          本文引用地址:http://www.ex-cimer.com/article/201611/322746.htm

          在比較靠前的版本中,我們需要向下面那樣設(shè)置時(shí)鐘:

          ErrorStatus HSEStartUpStatus;


          void RCC_Configuration(void)
          {
          RCC_DeInit(); // RCC system reset(for debug purpose)

          RCC_HSEConfig(RCC_HSE_ON);// Enable HSE

          HSEStartUpStatus = RCC_WaitForHSEStartUp();// Wait till HSE is ready

          if (HSEStartUpStatus == SUCCESS)// 當(dāng)HSE準(zhǔn)備完畢切振蕩穩(wěn)定后
          {
          RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK
          RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK
          RCC_PCLK1Config(RCC_HCLK_Div2);// PCLK1 = HCLK/2
          FLASH_SetLatency(FLASH_Latency_2);// Flash 2 wait state
          FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);// Enable Prefetch Buffer
          RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);// PLLCLK = 8MHz * 9 = 72 MHz
          RCC_PLLCmd(ENABLE);// Enable PLL
          while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
          {;// Wait till PLL is ready
          }
          RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);// Select PLL as system clock source
          while (RCC_GetSYSCLKSource() != 0x08)// Wait till PLL is used as system clock source
          {
          ;
          }
          }
          }

          隨之函數(shù)庫的不斷升級(jí),到3.0以上時(shí),我們就不用再這樣編寫時(shí)鐘設(shè)置了,我們只要做如下兩部即可:

          第一個(gè): system_stm32f10x.c 中#define SYSCLK_FREQ_72MHz 72000000
          第二個(gè):調(diào)用SystemInit()

          說明:在stm32固件庫3.0中對(duì)時(shí)鐘頻率的選擇進(jìn)行了大大的簡(jiǎn)化,原先的一大堆操作都在后臺(tái)進(jìn)行。系統(tǒng)給出的函數(shù)為SystemInit()。但在調(diào)用前還需要進(jìn)行一些宏定義的設(shè)置,具體的設(shè)置在system_stm32f10x.c文件中。

          文件開頭就有一個(gè)這樣的定義:
          //#define SYSCLK_FREQ_HSEHSE_Value
          //#define SYSCLK_FREQ_20MHz 20000000
          //#define SYSCLK_FREQ_36MHz 36000000
          //#define SYSCLK_FREQ_48MHz 48000000
          //#define SYSCLK_FREQ_56MHz 56000000
          #define SYSCLK_FREQ_72MHz 72000000

          ST 官方推薦的外接晶振是 8M,所以庫函數(shù)的設(shè)置都是假定你的硬件已經(jīng)接了 8M 晶振來運(yùn)算的.以上東西就是默認(rèn)晶振 8M 的時(shí)候,推薦的 CPU 頻率選擇.在這里選擇了:
          #define SYSCLK_FREQ_72MHz 72000000
          也就是103系列能跑到的最大值72M

          然后這個(gè) C文件繼續(xù)往下看
          #elif defined SYSCLK_FREQ_72MHz
          const uint32_t SystemFrequency= SYSCLK_FREQ_72MHz;
          const uint32_t SystemFrequency_SysClk= SYSCLK_FREQ_72MHz;
          const uint32_t SystemFrequency_AHBClk= SYSCLK_FREQ_72MHz;
          const uint32_t SystemFrequency_APB1Clk= (SYSCLK_FREQ_72MHz/2);
          const uint32_t SystemFrequency_APB2Clk= SYSCLK_FREQ_72MHz;

          這就是在定義了CPU跑72M的時(shí)候,各個(gè)系統(tǒng)的速度了.他們分別是:硬件頻率,系統(tǒng)時(shí)鐘,AHB總線頻率,APB1總線頻率,APB2總線頻率.再往下看,看到這個(gè)了:
          #elif defined SYSCLK_FREQ_72MHz
          static void SetSysClockTo72(void);

          這就是定義 72M 的時(shí)候,設(shè)置時(shí)鐘的函數(shù).這個(gè)函數(shù)被 SetSysClock ()函數(shù)調(diào)用,而SetSysClock ()函數(shù)則是被 SystemInit()函數(shù)調(diào)用.最后 SystemInit()函數(shù),就是被你調(diào)用的了。

          所以設(shè)置系統(tǒng)時(shí)鐘的流程就是: 首先用戶程序調(diào)用 SystemInit()函數(shù),這是一個(gè)庫函數(shù),然后 SystemInit()函數(shù)里面,進(jìn)行了一些寄存器必要的初始化后,就調(diào)用 SetSysClock()函數(shù). SetSysClock()函數(shù)根據(jù)那個(gè)#define SYSCLK_FREQ_72MHz 72000000 的宏定義,知道了要調(diào)用SetSysClockTo72()這個(gè)函數(shù),于是,就一堆麻煩而復(fù)雜的設(shè)置~!@#$%^然后,CPU跑起來了,而且速度是 72M.




          關(guān)鍵詞: STM32時(shí)鐘設(shè)

          評(píng)論


          技術(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); })();