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

原创 2016年08月29日 13:54:15
初始化系统时钟
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) 即可。
版权声明:本文为博主原创文章,转载请注明出处。

相关文章推荐

嵌入式学习--step11 寄存器地址名称映射/系统时钟

1、先定义到外设基地址 #define PERIPH_BASE ((uint32_t)0x40000000) 2、定义到AHB1的外设基地址 #define AHB1PERIPH_BASE ...

根文件系统移植之NFS启动bootloader的设置

FL2440开发板bootloader设置使能NFS文件系统启动LINUX

三、s3c2440 裸机 系统时钟和定时器的设置

三、系统时钟和定时器的设置 ⑴系统时钟原理分析 时钟决定2440执行速度,2440可以使用外部提供的时钟源,也可以使用外部的晶振然后通过内部的晶振获得时钟频率;具体选择使用哪一个时钟源看下图: ...

【STM32F103攻城笔记】外部晶振HSE倍频设置系统时钟

上一篇的内部晶振的系统时钟设置已经对系统时钟进行了配置,而外部晶振的倍频只需要改变上一篇的初始化函数就可以,其他均一样! 第一步:建立一个HSE倍频的初始化函数void SystemClock_C...

STM8 设置系统时钟

硬件平台:stm8s103 编译环境:IAR for stm8#include #include // // Setup the system clock to run at 16MHz usi...
  • zpzyf
  • zpzyf
  • 2016年08月14日 22:03
  • 1350

CCNA CCSP培训设置ASA的系统时钟

CCNA CCSP培训设置ASA的系统时钟   作为CCNA / CCSP的候选人,你预计将了解如何设置您的ASA设备上的系统时钟。   设置正确的时间上的安全设备可能是设置你需要采取的最重要的配置之...
  • sishne
  • sishne
  • 2014年08月09日 09:15
  • 217

STM32 系统时钟设置

1、使用3.5.0的库,系统自动设置为外部时钟8M的时钟,72M工作频率,无需再进行配置。 2、若要自定义时钟时不要用SystemInit函数,把启动代码的SystemInit函数注释掉,m...

第五天:初始化SDRAM 设置S5PV210时钟系统

1.代码重定位实战: 判断重定位:adr 与 ldr 伪指令的区别 ldr 和 adr 都是伪指令,区别是ldr是长加载、adr是短加载。 重点:adr指令加载符号地址,加载的是运行时地址;ldr...
  • Karven_
  • Karven_
  • 2016年07月22日 21:53
  • 1323

STM32系统时钟设置详解

本文主要详细介绍了STM32系统时钟的设置,主要是采用控制寄存器来进行操作的,介绍的较为详细,可以作为参考。...

STM32系统时钟设置,采用外部有源晶振相关配置问题

今天在调试STM32系统时钟设置时遇到一个问题:TIM2定时1Ms,TIM2中断服务函数time++,time=100时LED状态改变。程序运行后发现LED不是按照0.1S的时间闪烁,闪烁的很慢。 查...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bootloader---11.设置系统时钟
举报原因:
原因补充:

(最多只允许输入30个字)