一、系统时钟结构分析
- OM[3]、OM[2]外部引脚接地使用晶振作为MPLLin
- MPLLCON控制MPLL输出时钟的P/M/S三个参数,直接决定了FCLK
- MPLL的计算公式
- CLKDIVN寄存器控制从FCLK生成HCLK和PCLK的分频
二、代码编写
实验目的
时钟FCLK=400M、HCLK=100M、PCLK=50M
CLKDIVN[2:1]=2'b10
CLKDIVN[0]=1'b1
CLKDIVN设置为0x05
MPLLCON设置参考以下官方表格,MPLLCON[19:12]=92,MPLLCON[9:4]=1,MPLLCON[1:0]=1(92 << 12) | (1 << 4) | (1<<0)
cpu需要设置为异步模式
- 注意汇编文件要要大写S格式
- 把汇编中时钟初始化部分屏蔽led闪烁频率会有明显区别
start.S
.text
.global _start
_start:
//****关闭看门狗****
ldr r0, =0x53000000
mov r1, #0
str r1, [r0]
//****设置MPLL时钟****
//设置LOCKTIME
ldr r0, =0x4C000000
ldr r1, =0xFFFFFFFF
str r1, [r0]
//设置CLKDIVN
ldr r0, =0x4C000014
ldr r1, =0x5
str r1, [r0]
//设置CPU异步模式
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
//设置MPLLCON
ldr r0, =0x4C000004
ldr r1, =(92 << 12) | (1 << 4) | (1<<0)
str r1, [r0]
//****设置栈****
ldr sp, =4096 //nand启动 设置在4k顶部
//ldr sp, =0x4000000 + 4096 //nor启动
//****调用main****
bl main
halt:
b halt
Makefile
objs = start.o led.o
dep_files := $(patsubst %, .%.d, $(objs))
dep_files := $(wildcard $(dep_files))
CFLAGS = -Iinclude
led.bin : $(objs)
arm-linux-ld -Ttext 0x00000000 $^ -o led_elf
arm-linux-objcopy -O binary -S led_elf $@
ifneq ($(dep_files),)
include $(dep_files)
endif
%.o : %.c
arm-linux-gcc $(CFLAGS) -c -o $@ $< -MD -MF .$@.d
%.o : %.S
arm-linux-gcc -c -o $@ $^
clean:
rm *.o led_elf led.bin $(dep_files)
distclean:
rm $(dep_files)
.PHONY: clean
C文件
#define GPBCON (*(volatile unsigned int *)0x56000010)
#define GPBDAT (*(volatile unsigned int *)0x56000014)
void delay(int tt);
int main(){
GPBCON = 0x00015400;
GPBDAT = 0x00000000;
GPBDAT |= (1<<5) | (1<<6) | (1<<7) | (1<<8);
while(1){
GPBDAT &= ~(1<<6);
delay(10000);
GPBDAT |= (1<<6);
delay(10000);
}
}
void delay(int tt){
int a,b;
for(a=0;a<=tt;a++)
for(b=0;b<=100;b++);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。