微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM学习《三》PLL时钟配置——让心脏跳起来!

ARM学习《三》PLL时钟配置——让心脏跳起来!

时间:11-20 来源:互联网 点击:
在初始化系统时ARM比51多了一项重要的工作,那就是时钟配置。为什么ARM要进行繁琐的时钟配置,原因之一就是在ARM构架中,系统充分考虑到了每种外设的功耗问题,有的外设在我们的工程中有时根本用不着,闲着会浪费功耗(就像屋里没人亮着灯一样)。ARM干脆位每个外设设置一些寄存器,这些寄存器可以管理这些外设的时钟,在这里我们可以设置每种外设的时钟大小(或者说时钟分频),不用的时候我们可以不开启这些时钟。

在默认状态下(就是不做任何设置),每种外设的时钟都是关闭的。所以在系统初始化的时候我们要进行时钟设置,外设(如定时器)才能正常的工作。在这里我拿LM3S8962开发板为例进行时钟配置,其实时钟配置说白了就是对系统控制的某些寄存器进行设置。在LM3S系列的MCU中关键是对RCC运行模式时钟配置寄存器进行配置,先来看一下头文件对RCC的定义:

#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口了。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top