ARM9(S3C2440)时钟与定时器

发布者:SereneSunset最新更新时间:2022-04-21 来源: eefocus关键字:ARM9  S3C2440  时钟  定时器 手机看文章 扫描二维码
随时随地手机看文章

时钟概念


一、时钟脉冲:一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。


二、时钟频率:单位时间(如一秒)内产生的时钟脉冲个数。

时钟作用


时钟信号时时序逻辑(如一些芯片要一定的延时时间才能工作)的基础,它用于决定逻辑单元中的状态何时更新。数字芯片中众多的晶体管都工作在开关状态,他们的导通和关断动作无不是按照时钟信号的节奏进行的。


(1)时钟产生-----晶振


优点:性能稳定,频率稳定,准确。


缺点:频率仅由晶体决定,通常是特定晶体被制成客户所需要的振荡器,导致成本,周期较长,不利于快速上市,而且难以获得非标准的频率。


(2)时钟产生-----PLL


PLL(锁相环)合成器是一种更为复杂的系统时钟源。通用PLL合成器需要一个外部晶体并包含一个能够对晶体的特定频率加倍或分频的集成锁相环(PLL)电路。

     S3C2440有两个PLL:MPLL与UPLL.


     (1)、UPLL专用于USB设备。


     (2)、MPLL用于CPU及其他外围器件。


      通过MPLL会产生三个部分的时钟频率:FCLK,HCLK,PCLK.


     FCLK用于CPU核,HCLK用于AHB(Advanced High-performance Bus:常用语高速外设),PCLK用于APB(Advanced Peripheral Bus:常用语低速外设)总线的设备(比如UART).


 

(1)、上电几毫秒后,(按下复位键(可以不需要这一步,系统自动复位)),外部晶振输出稳定,FCLK=外部晶振频率(12MHZ),nRESET信号恢复高电平后,


CPU开始执行命令。


(2)、在设置MPLL几个寄存器后,需要等待一段时间(Lock Time),MPLL的输出才稳定。在这段时间内,FCLK停止震动,CPU停止工作。Lock Tine的长短


由寄存 器LOCKTIME设定。


(3)、Lock Time之后,MPLL输出正常,CPU工作在新的FCLK(如400MHZ)下。


寄存器


S3C2440的时钟频率寄存器:


(1)、LOCKTIME寄存器


(2)、MPLLCON寄存器


(3)、CLKDIVN寄存器

MPLLCON

该寄存器用于设置FCLK与Fin (如我们的外部晶振为12MHz,那么Fin就是12MHz) 的倍数。公式如下:


MPLL(FCLK) = ( 2*m*Fin ) / (p * 2^s)


其中:m=MDIV+8 ,   p=PDIV+2, s=SDIV 


 

CLKDIVN

该寄存器用于设置FCLK,HCLK,PCLK三者之间的比例。

           

 定时器


 

定时器部件的时钟源为PCLK,首先通过两个8位的预分频器降低频率:定时器0、1共用第一个预分频器,定时器2、3、4共用第二个预分频器。预分频器的输出将进入第二级分频器,它们输出5中频率的时钟:2分频、4分频、8分频、16分频或者外部TCLK0TCLK1,每个定时器的工作时钟也可以从这5种频率中选择。



定时器驱动流程:初始化--------------->启动


(1)、定时器初始化


          1、定时器时钟频率 (如定时器时钟频率为50hz,则每秒减去50)


          2、设置定时器计数器 (如计数值为100,时钟频率为50hz,则定时器在2秒后超时)


          3、设置中断处理函数  (定时器超时或产生中断要处理的函数)


注意:(本例使用定时器0)


定时器时钟频率:

设置定时器计数器


 

通过设置TCON寄存器可以装载定时器计数值,并启动定时器。(设置第四位从新加载定时器)。

 定时器工作流程


1、程序初始化,设置TCMPBn,TCNTBn这两个寄存器,他们表示定时器n的比较值、初始计数值。


2、随之设置TCON寄存器启动定时器n,这时,CMPBn,TCNTBn的值将被装入其内部寄存器TCMPn、TCNTn中。在定时器n的工作频率下,TCNTn开始减一计数,其值可


以通过TCNTO0寄存器得知。


3、当TCNTn的值等于TCMPn的值时,定时器n的输出管脚TOUTn反转;TCNTn继续减一计数。


代码:定时器控制LED.


主要代码为:



#define GLOBAL_CLK  1

#include

#include

#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "mmu.h"

#include "profile.h"

#include "memtest.h"


