《单片机小白转嵌入式Linux学习记录,基于S3C2440----目录》
芯片手册P237
JZ2440 V2 原理图 P12
OM2、OM3=0 引脚接地,MPLL(Main CLK)、UPLL(USB CLK)时钟源为晶振Crystal。
芯片手册P238
MPLL ->FCLK->CPU 最高400MHz
->HCLK ->AHB高速外设总线 最高136MHz
->PCLK->APB 低速外设总线 最高68MHz
UPLL->UCLK->USB设备使用
芯片手册P35
下面是代码,自行验证,启动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)
离线