wangcong02345的专栏

没有经过实践的东西是不会被真正理解的

bootloader---11.设置系统时钟
初始化系统时钟
1. start.S

点击(此处)折叠或打开

  1. .text
  2. .global _start
  3. _start:
  4.     /*disable watchdog*/
  5.     ldr r0, =0x53000000    
  6.     mov r1, #0x0
  7.     str r1, [r0]
  8.     
  9. #define COCKTIME    0x4C000000    
  10. #define MPLLCON        0x4C000004
  11. #define UPLLCON        0x4C000008
  12. #define CLKCON        0x4C00000C
  13. #define CLKSLOW        0x4C000010
  14. #define CLKDIVN     0x4C000014
  15. #define CAMDIVN     0x4C000018
  16.     /*FCLK:HCLK:PCLK=1:4:8*/
  17.     ldr r0, =CLKDIVN
  18.     mov r1, #0x05
  19.     str r1, [r0]

  20.     mrc p15, 0, r0, c1, c0, 0
  21.     orr r0, r0, #0xc0000000
  22.     mcr p15, 0, r0, c1, c0,0

  23.     /*MPLL=(2*m*Fin)/(P*(1<<S)), m=(MDIV+8), p=PDIV+2 s=SDIV*/
  24.     ldr r0, =MPLLCON 
  25.     ldr r1, =((0x5C<<12)|(0x01<<4)|(0x01))
  26.     str r1, [r0]
  27.     
  28.     ldr r0, =0x10000
  29. 1:
  30.     sub r0, r0, #1
  31.     bne 1b

  32.     /*UPLL=(m*Fin)/(P*(1<<S)), m=(MDIV+8), p=(PDIV+2), s=SDIV*/
  33.     ldr r0, =UPLLCON
  34.     ldr r1, =((0x10<<12)|(0x01<<4)|(0x01))
  35.     str r1, [r0]

  36.     ldr r0, =0x10000
  37. 1:
  38.     sub r0, r0, #1
  39.     bne 1b

  40.     /* set up the stack    */
  41.     ldr sp, =1024*4
  42.     bl main

  43. loop:
  44.     b loop

2. main.c 

点击(此处)折叠或打开

  1. #define GPBCON (*(volatile unsigned int *) 0x56000010)
  2. #define GPBDAT (*(volatile unsigned int *) 0x56000014)

  3. static inline void delay (unsigned long loops)
  4. {
  5.     __asm__ volatile ("1:\n"
  6.             "subs %0, %1, #1\n"
  7.             "bne 1b":"=r" (loops):"0" (loops));
  8. }

  9. void main()
  10. {
  11.     int i = 1;
  12.     GPBCON = 0x15400;
  13.     while(1)
  14.     {
  15.         GPBDAT = 0x7FF&(~i<<5);
  16.         i *= 2;
  17.         if(16==i)
  18.             i = 1;
  19.         delay(400000);
  20.     }
  21.     return ;
  22. }
3. Makefile 只需要把原先的OBJS :=  start.o修改为OBJS :=  start.o main.o即可
烧到板子上之后流水灯的闪烁的速度明显变快了好多。
二、
 2.1 s3c2440有两个PLL(MPLL,UPLL):MPLL用于产生FCLK HCLK PCLK,UPLL用于产生USB时钟(48Mhz)
 2.2 FCLK、HCLK、PCLK的关系
     FCLK 用于cpu
     HCLK 用于AHB总线及其外围设备
     PCLK 用于APB总线及其外围设备
 2.3 
    CLKDIVN用于设定FCLK HCLK PCLK三者的比例关系,
    当CAMDIVN=0时, CLKDIVN=0x05,则FCLK:HCLK:PCLK=1:4:8,(因为CAMDIVN默认值为0,所以此处不用设定)
    即,当FCLK=400M时,HCLK=100M PCLK=50M
2.4 计算公式
 Fout=(2 * m * Fin)/(p*2的s次方) m=MDIV+8,p=PDIV+2,s=SDIV 
 MDIV PDIV SDIV 都是通过MPLLCON设定的,Fin是tq2440的晶振频率12MHZ
 例子中: MDIV=0x5C PDIV=0x01 SDIV=0x01
 Fout=(2*(0x5c+8)*12MHZ)/((0x01+2)*2)=400MHZ
2.5
  1.     mrc p15, 0, r0, c1, c0, 0
  2.     orr r0, r0, #0xc0000000
  3.     mcr p15, 0, r0, c1, c0,0
手册上说"If HDIVN is not 0, the CPU bus mode has to be changed from the fast bus mode to the asynchronous bus mode using following instructions",当HDIVN (CLKDIVN的D1-D2)不为零时,需要通过这三条指令将cpu从fast bus mode 切换到asynchronous mode。

注意:如果在编译时出现
warning: function declaration isn't a prototype时,例如 void main(),修改成void main(void) 即可。
阅读更多
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/wangcong02345/article/details/52352518
个人分类: linux开发
想对作者说点什么? 我来说一句

Bootloader

Bootloader启动

jscese jscese

2013-12-06 19:37:44

阅读数:2088

没有更多推荐了,返回首页

不良信息举报

bootloader---11.设置系统时钟

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