S3C2440A有5个16位定时器。其中定时器0、1、2和3具有脉宽调制(PWM)功能。定时器4是一个无输出引脚的内部定时器。定时器0还包含用于大电流驱动的死区发生器

定时器0和1共用一个8位预分频器,定时器2、3和4共用另外的8位预分频器。每个定时器都有一个可以生成5种不同分频信号(1/2,1/4,1/8,1/16和TCLK)的时钟分频器。每个定时器模块从相应8位预分频器得到时钟的时钟分频器中得到其自己的时钟信号。8位预分频器是可编程的,并且按存储在TCFG0和TCFG1寄存器中的加载值来分频PCLK

每个定时器有它自己的由定时器时钟驱动的16位递减计数器。当递减计数器到达零时,产生定时器中断请求通知CPU定时器操作已经完成。当定时器计数器到达零时,相应的TCNTBn的值将自动被加载到递减计数器以继续下一次操作

对于定时器的使用有两种模式,第一是普通定时第二是PWM输出

先说普通定时,一般定时器的使用流程都会包含这几步

1.       在低功耗寄存器里面启用相应的定时器外设

2.       设置时钟分频比,获取定时器的计数时钟

3.       设置定时器的定时值(重载值),配置中端,启动定时器

4.       等待中断发生,中断处理函数中清除中断

依靠这几步,有以下寄存器我们需要注意

首先,设置PCLK到定时器的分频比例,有两种时钟,分别是01定时器和234定时器

然后进行第二次分频

可选择1/2 1/4 1/8 1/16几种时钟,时钟源是从上一个寄存器分频来的

设置定时器的自动重载和启动定时器,注意在这个寄存器中,请用手动更新了之后必须再次清零,否则定时器无法运行

我之前就遇到过这个问题

设置定时器自动重载的值

再然后按照之前的设置中断的方式设置中断,定时器没有次级源,以time0为例

1.       源挂起srcpend

2.       中断模式intmode

3.       中断屏蔽intmask

4.       中断挂起intpend

使能中断之后定时器就可以正常使用了

具体代码如下:

Timer.c

#include "timer.h"

u8 timer0Up = 0;

void __irq timer0()
{
rSRCPND |= (1<<10);//清除源挂起
rINTPND |= (1<<10);//清除中断挂起 timer0Up = 1;
} //定时器初始化
//prescaler 8为分频器值,0-255
//mux定时器的选通输入 0 1/2 1 1/4 2 1/8 3 1/16
//定时器的重载值
void InitTimer0(u8 prescaler,u8 mux,u16 count)
{
rCLKCON |= (1<<8); //打开timer时钟 rTCFG0 &= ~0xff; //清零分频器
rTCFG0 |= prescaler; //设置预分频器 rTCFG1 &= ~(0x0f<<0);
rTCFG1 |= (mux<<0); //设置选通输入 //设置定时器的计数值
rTCMPB0=0x0;
rTCNTB0 =count; //设定初值 //启动定时器
rTCON |=(1<<1); //更新TCNTB0和TCMPB0
rTCON |= (1<<3);//启动自动重载
rTCON &= ~(1<<1);//清零手动更新 rSRCPND |= (1<<10);//清除源挂起
rINTPND |= (1<<10);//清除中断挂起
rINTMOD &= ~(1<<10);//设置中断模式为IRQ模式 rINTMSK &= ~(1<<10);//使能定时器中断 pISR_TIMER0 =(unsigned)timer0; //设置中断地址 rTCON |= (1<<0);//启动定时器0
}

Timer.h

#ifndef __TIMER_H
#define __TIMER_H
#include "2440addr.h"
#include "led.h"
#include "uart0.h" extern u8 timer0Up ; void InitTimer0(u8 prescaler,u8 mux,u16 count); #endif

PWM波形输出时需要注意几个别的寄存器

第一:PWM输出不需要开启中断,但是要设置相应的引脚复用功能为pwm功能,如图,TCLK

第二,使用pwm功能必须要使能比较寄存器,也就是

第三,根据需要看是否需要反向,何为反向呢

就是TCNT<TCMP的时候为低电平,否则高电平,正好与正常的相反,基本要点就那么多,pwm连接到蜂鸣器上,可听到声音的状态响一下停一下(因为频率1HZ很低),剩下的请看代码

Pwm.c

#include "pwm.h"

// compare 比较寄存器的值
void Tomer0PwmInit(u8 prescaler,u8 mux,u16 count,u16 compare)
{
rGPBCON &=~3;
rGPBCON |=2; //设置GPB0为OUT0
rGPBUP=0x0; //使能上拉 rCLKCON |= (1<<8); //打开timer时钟 rTCFG0 &= ~0xff; //清零分频器
rTCFG0 |= prescaler; //设置预分频器 rTCFG1 &= ~(0x0f<<0);
rTCFG1 |= (mux<<0); //设置选通输入 //设置定时器的计数值
rTCMPB0=compare; //比较寄存器的值
rTCNTB0 =count; //设定初值 //启动定时器
rTCON |=(1<<1); //更新TCNTB0和TCMPB0
rTCON |= (1<<3);//启动自动重载
rTCON &= ~(1<<1);//清零手动更新
rTCON |= (1<<0);//启动定时器0
}

