1、什么是时钟?SoC为什么需要时钟?
(1)生活中时钟是用来记录时间的,而在SOC中时钟代表了一种同步的节拍。
(2)SOC中的各部件在时钟系统的作用下协同工作。
2、时钟一般如何获得
(1)外部输入时钟信号,SOC通过引脚从外部输入时钟信号。
(2)外部晶体振荡器+内部时钟发生器产生时钟信号。
(3)外部晶体振荡器+内部时钟发生器+内部PLL产生高频时钟+内部分频器(各部件都有自己的分频器)产生各种频率时钟。
3、时钟设置步骤:
(1)、暂不使用PLL。
(2)、设置锁定时间,使用默认值即可。
(3)、设置PLL倍频后的目标值。
(4)、设置分频
(5)、设置各种PLL的MUX,使用PLL。
4、汇编代码实现
#define ELFIN_CLOCK_POWER_BASE0xE0100000
#define APLL_LOCK_OFFSET0x00
#define MPLL_LOCK_OFFSET0x08
#define APLL_CON0_OFFSET0x100
#define APLL_CON1_OFFSET0x104
#define MPLL_CON_OFFSET0x108
#define CLK_SRC0_OFFSET0x200
#define CLK_SRC1_OFFSET0x204
#define CLK_SRC2_OFFSET0x208
#define CLK_SRC3_OFFSET0x20c
#define CLK_SRC4_OFFSET0x210
#define CLK_SRC5_OFFSET0x214
#define CLK_SRC6_OFFSET0x218
#define CLK_SRC_MASK0_OFFSET 0x280
#define CLK_SRC_MASK1_OFFSET 0x284
#define CLK_DIV0_OFFSET0x300
#define CLK_DIV1_OFFSET0x304
#define CLK_DIV2_OFFSET0x308
#define CLK_DIV3_OFFSET0x30c
#define CLK_DIV4_OFFSET0x310
#define CLK_DIV5_OFFSET0x314
#define CLK_DIV6_OFFSET0x318
#define CLK_DIV7_OFFSET0x31c
#define APLL_MDIV 0x7d// 125
#define APLL_PDIV 0x3
#define APLL_SDIV 0x1
#define MPLL_MDIV0x29b// 667
#define MPLL_PDIV0xc
#define MPLL_SDIV0x1
#define set_pll(mdiv, pdiv, sdiv)(1<<31 | mdiv<<16 | pdiv<<8 | sdiv)
#define APLL_VALset_pll(APLL_MDIV,APLL_PDIV,APLL_SDIV)
#define MPLL_VALset_pll(MPLL_MDIV,MPLL_PDIV,MPLL_SDIV)
.global clock_init
clock_init:
ldrr0, =ELFIN_CLOCK_POWER_BASE
// 设置CLK_SRC0寄存器bit[0]选FINPLL
ldrr1, =0x0
strr1, [r0, #CLK_SRC0_OFFSET]
// 设置PLL后,时钟从输入源FIN提升到目标频率时,需要一定的时间。
ldrr1,=0x00000FFF
strr1,[r0, #APLL_LOCK_OFFSET]
str r1, [r0, #MPLL_LOCK_OFFSET]
// 设置APLL_CON0寄存器,FOUT = MDIV*FIN/(PDIV*2^(SDIV-1))=0x7d*24/(0x3*2^(1-1))=1000 MHz
ldrr1, =APLL_VAL
strr1, [r0, #APLL_CON0_OFFSET]
// 设置MPLL_CON0寄存器,FOUT = MDIV*FIN/(PDIV*2^SDIV)=0x29b*24/(0xc*2^1)= 667 MHz
ldrr1, =MPLL_VAL
strr1, [r0, #MPLL_CON_OFFSET]
// 设置CLK_DIV0寄存器清bit[0~31]。
ldr r1, [r0, #CLK_DIV0_OFFSET]
ldrr2, =0xFFFFFFFF
bicr1, r1, r2
// 设置CLK_DIV0寄存器[0~31]写相关位。
ldrr2, =((0<<0) | (4<<4) | (4<<8) | (1<<12) | (3<<16) | (1<<20) | (4<<24) | (1<<28))
orrr1, r1, r2
strr1, [r0, #CLK_DIV0_OFFSET]
// 设置CLK_SRC0寄存器。
ldrr1, [r0, #CLK_SRC0_OFFSET]
ldrr2, =((1<<0) | (1<<4) | (1<<8) | (1<<12) | (0<<16) | (0<<20) | (0<<24) | (1<<28))
orrr1, r1, r2
strr1, [r0, #CLK_SRC0_OFFSET]
movpc, lr
参考资料:《ARM裸机全集---朱有鹏老师》
上一篇:ARM怎么入门
下一篇:ARM裸机之点亮LED
设计资源 培训 开发板 精华推荐
- DC1096B,用于 LTC2642 16 位 +/-5V 无缓冲 Vout DAC 的演示板
- 基于Z16F2811AL20SG MCU的Z16F2800100ZCOG、ZNEO Z16F系列开发套件
- 51单片机计时器
- TS1581CM5 RN 5A双输入低压差稳压器典型应用电路
- 使用 Analog Devices 的 LTM4636-1IY 的参考设计
- AD8027AR-EBZ,AD8027AR 单路高速运算放大器评估板,采用 8 引脚 SOIC 封装
- BLHeli_s无刷电调
- LTC1503CMS8-2 演示板,高效无电感降压型 DC/DC 转换器,2.4 至 6Vin,2Vout @ 100mA
- LT3507 的典型应用 - 具有 LDO 的三路单片式降压型稳压器
- LT1935-WITT、1A、5V、SOT-23 升压转换器参考设计可在狭小空间内提供高功率