s3c2440硬件篇之六:系统时钟和定时器

发布者:陈晨5566最新更新时间:2016-12-01 来源: eefocus关键字:s3c2440  硬件篇  系统时钟  定时器 手机看文章 扫描二维码
随时随地手机看文章

S3C2440有三种时钟:FCLK(用于CPU核),HCLK(用于主机模块),PCLK(用于外设).两种PLL(锁相环):MPLL(用于设置FCLK,HCLK,PCLK),UPLL(用于设置USB设备),.

S3C2440的CPU核工作电压为1.2V时,主频FCLK可以达到300M,CPU核工作电压为1.3V时,主频FCLK可以达到400M.为了降低电磁干扰,降低板间的布线要求,s3c2410/s3c2440外接的晶振通常很小,一般为12M,那么如何达到主频FCLK的400M的呢?------PLL倍频。

 

一.设置主频FCLK主要是通过MPLL来软件实现倍频。MPLL主要由3个值MDIV,PDIV,SDIV来决定。而这3个值是由MPLLCON寄存器决定的,MPLLCON的第12位到第19位的值为MDIV,如下所示。

 

 * 对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV
 * 有如下计算公式:
 * S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s)
 * S3C2410: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)
 * 其中: m = MDIV + 8, p = PDIV + 2, s = SDIV
 * 对于本开发板,Fin = 12MHz


二.设置好了MPLLCON寄存器也就基本上算是设置好了FCLK,可以在此基础上设置HCLK,PCLK,主要是设置分频比,主要通过设置CLKDIV寄存器设置。

三.代码详解:(参考韦东山大哥代码)

1.设置/启动MPLL

#define S3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00))
#define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))
/*
 * 对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV
 * 有如下计算公式:
 * S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s)
 * S3C2410: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)
 * 其中: m = MDIV + 8, p = PDIV + 2, s = SDIV
 * 对于本开发板,Fin = 12MHz
 * 设置CLKDIVN,令分频比为:FCLK:HCLK:PCLK=1:2:4,
 * FCLK=200MHz,HCLK=100MHz,PCLK=50MHz
 */
void clock_init(void)
{
    // LOCKTIME = 0x00ffffff; // 使用默认值即可

    CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1


    /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
__asm__(
    "mrc p15, 0, r1, c1, c0, 0\n" /* 读出控制寄存器 */ 
    "orr r1, r1, #0xc0000000\n" /* 设置为“asynchronous bus mode” */
    "mcr p15, 0, r1, c1, c0, 0\n" /* 写入控制寄存器 */
    );

    /* 判断是S3C2410还是S3C2440 */
    if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))
    {
        MPLLCON = S3C2410_MPLL_200MHZ; /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
    }
    else
    {
        MPLLCON = S3C2440_MPLL_200MHZ; /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
    } 
}

2.初始化定时器0,并设置中断。

/*
 * Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value}
 * {prescaler value} = 0~255
 * {divider value} = 2, 4, 8, 16
 * 本实验的Timer0的时钟频率=100MHz/(99+1)/(16)=62500Hz
 * 设置Timer0 0.5秒钟触发一次中断:
 */
void timer0_init(void)
{
    TCFG0 = 99; // 预分频器0 = 99 

    TCFG1 = 0x03; // 选择16分频

    TCNTB0 = 31250; // 0.5秒钟触发一次中断

    TCON |= (1<<1); // 手动更新

    TCON = 0x09; // 自动加载,清“手动更新”位,启动定时器0

}

/*
 * 定时器0中断使能
 */ 
void init_irq(void)

    // 定时器0中断使能

    INTMSK &= (~(1<<10));
}


3.执行make生成timer.bin。烧入Nandflash中后运行,即可看到4个LED每1S闪烁一次。


关键字:s3c2440  硬件篇  系统时钟  定时器 引用地址:s3c2440硬件篇之六:系统时钟和定时器

上一篇:s3c2440硬件篇之七:UART
下一篇:s3c2440硬件篇之五:读NandFlash(2)

推荐阅读最新更新时间:2024-03-16 15:22

