您尚未登录。

楼主 #1 2018-05-06 14:37:20

xinxiaoci
会员
注册时间: 2018-04-18
已发帖子: 71
积分: 71

S3C2440内部时钟及高速时钟配置

《单片机小白转嵌入式Linux学习记录,基于S3C2440----目录》


芯片手册P237
01.jpg
JZ2440 V2 原理图 P12
02.jpg
OM2、OM3=0 引脚接地,MPLL(Main CLK)、UPLL(USB CLK)时钟源为晶振Crystal。

芯片手册P238
03.jpg
MPLL ->FCLK->CPU        最高400MHz
    ->HCLK ->AHB高速外设总线    最高136MHz
    ->PCLK->APB 低速外设总线    最高68MHz

UPLL->UCLK->USB设备使用

芯片手册P35
04.jpg

下面是代码,自行验证,启动PLL与不启用PLL差别,LED延时闪烁频率
start.S 代码

.text
.global _start

_start:
	/* 关闭看门狗 */
	ldr r0,=0x53000000
	ldr r1,=0
	str r1,[r0]
	/* PLL配置---------------------------- */
	/* 设置MPLL,FCLK:HCLK:PCLK=400M:100M:50M */
	
	/* 设置lock time 详见手册P255
	 * LCOKTIME(0x4c000000)=0xFFFFFFFF 
	 */
	ldr r0,=0x4c000000
	ldr r1,=0xFFFFFFFF
	str r1,[r0]
	
	/* 设置HCLK、PCLK 相对于FCLK的分频系数 详见手册P260
	 * CLKDIVN(0x4c000014)=0x05 tFCLK:tHCLK:tPCLK=1:4:8  
	 */
	ldr r0,=0x4c000014
	ldr r1,=0x05
	str r1,[r0]
	
	/* 设置CPU工作于异步模式 
	 * 详见手册P244
	 */
	mrc p15,0,r0,c1,c0,0
	orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA
	mcr p15,0,r0,c1,c0,0
	
	/* 配置MPLLCON 来设置FCLK频率 详见手册P255~256
	 * 设置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^1)=400MHz
	 */
	ldr r0,=0x4c000004
	ldr r1,=(92<<12)|(1<<4)|(1<<0)
	str r1,[r0]
	
	/* 一旦设置PLL,就会锁定 lock time 直到PLL输出稳定 */
	/* PLL配置--END-------------------------- */
	
	
	/* 设置内存:sp 栈 */
	
	/* 分辨是nor/nand启动
	 * 写0到0地址,再读出来;如果读出来是0,表示
	 * 操作是内部RAM,是nand启动;否则就是nor启动
	 * 因为nor flash 不向内存那样能直接读写
	 */
	mov r1,#0
	ldr r0,[r1]	/* 备份0地址数据 */
	str r1,[r1]	/* 将0写入0地址 */
	ldr r2,[r1]	/* 读取0地址数据到r2 */
	cmp r1,r2	/* 判断r1 r2是否相等 */
	ldr sp,=0x40000000+4096	/* 假设nor启动 */
	moveq sp,#4096	/* 如果r1==r2 nand启动 */
	streq r0,[r1]	/* 恢复原来的值 */
	
	
	/* 调用main函数 */
	bl main

	/* 死循环 */
halt:
	b halt

led.c

#define GPFCON (*(volatile unsigned int *)0x56000050)	//volatile 防止编译器优化
#define GPFDAT (*(volatile unsigned int *)0x56000054)

#define LED1_On 	GPFDAT&=~(1<<4)//GPF4拉低
#define LED1_Off	GPFDAT|=(1<<4)////GPF4拉高

#define LED2_On 	GPFDAT&=~(1<<5)//GPF5拉低
#define LED2_Off	GPFDAT|=(1<<5)////GPF5拉高

#define LED4_On		GPFDAT&=~(1<<6)//GPF6拉低
#define LED4_Off	GPFDAT|=(1<<6)////GPF6拉高


void delay(volatile unsigned int cnt)
{
	while(cnt--);
}

int main()
{
	unsigned int temp=0;
	/* 初始化LED熄灭 */
	LED1_Off;
	LED2_Off;
	LED4_Off;
	
	/* 配置GPF4/5/6为输出引脚 */
	GPFCON&=~((3<<8)|(3<<10)|(3<<12));//清除位
	GPFCON|=((1<<8)|(1<<10)|(1<<12));//GPF4/5/6配置为输出

	while(1)
	{
		if(++temp>2) temp=0; 
		delay(100000);
		if(temp==0) LED1_On; else LED1_Off;
		if(temp==1) LED2_On; else LED2_Off;
		if(temp==2) LED4_On; else LED4_Off;
	}

	return 0;
}

最近编辑记录 xinxiaoci (2018-05-06 14:40:32)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn