TQ2440开发板学习纪实(3)--- 设置时钟频率,让CPU运行的更快

0 原理

0.1 时钟源自哪里

所谓的时钟,就是电压高低的变化,只有不断的0,1交替变化,CPU才能被驱动运行。S3C2440支持多种时钟源,这通过CPU针脚OM3和OM3来选择。对于QT2440板子来说,OM3和OM2均直接接地,这就意味着时钟源来自针脚XTIpll和XTOpll,这两个针脚在TQ2440的核心板上被连接上了一个12MHz的晶振。

0.2 S3C2440的时钟原理与设置

CPU、RAM、UART等不同的设备运行时需要不同的时钟频率,这些不同的频率需要通过变频电路来提供,在电子行业这个变频电路叫做PLL(Phase Locked Loop)。作为软件出身的程序员,不太可能精通电路设计,只需要知道这个PLL可以把输入的时钟转换为很多其他不同的时钟供系统使用。

Fin(12MHz)——>(PLL变频)——–>FCLK、HCLK、PCLK

而输出频率和输入频率的关系则通过响应的寄存器进行控制。控制参数的设置在s3c2440数据手册上有详细说明。这里只列出特别需要注意的地方。

  1. 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(S3C2440 does not support synchronous bus mode).

    MMU_SetAsyncBusMode

    mrc p15,0,r0,c1,c0,0

    orr r0,r0,#R1_nF:OR:R1_iA

    mcr p15,0,r0,c1,c0,0

    If HDIVN is not 0 and the CPU bus mode is the fast bus mode, the CPU will operate by the HCLK.

    This feature can be used to change the CPU frequency as a half or more without affecting the HCLK

    and PCLK.

    也就是说,S3C2440不支持异步总线模式(S3C2440A支持)。所以只能工作在fast bus模式下,此时如果HDIVN不是0的的话,驱动CPU工作的将不是FCLK,而是HCLK。

  2. FCLKOUT must be bigger than 200MHz (It does not mean that the ARM core has to run more than 200MHz).因为CPU可能以HCLK工作,如第一条所示。
  3. When you set MPLL&UPLL values, you have to set the UPLL value first and then the MPLL value. (Needs intervals

    approximately 7 NOP。即是说,UPLL设置要在MPLL设置之前,切之间间隔至少7个NOP。

  4. 如果没有设置MPLL,那么CPU会一直以Fin的频率时钟运行。
  5. MPLL和UPLL的计算公式并不完全相同。
MPLL Control Register
Mpll = (2 * m * Fin) / (p * 2S)
m = (MDIV + 8), p = (PDIV + 2), s = SDIV
UPLL Control Register
Upll = (m * Fin) / (p * 2S)
m = (MDIV + 8), p = (PDIV + 2), s = SDIV

1 关键代码说明

尽管理论稍显复杂,实际设置代码非常简单。我们要设置的最终结果是:FCLK=200MHz,并且CPU以此来运行。当然可以根据手册上的数据,设置成更高的频率,只不过尝试后发现高频率下CPU发热明显,为保护好测试板子,采用了一个较低的FCLK。

/* Fin=12MHz, FCLK=200MHz */
.equ MPLLCON,   0x4c000004
.equ M_MDIV,    92
.equ M_PDIV,    4
.equ M_SDIV,    1

/* Fin=12MHz, UPLLCLK = 48MHz */
.equ UPLLCON,   0x4c000008
.equ U_MDIV,    56
.equ U_PDIV,    2
.equ U_SDIV,    2

/* HCLK=FCLK, PCLK=FCLK, UCLK=UPLLCLK */
.equ CLKDIVN,   0x4c000014
/*
  if If HDIVN is not 0 and the CPU bus mode is the fast bus mode,
  the CPU will operate by the HCLK
*/
.equ HDIVN,     0
.equ DIVN_UPLL, 0
.equ PDIVN,     0

    ldr r0, =CLKDIVN
    ldr r1, =(DIVN_UPLL<<3) + (HDIVN<<1) + PDIVN
    str r1, [r0]

    ldr r0, =UPLLCON
    ldr r1, =(U_MDIV<<12) + (U_PDIV<<4) + U_SDIV
    str r1, [r0]
    nop
    nop
    nop
    nop
    nop
    nop
    nop

    ldr r0, =MPLLCON
    ldr r1, =(M_MDIV<<12) + (M_PDIV<<4) + M_SDIV
    str r1, [r0]

2 测试说明

我们还是使用了与上一篇博文同样的一个LED流水灯C程序,不过由于CPU工作频率由12MHz提高到了200MHz,流水灯的速度较上一版本变化非常明显,这也直观上验证了我们设置CPU时钟成功了。

3 源码下载

版本v0.4。

时间: 2024-10-12 14:53:26

TQ2440开发板学习纪实(3)--- 设置时钟频率,让CPU运行的更快的相关文章

编译天嵌官方的linux-2.6.30.4内核下载到TQ2440开发板不断重启的解决办法

编译天嵌官方的linux-2.6.30.4内核下载到TQ2440开发板不断重启的解决办法 查看了一下开发板启动打印的 LOG 信息,和官方启动 LOG 一对比发现交叉编译器版本不一致.我用的编译器版本是:arm-linux-gcc-4.5.1,而天嵌官方的 zImage.bin 是用arm-linux-gcc-4.3.3编译的.于是网上找了半天arm-linux-gcc-4.3.3没找到,便下载了一个 4.3.2 版本的. 重新编译下载,板子竟然奇迹般可以正常启动了. 但是又出现了新的问题,进入

【4412嵌入式开发板学习笔记】认识uboot

转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令,有些无法使用,可能是uboot版本问题或者文件系统问题.具体原因我目前还不是很清楚,建议第五部分uboot命令可以先不用尝试. 一切以配套视频为准. 一.为什么是uboot 1.uboot从哪里来的? (1)uboot是SourceForge上的开源项目 (2)uboot项目的作者:一个德国人最早发

【嵌入式4412开发板学习教程】Uboot教程之uboot基础概念和框架

[4412开发板教程]Uboot教程之uboot基础概念和框架 正在学习uboot,教程讲解的很详细,先上个笔记,视频上传到网盘后再补上...... 知识点: 1.操作系统分层的概念 Windows:bios→内核模式→用户模式→用户程序 linux:bootloader→内核→文件系统→用户程序 2.bootboader种类介绍 U-boot是最通用的bootboader.(210,4412等等) vivi 针对三星的ARM来定制2440上有用到 3.4412休眠问题 它可以直接跳过uboot

基于TQ2440开发板的WiFi模块的使用经验总结

一.软.硬件资源准备: 内核版本:linux-2.6.30.4 交叉编译器版本:4.3.3 wpa_supplicant工具:wpa_supplicant-0.7.3.tar ; openssl-0.9.8e.tar 开发板:TQ2440 无线网卡芯片:RTL8192CU,(淘宝上35元购买了一个USB接口的无线网卡:http://item.taobao.com/item.htm?spm=a1z09.5.0.0.H6U4Yy&id=25936180156&_u=kk57vmr1977) 无

移植u-boot-2015.10到JZ2440开发板(五)——设置nand分区,环境变量保存地址和其它默认参数

在下载内核或文件系统时,我们可以直接在命令中写明烧到nandflash的具体地址,但较麻烦,我们可以给nandflash分区,这样就可直接写烧到那个分区就行了,较为方便.如何设置呢?首先我们在uboot中输入mtdparts命令,看看默认的分区,结果提示mtdids not defined, no default present.搜索"mtdids not defined",定位到common/cmd_mtdparts.c的mtdparts_init函数中,分析发现是mtdids_de

CC2540开发板学习笔记(三)&mdash;&mdash;外部中断

一.实验内容 通过外部中断方式依次按下按键S1控制LED1的亮灭 二.实验过程 1.电路原理图同上 2.中断的概念 比如说我们在执行main函数时,突然来了个指令.优先级比现在执行的main还高,那我们便选择跳过去执行优先级高的,完了之后再执行main函数,中断就类似这样一个概念,使用中断可以减少CPU的无效浪费,降低能耗. 3.寄存器调度 (1)LED1的初始化..同前两节,就是SEL,DIR,INP三个,还有附初始状态. (2)外部中断初始化(S1的外部中断初始化) 按键S1外部中断初始化方

CC2540开发板学习笔记(五)&mdash;&mdash;串口通信

一.实验现象: 开发板实现 3个功能.发送.收发.控制 LED. 二.实验过程 1.PL2303 USB转串口电路图 2.串口发送 (1)查看用户手册有: UART0 对应的外部设备 IO 引脚关系为: P0_2 ------ RX                                                     P0_3 ------ TXUART1 对应的外部设备 IO 引脚关系为: P0_5 ------ RX                             

安装linux系统到TQ2440开发板

(从开发板的nor flash 通过USB下载线将嵌入式linux安装到开发板的nand flash) 步骤详解: 安装准备1:硬件连接 Flash开关位于nor flash 串口线已经连接到PC USB下载线已经连接到PC 连接好开发板电源线,并关闭开发板电源开关 安装准备2:安装USB下载线驱动 (1)将dnw的两个文件拷到Linux系统中(目录/home) (2)insmod dnw_usb- (3)lsmod查看驱动是否安装成功 (4)运行dnw命令    ./dnw ./- (5)如果

STM32F042开发板学习实践

之前有粗略地学习过stm32F103的理论知识,但仅GPIO的配置.时钟配置就让人望而却步.现在手头有Nucleo STM32F042的开发板,而且ST已经推出STM32CubeMx图形化的工具软件,便于图形化配置硬件自动生成初始化代码,无论于熟手还是初学者都是个福音,因此可趁着便利条件逐步学习STM系列单片机的编程以及记录下学习的实践过程. 以下是基于keil点亮LED的实践,其实开发板到手时,芯片已经有烧写程序,装好驱动,接上USB线LED灯就能闪亮了,另外还可以通过云端mbed开发程序,这