s3c2440 lcd 显示图片裸机程序
因为前面的裸机程序非常的简单,就不写博了。 程序的流程: 1,初始化C SP 2,关看门狗 3,初始化SDRAM 4,读出 NAND FLASH 中的 包含图片的程式放到SDRAM里面 5,跳转到SDRAM 执行 因为 2440 自动只读取4K 到 SRAM ,在里面放了图片,自然就不够用了。 就多了一步放到 SDRAM 里面去。 我并没有直接复制教程上面的程式,那个上面比较复杂。用到了c 的 库文件。 教程中只是画线,画圆线很简单。 刚一开始,我是使用 24BPP 开发的,这样遇到的问题还比较多。 图片要转为 C 语言的 头文件。我看网上有很多人在找软件转,还有个用 C的在LINUX
[单片机]
<font color='red'>s3c2440</font> lcd 显示图片裸机程序
51单片机~定时器和外部中断(各个位控制作用详解)
(一)中断 (二)定时器,计数器中断 TL0低八位先进行存储,达到0XF,向上进一,直到高低八位都满时就可以产生中断或者控制TF0口。 (1). TMOD低四位控制T0,高四位控制T1。 GATE:(门控位) (2)控制寄存器TCON:(低四位控制外部中断,高四位控制计数器启动和中断申请) (3)定时器的四种工作方式: 定时器开启工作原理: 四种工作方式:(机器周期(脉冲)和T0引脚来绝定电路触发) 区别在于TH0和TL0的位数和输出) 常用1和2 1. 2.用于比较精确的脉冲信号发射器: 3. 程序化步奏: 计算:初值==2^n-N(公式要根据你使用那种方式0.1
[单片机]
51单片机~<font color='red'>定时器</font>和外部中断(各个位控制作用详解)
s3c2440串口接收中断(OK2440III)
#include uart2440.h #include def.h #include 2440addr.h #include led2440.h // 引入led #define UART_CLK 50000000 // UART0的时钟源设为PCLK #define UART_BRUD(baud) { rUBRDIV0 = ((UART_CLK / (baud * 16)) - 1) } void __irq uart_irq_recv(void) { uint8 buf_recv; uint8 buf = 接收中断发生...rn ; uart_send(buf); buf_recv
[单片机]
S3C2440通过v4l2采集在lcd上显示
S3C2440通过v4l2采集在lcd上显示 #include sys/time.h #include sys/types.h #include asm/types.h #include sys/stat.h #include fcntl.h #include unistd.h #include stdlib.h #include stdio.h #include string.h #include sys/mman.h #include errno.h //#include jpeglib.h #include linux/fs.h #include linux/kernel.h #include linux/videodev.
[单片机]
51单片机定时器产生方波
使用单片机定时器在P1.0口产生200Hz方波程序 #include reg52.h void main() { P1^0 = 0; // 清P0口 ///////// TMOD = 0x00; // T0使用定时模式,工作模式0,无门控位 TH0 = 0x60; // 为T0填入初值,定时时间5ms TL0 = 0x78; TR0 = 1; // 启动T0 ET0 = 1; // 允许定时器0中断 EA = 1; // CPU开放中断 while(1); // 循环等待 } void timer0_in
[单片机]
使用定时器1以方式0产生周期为500us的方波连续脉冲
设单片机晶振频率为6MHz,要求使用定时器1以方式0产生周期为500us的等宽正方波连续脉冲,并由P1.0输出,以查询方式完成。 求单片机高手帮忙! ;---------------------------------------------------------------- 分析: 方式0,求初始值时,稍麻烦点。 按照题目要求,需要定时250us。 因为晶振频率为6MHz,指令周期就是2us,那么计数值就是125。 因为方式0的最大计数值是 2^13,于是有:     初始值 = 8192-125 = 8067 = 1111 1100 00011 使用方式0,要求把1111110000011,分成高8位和低5位,故有:   
[单片机]
MSP430利用定时器捕获功能,计算脉冲间隔和频率
MSP430利用定时器捕获功能,计算脉冲间隔和频率: void TimrA1Init_captrue(void) { TA0CTL = TASSEL0+TACLR+TAIE+MC1; //时钟信号选择MCLK,计数模式为连续增计模式 TA0CCTL1 = CM1+SCS+CAP+CCIE; //输入下降沿捕获,CCI1A为捕获信号源 P1SEL |=BIT2; //设置P1.2端口为功能模块CCI1A输入捕获 } unsigned int TimeGap=0; #pragma vector=TIMER0_A1_VECTOR //定时器A中断处理 __interrupt void timer_a(void
[单片机]
如何延长电池寿命的触敏定时器开关
  某种类型的光电无绳鼠标采用两节AA碱性电池。它没有电源开关。当不使用时,它会自动以低占空比来切换光源的开关,以降低功耗。然而,这种功能仍会耗尽电池能量,令人扫兴地使鼠标不能使用。问题的解决方案是增加一个电池开关,它能在一个预定时间后自动断开电池。这种方法不需要拆装或其它类型的改动。本设计实例描述了两种独特的实现方法,它采用一种触敏式定时开关,可以将其加到很多采用电池工作,而可能无意中未断电的设备中。   图1电路表示了开关的模拟实现。图2与图3是数字实现。这个概念是在电池的负极与电池夹的弹簧触点之间放入一个30mil的双面PCB(印制电路板)条(图中的A)。Q3是一只低阈值MOS晶体管,它连接在板条的两侧,作为一个开关元件
[电源管理]
如何延长电池寿命的触敏<font color='red'>定时器</font>开关
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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