天天看点

s3c2440 ARM9 裸机驱动第二篇—2440系统时钟

一、硬件部分:

1.时钟树:

2440的系统时钟是由MPLL和UPLL来设置的,MPLL用于设置FCLK、HCLK、PLCK。UPLL主要用于USB。

FCLK用于CPU核,HCLK用于AHB总线,PCLK用于APB总线。

s3c2440 ARM9 裸机驱动第二篇—2440系统时钟

2.寄存器:

对于2440,有如下寄存器

LOCKTIME、MPLLCON、UPLLCON、CLKCON、CLKSLOW、CLKDIVN、CAMDIVN。

其中:LOCKTIME用于设置locktime,默认值即可,可以不用配置

MPLLCON用于设置FCLK
UPLLCON用于设置USB时钟

CLKCON用于控制外设时钟开启或者关闭,默认都打开。

CLKDIVN、CAMDIVN用于设置HCLK、PCLK

二、软件部分:

添加一个函数void clk_init(void)

void clk_init(void)
{
	//LOCKTIME默认值
	
	CLKDIVN=0x03					//MCLK:HCLK:PCLK=1:2:4
	//CAMDIVN默认值
__asm__{					         //如果 HDIVN 不为 0,CPU 总线模式应该使用以下指令使其从								
			                         //快总线模式改变为异步总线模式(S3C2440不支持同步总线模式)。
	"MRC p15, 0, r0, c1, c0, 0\n"
	"ORR r1,  r1, #0xc0000000\n"
	"MCR p15, 0, r0, c1, c0, 0\n"
     };
	
}
           
//MPLLCON=(0xad<<12)|(2<<4)|1; //MCLK=271.5M MPLLCON=(0x5c<<12)|(1<<4)|2;    //MCLK=200M
           

三、出现的问题:

这是一个很傻很悲伤的问题,之前写GPIO的时候Makefile写错了,链接时将.c文件的编译文件放在了前面先链接(零地址处放的的.c的指令)

在之前的程序中发现并改了,但我写这节的时候并没有用改好的,任然用的存在问题的Makefile。

这样就没有关闭看门狗,导致开发板一直复位。

在写此节得时候,察觉到开发板不断复位,一是认为没有喂狗,但检查没问题;二是认为配置系统时钟时导致的复位,但也查不出问题。

调试了一整天,最后准备在Makefile中加些代码的时候发现了。

唉,真的是自己给自己挖的坑,只能怪自己工程有些混乱了。