在初始化体系时ARM比51多了一项重要的作业,那便是时钟装备。为什么ARM要进行繁琐的时钟装备,原因之一便是在ARM构架中,体系充分考虑到了每种外设的功耗问题,有的外设在咱们的工程中有时底子用不着,闲着会糟蹋功耗(就像屋里没人亮着灯相同)。ARM爽性位每个外设设置一些寄存器,这些寄存器能够办理这些外设的时钟,在这里咱们能够设置每种外设的时钟巨细(或许说时钟分频),不必的时分咱们能够不舱位这些时钟。
在默许状态下(便是不做任何设置),每种外设的时钟都是封闭的。所以在体系初始化的时分咱们要进行时钟设置,外设(如定时器)才干正常的作业。在这里我拿LM3S8962开发板为例进行时钟装备,其实时钟装备说白了便是对体系控制的某些寄存器进行设置。在LM3S系列的MCU中关键是对RCC运转形式时钟装备寄存器进行装备,先来看一下头文件对RCC的界说:
#define
留意SYSCTL_RCC还不算是地址,要将SYSCTL_RCC转化成可任意操作的寄存器,在上篇文章中我说了,是这样来转化的:
#define
为什么是这样,上篇文章就现已解说过了,不多说。
下面的一些预界说是RCC寄存器中每个位的值和称号,这些不是地址,仅仅一些数值,每一位或许每几位的数值。
#define SYSCTL_RCC_ACG
#define SYSCTL_RCC_SYSDIV_M
#define SYSCTL_RCC_USESYSDIV
#define SYSCTL_RCC_PWRDN
#define SYSCTL_RCC_BYPASS
#define SYSCTL_RCC_XTAL_M
#define SYSCTL_RCC_OSCSRC_M
#define SYSCTL_RCC_OSCSRC_MAIN
#define SYSCTL_RCC_IOSCDIS
#define SYSCTL_RCC_MOSCDIS
如:#define SYSCTL_RCC_ACG
下面写设置时钟函数:
void SysCtlClockSet( ) //设置体系时钟
{
unsigned long
ulRCC |= SYSCTL_RCC_BYPASS;
ulRCC |= SYSCTL_RCC_USESYSDIV; //使能体系分频器
ulRCC|=SYSCTL_RCC_IOSCDIS; //内部时钟禁能
ulRCC&=~(SYSCTL_RCC_OSCSRC_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中止
while((HWREG(SYSCTL_RIS) & SYSCTL_INT_PLL_LOCK)) //等候PLL有用
ulRCC &= ~(SYSCTL_RCC_BYPASS); //使能PLL
HWREG(SYSCTL_RCC) = ulRCC; //设置成功
}
上面的函数便是对RCC寄存器的每一项进行设置,在51中一个赋值查办完事,在这里要这么杂乱,由于ARM的寄存器以及内容实在是太多了。ARM的心脏跳动起来了,就能够做其他活了,下次我要操作IO口了。