新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM學習《三》PLL時鐘配置——讓心臟跳起來!

        ARM學習《三》PLL時鐘配置——讓心臟跳起來!

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

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

        本文引用地址:http://www.104case.com/article/201611/318956.htm

        #defineSYSCTL_RCC0x400FE060//運行模式時鐘配置寄存器地址

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

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

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

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

        #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位置一,該位叫做時鐘門空位。

        下面寫設置時鐘函數:

        void SysCtlClockSet( ) //設置系統時鐘

        {

        unsigned longulRCC=0;

        ulRCC |= SYSCTL_RCC_BYPASS;//旁路PLL

        ulRCC |= SYSCTL_RCC_USESYSDIV; //使能系統分頻器

        ulRCC|=SYSCTL_RCC_IOSCDIS; //內部時鐘禁能

        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 ; //晶振設置8M

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

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

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

        {break;}

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

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

        }

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




        關鍵詞: ARM學習PLL時鐘配

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 依兰县| 湟中县| 灌云县| 论坛| 芜湖县| 多伦县| 内乡县| 石泉县| 离岛区| 潍坊市| 英吉沙县| 新昌县| 樟树市| 唐河县| 博罗县| 宁阳县| 明溪县| 莱芜市| 营口市| 嘉义县| 平利县| 潍坊市| 天津市| 工布江达县| 囊谦县| 庆阳市| 丹江口市| 桐城市| 乐至县| 濉溪县| 富民县| 凉城县| 安陆市| 和政县| 大安市| 鸡东县| 宁安市| 平湖市| 邵武市| 大余县| 云霄县|