Pwm.h

#ifndef __PWM_H_
#define __PWM_H_
#include "2440addr.h"
#include "def.h" // compare 比较寄存器的值
void Tomer0PwmInit(u8 prescaler,u8 mux,u16 count,u16 compare); #endif

S3C2440的定时器详解的更多相关文章

  1. STM32F103的11个定时器详解(转)

    源:STM32F103的11个定时器详解 STM32F103系列的单片机一共有11个定时器,其中:2个高级定时器4个普通定时器2个基本定时器2个看门狗定时器1个系统嘀嗒定时器 出去看门狗定时器和系统滴 ...

  2. 定时器详解和应用、js加载阻塞、css加载阻塞

    1.setTimeout().setInterval()详解和应用 1.1 详解: setTimeout.setInterval执行时机 1.2 存在问题: setInterval重复定时器可能存在的 ...

  3. ATmega328P定时器详解

    写这篇文章,纯粹是想为博客拉点点击量.在博客园,游客访问好像是不计入阅读量的,而作为一个十八线博主,注册用户的访问应该以搜索引擎为主,博客园首页为次,个位数的粉丝就别谈了. 所以,希望各位从搜索引擎点 ...

  4. oracle创建定时器详解|interval属性

    定时任务首先先创建定时任务中的存储过程 create or replace procedure pro_jggl as                                          ...

  5. s3c2440系统时钟详解

    一.S3C2440系统时钟体系 S3C2440的时钟控制逻辑可以外接晶振,然后通过内部电路产生时钟源:也可以直接使用内部提供的时钟源,他们通过引脚的设置来选择.时钟逻辑给整个芯片提供了3中时钟:FCL ...

  6. Node中的定时器详解

    在大多数的业务中,我们都会有一些需求,例如几秒钟实现网页的跳转,几分钟对于后台数据进行清理,node与javascript都具有将代码延迟一段时间的能力.在node中可以使用三种方式实现定时功能:超时 ...

  7. JavaScript定时器详解及实例

    JS里设定延时: 使用SetInterval和设定延时函数setTimeout 很类似.setTimeout 运用在延迟一段时间,再进行某项操作. setTimeout("function& ...

  8. IOS中的NSTimer定时器详解

    /* 在IOS中有多种定时器,这里我对NSTimer定时器做了一个简单的介绍.如果你是小白,你可能会从这篇文章中学习到一些知识,如果你是大牛,请别吝啬你的评论,指出我的不足,你的质疑是对我最大的帮助. ...

  9. iOS中的几种定时器详解

    在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,经过查阅资料,大概有三种方法: ...

随机推荐

  1. MVVM的架构设计与团队协作 with StoryBoard

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  2. CDockablePane 记忆界面布局的问题

    CWinAppEx类的LoadCustomState()和SaveCustomState()用于向注册表读取和保存应用程序的界面信息,重载该方法可以取消自动记忆界面布局. void CxxxApp:: ...

  3. Windows API 之 FineFirstFile、FindNextFile

    参考:https://msdn.microsoft.com/en-us/library/aa364418%28VS.85%29.aspx FindFirstFile Searches a direct ...

  4. dev GridControl直接打印 纵向合并单元格

    GridControl纵向合并单元格 只需设置 gridView->OptionView->AllowCellMerge=true; 效果 提示: 精确到列 前提是gridview1已经允 ...

  5. json中文乱码问题

    首先在 tomcat的 D:\apache-tomcat-7.0.57\conf\server.xml里添加中文编码 <Connector port="8080" proto ...

  6. P3P解决cookie存取的跨域问题

    最近在做一个流量统计的东西的时候,偶然发现IE在对iframe里面的页面写Cookie的时候有一些安全限制,导致读取Cookie不成功,找了好长时间的解决办法,重要找到如下的办法: 1.页面里的COO ...

  7. mysql连接不上Uncaught exception 'PDOException' with message 'could not find driver

    需要给你的PHP加一个PDO扩展打开PHP.INI 把extension=php_pdo.dll 前面的分号去掉 重启APACHE. extension=php_pdo_mysql.dll

  8. 定制化jQuery

    毋庸置疑,jQuery很强大,很方便,但是......越来越臃肿,怎么办?,jquery只基于模块化开发的,可以通过工具定制jquery,选择你需要的模块即可. 下面这个网站可以帮你完成定制 http ...

  9. Cordova插件开发

    我在网上找了很多关于Cordova插件开发的例子,都不是我想要的,我只想要,怎么调用这个生成出来的js,最终得到了最为直接又简单的方法,希望给能帮助到大家! document.addEventList ...

  10. ecos的app生命周期

    5种变迁,安装.更新.启动.暂停.卸载,每个app都可以自行维护每种变迁 方法简单,只需要在app/$app_name目录下定义task.php文件 <?php class desktop_ta ...