void Timer0_init(void);

static void __irq IRQ_Timer0_Handle(void);

void Set_Clk(void);

static void cal_cpu_bus_clk(void);

void Led1_init(void);

void Led1_run(void);


/*延时函数*/

void delay(int times)

{undefined

    int i,j;

    for(i=0;i       for(j=0;j<400;j++);

}


/*主函数*/

void Main(void)

    /*系统时钟设置*/

    Set_Clk();


    /*LED初始化*/

    Led1_init();

   

    /*定期器初始化*/

    Timer0_init();

   

    while(1);

    

/*定时器初始化*/    

void Timer0_init(void)

{

 

  //Timer 0 init

  rTCFG0 = 49;                          //pclk/(49+1)

  rTCFG1 = 0x03;                     //16分频为62500HZ ,每秒减去62500,现在我们控制led每隔0.5秒闪烁一次,

                                                  //则: rTCNTB0 = 62500/2;         

  rTCNTB0 = 62500/2;          //TCNTB0[15:0]=计数值 

  rTCMPB0 = 0;

       

  rTCON =0x09;                      //将计数值装入TCNTB0、TCMPB0

 

  ClearPending(BIT_TIMER0);

  pISR_TIMER0 = (U32)IRQ_Timer0_Handle;

  EnableIrq(BIT_TIMER0);

}


/*定时器中断处理函数*/   

static void __irq IRQ_Timer0_Handle(void)

{undefined



    ClearPending(BIT_TIMER0);   //为了下次继续产生中断

    Led1_run();

    

}


/*系统时钟设置函数*/

void Set_Clk(void)

{undefined

 int i;

 U8 key;

 U32 mpll_val = 0 ;

 i = 2 ;              //don't use 100M!

                   //boot_params.cpu_clk.val = 3;

 switch ( i ) {undefined

 case 0: //200

  key = 12;

  mpll_val = (92<<12)|(4<<4)|(1);

  break;

 case 1: //300

  key = 13;

  mpll_val = (67<<12)|(1<<4)|(1);

  break;

 case 2: //400

  key = 14;

  mpll_val = (92<<12)|(1<<4)|(1);

  break;

 case 3: //440!!!

  key = 14;

  mpll_val = (102<<12)|(1<<4)|(1);

  break;

 default:

  key = 14;

  mpll_val = (92<<12)|(1<<4)|(1);

  break;

 }

 

 //init FCLK=400M, so change MPLL first

 ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);   //set the register--rMPLLCON

 ChangeClockDivider(key, 12);    //the result of rCLKDIVN [0:1:0:1] 3-0 bit

 cal_cpu_bus_clk();    //HCLK=100M   PCLK=50M

}


 


static void cal_cpu_bus_clk(void)

