您的位置 首页 基础

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

在初始化系统时ARM比51多了一项重要的工作,那就是时钟配置。为什么ARM要进行繁琐的时钟配置,原因之一就是在ARM构架中,系统充分考虑到了…

在初始化体系时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口了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/264449.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部