一起学mini2440裸机开发(四)--S3C2440定时器学习

转载 2015年11月20日 22:03:49

S3C2440定时器原理概述

        s3c2440有5个16位定时器,定时器0、1、2和3有脉冲宽度调制(PWM)功能,因此这4个定时器也被称为PWM定时器。定时器4是一个内部的定时器,没有外部输出引脚。

        定时器的时钟源是PCLK,定时器工作所需频率并不等于PCLK,还要进一步将PCLK通过内部的分频器分频才能得到。这里也可以看出外部设备所需的工作频率不一定等于它的时钟源。其中,定时器0、1公用一个分频器,另外3个定时器公用一个分频器。分频器输入信号经过第2级分频器进一步降低时钟频率,然后输出作为定时器工作的时钟。下图为由PCLK得到定时器工作时钟的框图:

       

    虽然S3C2440定时器有5个,但是它们的工作原理都是相同的,只需要理解一个定时器的工作原理即可。对于某一个定时器,其内部结构原理如图2所示。寄存器TCMPBn和TCNTBn用于缓存定时器n的比较值和初始值;TCON用于控制定时器的开启与关闭;可以通过读取寄存器TCNTOn得到定时器的当前计数值。注意图2所示的是PWM定时器,也就是定时器0-3,不包含定时器4,定时器4也没有外部输出引脚。

       定时器工作原理概述:

           ●  首先,将定时器的比较值和初始值装入寄存器TCMPBn和TCNTBn中

           ●  然后,设置定时器控制寄存器TCON,启动定时器。此时,TCMPBn和TCNTBn中的值会加载到寄存器TCMPn和TCNTn中

           ●  此时,定时器会减1计数,即TCNTn进行减1计数,当TCMPn=TCNTn时,TOUTn引脚输出取反。

S3C2440定时器相关寄存器

         ●   定时器控制寄存器TCON

          由于各个定时器的工作原理相似,下面以定时器0为例进行讲解。在定时器控制寄存器TCON中,位[3:0]用于控制定时器0,其含义如表1所示:

功能简述 描述
0 开启/停止 0:停止定时器         1:开启定时器
1 手动更新 0:未使用                1:TCMPB0和TCNTB0中的值会加载到寄存器TCMP0和TCNT0中
2 输出控制

0:当TCMP0=TCNT0时,TOUTO0引脚输出不翻转

1:当TCMP0=TCNT0时,TOUTO0引脚输出翻转

3 自动加载 0:自动加载             1:当TCNTO0的值减到0时,TCMPB0中的值会加载到寄存器TCMPB0和TCNTB0中

          ●    定时器比较值缓存寄存器TCMPBn、计数值缓存寄存器TCNTBn

          这两个寄存器用于存储定时器的比较值初始值和计数值初始值。

          ●    定时器比较值寄存器TCMPn、计数值寄存器TCNTn

          这两个寄存器是定时器内部寄存器,用户无需对其进行写操作。

          ●     定时器观察值寄存器TCNTOn

          在定时器减1计数过程中,TCNTn的值可以通过TCNTOn寄存器得到。

          ●     定时器配置寄存器TCFG0、TCFG1

          这两个寄存器很重要啊。本节开头讲过,PCLK经过两级分频器,输出频率作为定时器的工作频率,如图1所示。因此,一定要有寄存器来设置分频系数。

             ①定时器配置寄存器TCFG0用于控制第1级分频器的分频系数,分频器输出频率为:PCLK/(prescaler value+1),其中prescaler value=0~255。

             ②定时器配置寄存器TCFG1用于控制多路开关。divider value=2,4,8,16

             定制器的输入时钟=PCLK/(prescaler value+1)/(divider value)。下图3为定时器0的输入时钟产生过程:

    

 

          从图1和图3可以看出,定时器0、1公用一个第1级分频器,第1级分频器的分频系数由TCFG0的位[7:0]控制;定时器2、3、4公用另一个第1级分频器,该分频器的分频系数由TCFG0的位[15:8]控制。同时,从图3可以看到,第2级分频器的分频系数是确定的,只有5种类型:2分频、4分频、8分频、16分频和外接时钟TCLKn(n=0或1),定时器配置寄存器TCFG1用于控制多路开关,每个定时器都由其中的连续4位控制。以定时器0为例,TCFG1的位[3:0]用于控制定时器0。下图为S3C2440数据手册上关于TCFG1的说明:

       

  

   下面以定时器0举例子说明定时器的配置过程。

    例:设置适当的分频系数,是定时器0的输入时钟为62.5KHz。

          因为PCLK为50MHz,则50MHz/62.5KHz=800,即需要对PCLK进行800分频。所以使第1级的分频系数为100,第2级的分频系数为8即可满足要求。最后,只需要将分频系数写入定时器控制寄存器中相应的位即可,代码如下:

       

 TCFG0&=~(0xff);    //设置第1级分频系数,分频系数为99
 TCFG0|=99;

 TCFG1&=~(0xf);      //设置第2级分频系数,分频系数为8
 TCFG1|=0x02;  //62.5KHz=50MHz/(99+1)/8

  

     下一节介绍两个关于定时器0的实验,在这里贴出关于定时器0的初始化代码,相信大家会理解的更好一些的。

    /***************************************************************
    * 函数名称:void Timer0_Init(void)
    * 参数说明:无
    * 全局变量:无
    * 返 回 值:无
    * 功    能:对于50MHz的PCLK,经过分频获得62.5KHz的定时器0
    *            的输入时钟。
    ***************************************************************/
    void Timer0_Init(void)
    {
        TCFG0&=~(0xff);    
//设置第1级分频系数,分频系数为99
        TCFG0|=99;

        TCFG1&=~(0xf);      //设置第2级分频系数,分频系数为8
        TCFG1|=0x02;        //62.5KHz=50MHz/(99+1)/8

        TCNTB0=62500;       //1s中断一次。经过上述分频器得到定时器0的输入时钟频率为62.5kHz,即定时器
                                        //每秒钟计数62500次。因此,初始化时,定时器0计数值初始值为62500
                                        //在这里我们可以看出TCMPBn没有设置,因为咱们用它的默认值0,所以就不需要设置

        TCON|=(1<<1);     //开启手动更新位,即当定时器开启后,TCMPB0和TCNTB0中的值会加载到寄存器TCMP0和TCNT0中
        TCON=0x09;         //关闭手动更新位,设置自动加载位,同时开启定时器,这样,TCNT0进行减1计数,当TCNT0中的计
                                      //数值减到0时,TCNTB0、TCMPB0中的数据分别会自动加载到TCNT0、TCMP0中并进行新一轮的减1计数
     }

 

     