{undefined

 static U32 cpu_freq;

    static U32 UPLL;

 

 U32 val;

 U8 m, p, s;

 

 val = rMPLLCON;

 m = (val>>12)&0xff;

 p = (val>>4)&0x3f;

 s = val&3;


 //(m+8)*FIN*2 不要超出32位数!

 FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1< 

 val = rCLKDIVN;

 m = (val>>1)&3;

 p = val&1; 

 val = rCAMDIVN;

 s = val>>8;

 

 switch (m) {undefined

 case 0:

  HCLK = FCLK;

  break;

 case 1:

  HCLK = FCLK>>1;

  break;

 case 2:

  if(s&2)

   HCLK = FCLK>>3;

  else

   HCLK = FCLK>>2;

  break;

 case 3:

  if(s&1)

   HCLK = FCLK/6;

  else

   HCLK = FCLK/3;

  break;

 }

 

 if(p)

  PCLK = HCLK>>1;

 else

  PCLK = HCLK;

 

 if(s&0x10)

  cpu_freq = HCLK;

 else

  cpu_freq = FCLK;

  

 val = rUPLLCON;

 m = (val>>12)&0xff;

 p = (val>>4)&0x3f;

 s = val&3;

 UPLL = ((m+8)*FIN)/((p+2)*(1< UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;

}


/*LED初始化*/

void Led1_init(void)

{undefined

    rGPBCON &= ~(0x3<<10);

    rGPBCON |=  (0x1<<10);

}


/*LED点亮*/

void Led1_run(void)

{undefined

    //rGPBDAT = rGPBDAT^(0x1<<5);

  

    if(rGPBDAT &(1<<5))

       rGPBDAT &=~(1<<5);

    else

       rGPBDAT |=(1<<5);

}

 


 


2440addr.h


#define ClearPending(bit) {

   rSRCPND = bit;

   rINTPND = bit;

   rINTPND;

  }

#define pISR_TIMER0   (*(unsigned *)(_ISR_STARTADDRESS+0x48))


#define EnableIrq(bit)  rINTMSK &= ~(bit)


define rINTMSK     (*(volatile unsigned *)0x4a000008) //Interrupt mask control


#define BIT_TIMER0  (0x1<<10)


 


void ChangeMPllValue(int mdiv,int pdiv,int sdiv)

{undefined

    rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;

}


 


void ChangeClockDivider(int hdivn,int pdivn)

{undefined

     // hdivn,pdivn FCLK:HCLK:PCLK

     //     0,0         1:1:1

     //     0,1         1:1:2

     //     1,0         1:2:2

     //     1,1         1:2:4

    rCLKDIVN = (hdivn<<1) | pdivn;   


    if(hdivn)

        MMU_SetAsyncBusMode();

    else

        MMU_SetFastBusMode();

}


.............

关键字:ARM9  S3C2440  时钟  定时器 引用地址:ARM9(S3C2440)时钟与定时器

上一篇:S3C2440系统时钟讲解
下一篇:基于S3C2440的ARM9基础程序设计及分析

推荐阅读最新更新时间:2024-11-10 11:43

s3c2440裸机-代码重定位、清bss的优化和位置无关码
1.代码重定位的改进 用ldr、str代替ldrb, strb加快代码重定位的速度。 前面重定位时,我们使用的是ldrb命令从的Nor Flash读取1字节数据,再用strb命令将1字节数据写到SDRAM里面。 我们2440开发板的Nor Flash是16位,SDRAM是32位。 假设现在需要复制16byte数据。 不同的读写指令 cpu读取nor的次数 cpu写入sdram的次数 ldrb、strb 16 16 ldr、str 8 4 可以看出我们更换读写指令后读写次数变少了,提升了cpu的访问效率。 修改后的start.s代码如下图所示,这里我只简单的列出了重定位的实现: ... cpy: ld
[单片机]
<font color='red'>s3c2440</font>裸机-代码重定位、清bss的优化和位置无关码
两种方法教你如何有效地利用51单片机产生PWM波
89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面将逐一介绍。 1 软件延时法 利用软件延时函数,控制电平持续的时间,达到模拟pwm的效果。 程序如下: #include sbit pwm=P1^0; main() { while(1) { pwm=1; delayus(60);//置高电平后延时60us,占空比60% pwm=0; delayus(40); } } void delayus(uint x) { while(x--); } proteus软件仿真结果如下: 可见,用这种延时函数的方法就能简单地模拟出pwm输出。
[单片机]
两种方法教你如何有效地利用51单片机产生PWM波
移植uboot2010.09到S3C2440
我在看U-BOOT的lowlevel_init.S文件时看到以下代码: lowlevel_init: ldr r0, =SMRDATA ldr r1, _TEXT_BASE sub r0, r0, r1 ldr r1, =BWSCON add r2, r0, #13*4 0: ldr r3, , #4 str r3, , #4 cmp r2, r0 bne 0b mov pc, lr 这段代码实现了U-BOOT的内存控制器部分的寄存器初始化,一共13个寄存器,对U-BOOT来最重要的就是SDRAM的初始化,显然没有这部分代码,当U-BOOT从NAND FLASH中启动的时候,START.S文件是无法完成代码的relocate的。因
[单片机]
S3C2440上LCD驱动(FramBuffer)实例开发详解(一)
嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。 一、开发环境 编译器:arm-linux-gcc-4.3.2 二、背景知识 1. LCD工作的硬件需求: 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。通过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/T
[单片机]
<font color='red'>S3C2440</font>上LCD驱动(FramBuffer)实例开发详解(一)
MSP430单片机定时器A结构及其应用范例
1-简介 简介MSP430单片机定时器A结构及其应用范例。 2-定时器模块 在MSP430系列单片机中带有功能强大的定时器资源,这定时器在单片机应用系统中起到重要的作用。利用MSP430(以下称为430)单片机的定时器可以用来实现计时,延时,信号频率测量,信号触发检测,脉冲脉宽信号测量,PWM信号发生。另外通过软件编写可以用作串口的波特率发生器。后面我们将用定时器A作为一个波特率发生器,来编写一个串口例程给初学者参考。以加强初学者对定时器A的理解和应用。 在430的大系列产品中,不同的子系列产品定时器资源有所不同;在F11X,F11X1中是不带定时器B资源的。430的定时器主要分为3部分模块:看门狗定时器,定时器A,定时器
[单片机]
MSP430单片机<font color='red'>定时器</font>A结构及其应用范例
七彩灯综合C程序
/*此程序是一款普通的彩灯,它的功能主要有四种模式: 第一种模式:开机四种颜色以0.5秒速度循环1次,然后 在白颜色上停止循环,即显示白光 第二种模式:按下功 能键后,它以1秒速度四种颜色不停的循环 第三种模式: 当按键按下后,它会记住第二种模式的颜色,比如第二种 模式现在亮得是绿色,你按下按键时,它会先闪一下,然 后在绿颜色上停下来 第四模式:当你再按下开关时,它 自动回到模式一下,(当然还可以写出三种颜色) 本程序是第一个版本,第二版功能更强大参见: http://www.51hei.com/mcu/1531.html */ #include reg52.h #define uint unsigned int #defi
[单片机]
关于stm32定时器定时周期计算
1.TIMx(1-8),在库设置默认的情况下,都是72M的时钟; 名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在 APB1总线上。其中TIM1&TIM8称为高级控制定时器(advanced control timer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。 定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。 下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系
[单片机]
关于stm32<font color='red'>定时器</font>定时周期计算
美高森美发布全新高性能时钟管理芯片时钟解决方案
致力于提供功率、安全、可靠与高性能半导体技术产品的领先供应商美高森美公司(Microsemi Corporation,纽约纳斯达克交易所代号:MSCC)宣布推出双通道ZL30240和单通道ZL30241时钟发生器产品,用于包括通信设备、企业路由器和交换、网络存储设备和服务器等多种应用。 美高森美时钟产品副总裁兼业务部门经理Maamoun Seido表示:“采用我们的新型时钟发生器产品,设计人员不再需要依赖昂贵的振荡器来获得具有出色的抖动性能、灵活性和可靠性能的高速输出时钟。这些新型时钟发生器的推出,加之我们去年推出首个时钟驱动器产品系列,进一步巩固了美高森美在时钟和同步芯片解决方案领域的领导地位,这个细分市场仍然是我们关注和投资
[嵌入式]

推荐帖子

lm3s9b96下载后出现there were warning during download see log window
下载后出现therewerewarningduringdownloadseelogwindow,但程序跳转到开始,且能正常运行。TueJun2814:32:112011:TotalIRLen=4,IRPrint=0x01TueJun2814:32:112011:FoundCortex-M3r2p0,Littleendian.TueJun2814:32:112011:TPIUfitted.TueJun2814:3
yuchenglin 微控制器 MCU
急急急
版主以及各位高手,有谁知道现在的器材有没有能感应到10米左右的物体,然后输出一个电信号(最好是一个由强到弱的)~谢谢了,请大家多多指教~~急急急急也没有用,去做个雷达测距的吧,或者去买个交警测超速的玩意吧。Re:急急急不知兄台感知什么性质物体、其是否运动Re:急急急
wanxiaotao RF/无线
TI的LaunchPad有哪些?
就这几个吗?是不是还有其它的?TI的LaunchPad有哪些?不止这些呢!你可以看看这个网址呢!Boosterpack也有很多呢!你可以点下面链接呢!无意间发现的,各种launchpad,各种扩展板!http://www.ti.com/ww/en/launchpad/launchpads-msp430.html#tabs很强大的TI啊
dontium 微控制器 MCU
卸除不了磁盘
HANDLEhStore;hStore=OpenStore(_T(FLA1:));if(hStore==INVALID_HANDLE_VALUE)return;HANDLEhPart;hPart=OpenPartition(hStore,LPart00);if(hPart==INVALID_HANDLE_VALUE)return;if(DismountPartition(hPa
calphone 嵌入式系统
GPS智能天线模块的选择和性能考量
GPS已从一种集成产品发展成综合系统解决方案的一部分。目前原始设备制造商(OEM)可以选择用GPS芯片组、GPS模块或智能天线模块来实现系统集成。每种方案都有各自的利弊,OEM在选择之前需要根据其整个系统的要求做出评估。本文提供了智能天线方案选择思路,并讨论了片状天线和螺旋天线的性能对比以及影响智能天线模块在终端产品中嵌入应用的因素。近年来,GPS已从一种集成产品发展成综合系统解决方案的一部分。这种转变的动因是GPS的小型化进程和对降低成本的追求。高度集成的信号混合芯片完成RF前端功能,整
fly RF/无线
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved