时钟分为 :FCLK(主要给cup用的),HCLK (给高速设备提供,如lcd,camera等),PCLK(给低速设备如:usart,i2c等)
这些时钟的源头是12mhz的晶振提供的,它通过pll(锁相环-不知道是什么)来提升时钟频率.
其中pll分为:MPLL(main pll 也就是主要的锁相环),UPLL(USB pll usb 锁相环);
主要说说MPLL
->
12MHZ->MPLL=FCLK->HDIV=HCLK (提供给AHB总线) ->
->
=FCLK->PDIV=PCLK(提供给APB总线)
来说说大致步骤
1: RESET芯片稳定一段时间之后变为高电平,之后程序才能运行。
2:MPLL根据OM【3:2】的值来选FCLK=晶振频率12MHZ
3:MPLL锁存OM【3:2】的值
4:设置MPLL 在LOCKtime时间内 CPU 停止工作 用了设置MPLL
5:MPLL设置完之后,等MPLL输出稳定的新频率时钟之后,CPU才以新频率运行。
这只是内部是怎么运行的
下面是写代码操作
.text
.global _start
_start:
ldr r0, =0x53000000
mov r1, #0x0
str r1, [r0]
/*设置MPLL , PCKL : HCLK : PCLK = 400M : 100M : 50M*/
/*LOCKTIME(0x4C000000) = 0xffffffff 这里设不设置无所谓*/
ldr r0, =0x4c000000
ldr r1, =0xffffffff
str r1, [r0]
/*CLKDIVN(0x4C000014) = 0x5 , 周期FCLK : HCLK : PCLK = 1: 4 : 8*/
ldr r0, =0x4c000014
mov r1, #0x5
str r1, [r0]
/*设置 CPU工作于异步模式,必须这么设置,芯片的时钟NOTE里面有说明*/
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000
mcr p15,0,r0,c1,c0,0
/*设置 MPLLCON(0x4C000004) = (92 <<12) | (1 << 4) | (1 <<0)*/
/*
*m = MDIV+8 = 92+8=100
*P = PDIV+2 = 1+2 =3
*s = SDIV =1
*FCLK = 2*m*Fin/(P*2^s) = 2*100*12/(3*2^0)
*/
ldr r0, =0x4C000004
ldr r1, =(92 <<12) | (1 << 4) | (1 <<0)
str r1, [r0]
/*一旦设置PLL ,锁相环机会锁定locktime 直到PLL输出稳定?/
/*
*然后CPU才工作于新的时钟频率FCLK
*
/
之后我们可以看到 同样的一个程序,设置后时钟的程序,led的灯闪的更快了。