一起学mini2440裸机开发(十二)--mini2440的串口中断实验

这一节实现利用中断实现串口的中断功能,关于串口的原理我就不再讲述了,如果不明白,就请查看我的另一篇博客    http://blog.csdn.net/mybelief321/article/det...
  • mybelief321
  • mybelief321
  • 2013年05月27日 10:46
  • 2122

一起学mini2440裸机开发(二)--MDK自带的S3C2440.s分析

上一节,咱们在建立工程的时候,默认的是使用MDK自带的启动代码,这些启动代码到底做了什么工作呢?在这里我想探究一下,探究不全没什么事,能看懂个大概就行了。    我先申明一下,其实我并不是头一次学A...
  • mybelief321
  • mybelief321
  • 2013年05月11日 13:39
  • 3443

一起学mini2440裸机开发(六)--UART原理与基础实验

我个人感觉UART也不算是很难,学过单片机的相信都用过UART,在这里还是说说它吧,并且在写基础实验并调试的时候,出现了一个问题,就是我们平时使用jlink调试程序都是基于在sdram中运行的,由于r...
  • mybelief321
  • mybelief321
  • 2013年05月16日 12:34
  • 2983

s3c2440裸机开发环境的搭建

s3c2440裸机开发环境的搭建 用于arm裸机程序开发的IDE基本有MDK,IAR,还有ADS,也可以选择在linux下安装交叉编译链来进行开发。笔者选择的是MDK作为我进行开发的IDE。下面介绍...
  • lookerson
  • lookerson
  • 2014年09月24日 23:35
  • 2218

mini2440裸机试炼之IIS——音乐播放器

IIS 信号频率设置 IIS(Inter-IC Sound)由飞利浦公司开发,是一种常用的音频设备接口,主要用于CD、MD、MP3等设备。...
  • muyang_ren
  • muyang_ren
  • 2014年08月16日 15:50
  • 1862

一起学mini2440裸机开发(四)--S3C2440定时器学习

S3C2440定时器原理概述         s3c2440有5个16位定时器,定时器0、1、2和3有脉冲宽度调制(PWM)功能,因此这4个定时器也被称为PWM定时器。定时器4是一个内部的定时器,没...
  • mybelief321
  • mybelief321
  • 2013年05月13日 13:56
  • 2757

keil5(MDK5)配置S3C2440裸机开发调试环境

图文配合,详细讲解keil5(MDK5)配置s3c2440裸机开发调试环境,包括软件工具得下载、安装,工程创建,程序烧写,目标格式文件(bin,axf,hex)的转换。...
  • tyhj_sf
  • tyhj_sf
  • 2016年05月13日 16:27
  • 5739

一起学mini2440裸机开发(三)--S3C2440时钟学习

首先,我们应该知道一点,mini2440开发板在没有开启时钟前,整个开发板全靠一个12MHz的外部晶振提供频率来工作运行的,也就是说CPU、内存、UART、ADC等所有需要用到时钟频率的硬件都工作在1...
  • xgx198831
  • xgx198831
  • 2014年05月18日 09:44
  • 3114

一起学mini2440裸机开发(十)--mini2440外部中断实验

我今天一整天都在试着将TQ2440的那种处理中断的方法(即安装中断向量表)移植到MDK中的mini2440,但是一直没成功,这种方法一直没成功,后来又想,还是先从最简单的开始吧,就是不利用中断向量表,...
  • mybelief321
  • mybelief321
  • 2013年05月26日 21:18
  • 3148

关于韦东山书上的裸机程序在mini2440上的运行

近来又开始学习韦东山书上的裸机驱动,在运行SDRAM中的代码的时候发现不能正确运行,当初下载的方法是通过mini2440自带的supervivi的d命令烧写程序。现在想想真是犯了很多错误。在韦东山的书...
  • lin111000713
  • lin111000713
  • 2014年08月17日 23:14
  • 1088
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一起学mini2440裸机开发(四)--S3C2440定时器学习
举报原因:
原因补充:

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