系统时钟(汇编语言程序设计)—①
一直不知道该怎么描述S3C6410的PLL(锁相环),表示很难理解,我也算是瞎猫去碰“死耗子”吧。
我就去按照韦东山老师讲述的Clock去大概描述一下吧(当然也是参考了网上的些许内容),表示不是很多,看的很蛋疼。
1、首先介绍一下PLL(锁相环)
S3C6410里面包含有三个PLL,APLL、MPLL以及EPLL,通过设置它们来达到操作CPU的工作频率的目的(哎,幸亏以前学过点PLL,要不现在可就真的坑爹了)。直接看图:
首先可以看到有三个PLL,工作时钟也就分为三组(感觉自己在说废话),APLL用来为ARM芯片提供工作时钟;MPLL为AXI、AHB以及APB(这三个东西是必须要明白的,很重要,不明白它三就不算是懂ARM硬件!)总线上设备提供工作时钟;EPLL为特殊外设,例如:视频解码器,图片解码器等,提供工作时钟。
2、然后就是三种工作时钟的产生了(AXI、AHB和APB)
ARM1176最高产生667MHz的工作频率。用户可以通过设置内部时钟分频器的值来控制输出工作时钟,而不需要修改PLL的工作频率。分频器可以选择1-16的分频数。再来看一张图片:
S3C6410内部通过AXI、AHB以及APB三种不同的总线,来控制不同的外设,关闭总线上的时钟频率可以达到系统节能的目的(用过ATMEGA、LPC的应该都很清楚吧)。AXI和AHB总线最高工作在133MHz下,APB总线最高工作在66MHz下。
由于这两个总线上(AXI/AHB和APB)的工作频率不一致,提供给AXI/AHB的频率为HCLK,提供给APB的频率为PCLK。在这两种总线上进行数据同步传输时会采用特殊逻辑单元。
我就说这么点吧(下面其实应该具体介绍一下寄存器配置,以及UART、SPI、MMC等的工作时钟的产生~~),因为好多东西一下子是很难理解的(对于我来说是的!),所以我就不写了。
3、那就是直接步入正题了:
设置一个ARM频率(ARMCLK)为531MHz;AXI/AHB的工作时钟频率(HCLK)为133MHz;APB的工作时钟频率(PCLK)为66.5MHz。同时也要求设置FOUTAPL和FOUTMPL都为532MHz;DOUTMPLL和DOUTAPLL均为256MHz;HCLKX2为266MHz~~
然后看图片(这是韦山东视频里面的,貌似有点小错误,我擦毫不清楚!!~~):
1)首先呢就是要设置锁定时间(LOCK_TIME)
如图:
PLL的锁定是需要一定时间的,这里并没有严格的要求,所以只需要按默认的情况来就哦了(其实这里完全可以不用设置)。
2)当CPU不是HCLK时,要设定为异步模式(这个我也不太清楚了就~~),然后设置好后就要等待直到CPU进入异步模式(这里只是需要来个循环检测就哦了~~)。
#define OTHERS
loop1:
3)就是设置CLK_DIV0(0X7E00_F020)
通过设置CLK_DIV0的相关位,来设置ARMCLK、HCLK、PCLK、HCLKX2、DOUTMPLL这几个频率值(仔细观察都是上面图的最后边的几个频率,对喽,就是这样,先要设置好后面的频率,再设置前面的APLL和MPLL,然后再切换就哦了~~)
首先呢,介绍下公式:
ARMCLK=DOUTAPLL/(ARM_RATIO+1)
HCLKX2=HCLKX2IN/(HCLKX2_RATIO+1)
HCLK=HCLKX2/(HCLK_RATIO+1)
PCLK=HCLKX2/(PCLK_RATIO+1)
DOUTMPLL=MOUTMPLL/(MPLL_RATIO+1)
#define ARM_RATIO
#define HCLKX2_RATIO
#define HCLK_RATIO
#define PCLK_RATIO
#define MPLL_RATIO
4)配置APLL_CON(0X7E00_F00C)
在这之前建议先看一下这个寄存器。图片:
直接看其位,根据公式设置就哦了~~
APLL_CON,FOUTAPL=MDIV*Fin/(PDIV*2^SDIV)
=266*12/(3*2^1)
=532MHz
#define APLL_CON_VAL
5)设置MPLL_CON(0X7E00_F010)
跟4)的步骤是一样的~~
看上面的图片,然后根据公式设置就哦了~~
MPLL_CON, FOUTMPL=MDIV*Fin/(PDIV*2^SDIV)
=266*12/(3*2^1)
=532MHz
#define MPLL_CON_VAL
然后就是我做的实验了:
首先上图:
start.S
.globl _start
_start:
halt:
clock.S
.globl clock_init
clock_init:
#define OTHERS
loop1:
#define ARM_RATIO
#define HCLKX2_RATIO
#define HCLK_RATIO
#define PCLK_RATIO
#define MPLL_RATIO
#define APLL_CON_VAL
#define MPLL_CON_VAL
led.c
void delay()
{
}
int main()
{
}
最后是Makefile:
led.bin: start.o clock.o led.o
%.o : %.S
%.o : %.c
clean: