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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM學(xué)習(xí)《三》PLL時鐘配置——讓心臟跳起來!

          ARM學(xué)習(xí)《三》PLL時鐘配置——讓心臟跳起來!

          作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
          在初始化系統(tǒng)時ARM比51多了一項重要的工作,那就是時鐘配置。為什么ARM要進(jìn)行繁瑣的時鐘配置,原因之一就是在ARM構(gòu)架中,系統(tǒng)充分考慮到了每種外設(shè)的功耗問題,有的外設(shè)在我們的工程中有時根本用不著,閑著會浪費(fèi)功耗(就像屋里沒人亮著燈一樣)。ARM干脆位每個外設(shè)設(shè)置一些寄存器,這些寄存器可以管理這些外設(shè)的時鐘,在這里我們可以設(shè)置每種外設(shè)的時鐘大?。ɑ蛘哒f時鐘分頻),不用的時候我們可以不開啟這些時鐘。

          在默認(rèn)狀態(tài)下(就是不做任何設(shè)置),每種外設(shè)的時鐘都是關(guān)閉的。所以在系統(tǒng)初始化的時候我們要進(jìn)行時鐘設(shè)置,外設(shè)(如定時器)才能正常的工作。在這里我拿LM3S8962開發(fā)板為例進(jìn)行時鐘配置,其實時鐘配置說白了就是對系統(tǒng)控制的某些寄存器進(jìn)行設(shè)置。在LM3S系列的MCU中關(guān)鍵是對RCC運(yùn)行模式時鐘配置寄存器進(jìn)行配置,先來看一下頭文件對RCC的定義:

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

          #defineSYSCTL_RCC0x400FE060//運(yùn)行模式時鐘配置寄存器地址

          注意SYSCTL_RCC還不算是地址,要將SYSCTL_RCC轉(zhuǎn)化成可任意操作的寄存器,在上篇文章中我說了,是這樣來轉(zhuǎn)換的:

          #defineHWREG(x)(*((volatile unsigned long *)(x)))

          為什么是這樣,上篇文章就已經(jīng)解釋過了,不多說。

          下面的一些預(yù)定義是RCC寄存器中每個位的值和名稱,這些不是地址,只是一些數(shù)值,每一位或者每幾位的數(shù)值。

          #define SYSCTL_RCC_ACG0x08000000// Automatic clock gating

          #define SYSCTL_RCC_SYSDIV_M0x07800000// System Clock Divisor.

          #define SYSCTL_RCC_USESYSDIV0x00400000// Enable System Clock Divider.

          #define SYSCTL_RCC_PWRDN0x00002000// PLL power down

          #define SYSCTL_RCC_BYPASS0x00000800// PLL bypass

          #define SYSCTL_RCC_XTAL_M0x000007C0//Crystalattached to main osc

          #define SYSCTL_RCC_OSCSRC_M0x00000030// Oscillator input select

          #define SYSCTL_RCC_OSCSRC_MAIN0x00000000// Use the main oscillator

          #define SYSCTL_RCC_IOSCDIS0x00000002// Internal oscillator disable

          #define SYSCTL_RCC_MOSCDIS0x00000001// Main oscillator disable

          如:#define SYSCTL_RCC_ACG0x08000000的意思是把RCC寄存器的第27位置一,該位叫做時鐘門空位。

          下面寫設(shè)置時鐘函數(shù):

          void SysCtlClockSet( ) //設(shè)置系統(tǒng)時鐘

          {

          unsigned longulRCC=0;

          ulRCC |= SYSCTL_RCC_BYPASS;//旁路PLL

          ulRCC |= SYSCTL_RCC_USESYSDIV; //使能系統(tǒng)分頻器

          ulRCC|=SYSCTL_RCC_IOSCDIS; //內(nèi)部時鐘禁能

          ulRCC&=~(SYSCTL_RCC_OSCSRC_M);//振蕩清零

          ulRCC &= ~(SYSCTL_RCC_XTAL_M );//晶振選擇位清零

          ulRCC|=SYSCTL_RCC_PWRDN;//PLL掉電

          ulRCC|=SYSCTL_SYSDIV_4;//選擇4分頻

          ulRCC|=SYSCTL_USE_PLL;//用PLL

          ulRCC|=SYSCTL_OSC_MAIN;//主振蕩器

          ulRCC|=SYSCTL_XTAL_8MHZ ; //晶振設(shè)置8M

          HWREG(SYSCTL_MISC) = SYSCTL_INT_PLL_LOCK; //屏蔽PLL中斷

          HWREG(SYSCTL_RCC) = ulRCC; //將設(shè)置值ulRCC寫入RCC寄存器

          while((HWREG(SYSCTL_RIS) & SYSCTL_INT_PLL_LOCK)) //等待PLL有效

          {break;}

          ulRCC &= ~(SYSCTL_RCC_BYPASS); //使能PLL

          HWREG(SYSCTL_RCC) = ulRCC; //設(shè)置成功

          }

          上面的函數(shù)就是對RCC寄存器的每一項進(jìn)行設(shè)置,在51中一個賦值語句完事,在這里要這么復(fù)雜,因為ARM的寄存器以及內(nèi)容實在是太多了。ARM的心臟跳動起來了,就可以做其他活了,下次我要操作IO口了。




          評論


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