看了OK6410的手册,感觉晕晕的。 需要整理一下思路。


我觉得主要的知道下面这几个内容吧。

1. 定时器的电路结构。

2. 定时器的工作原理是什么。定时器如何来使用。{使用的时序是什么,在时间轴上各个寄存器应该如何配置}

3. 里面涉及的寄存器都有哪些。 各个寄存器的职责是什么。

1. 简单介绍 :

S3C6410X中有5个定时器,这些定时器产生内部中断。其中,Timer0和Timer1具有PWM功能,而Timer2,3,4没有此功能。

PWM具有两种操作模式:自动装载模式,一次触发模式。为实现PWM功能,芯片提供了16个功能寄存器。这些功能寄存器都连接APB总线。

定时器具有双缓冲特性,这样就能在不停止当前定时器操作的情况下,为下次定时器运行装入新的数值。尽管为定时器设置了新数值,但当前的定时操作能够成功完成。定时器从TCNTBn读取的值是为下次延时定时用的,并不影响当前定时器的运行。当TCNTn减小到0的时候,TCNTBn的值会自动复制到TCNTn中,这就是说的自动装载操作。定时器的当前计数值可以从定时计数观察寄存器中TCNTOn读取。如果TCNTn为0且从装载也为0的话则TCNTn不在进行下次操作。

2. 定时器的电路结够图: 

3. 定时器架构流程。

PCLK ---à 经过8位的预分频器【8bit prescaler0】 --à 分频器divider [1/1 1/2 1/4
1/8 1/16] -à 多路选择器 MUX -à 逻辑控制器【比较TCMPBn和TCNTBn的数值】--à (deadzone
generator ) --à 时钟

计算公式:

4.  定时器的工作原理是什么。 

每个定时器有32位的递减计数器。递减计数器的初始值由TCNTBn来加载。 当计数器的值变为0时,
定时器产生中断信号通知cpu定时器操作完成。 当计数器的值变为0时,TCNTBn的值自动加载到递减计数器并开始下个周期的操作。
如果定时器停止工作(比如,在定时器工作模式期间清空寄存器TCONn的定时器使能位,这样对应的定时器就会停止工作),这时TCNTBn的值就不会加载到定时器。

而对于PWM
功能,要用到寄存器TCMPBn,当递减计数器down-counter的值和比较寄存器TCMPBn的值相同时,定时控制逻辑模块就会改变输出电平。因此比较寄存器TCMPBn决定了PWM的输出。

而且TCNTBn 和
TCMPBn寄存器具有双缓冲特性,这样就能在不停止当前定时器操作的情况下,为下次定时器运行装入新的数值。尽管为定时器设置了新数值,但当前的定时操作能够成功完成。

5. 定时器的工作时序

我说怎么在上面的第一步中突然冒出个TCNTn和TCMPn,我以为是数据手册错了,因为在PWM提供的16个寄存器中没有这两个寄存器。
那么请看下面: 

从上面内容看出。TCNTn和TCMPn是内部的寄存器(internal registers
).而TCNTn寄存器的值可以通过读取寄存器TCNTOn来获得。

6. 16个特殊功能寄存器

7.接下来看一下飞凌提供的精确控制LED的程序。【利用定时器来精确控制LED跑马灯,每隔1s轮询点亮】

#define rGPMCON (*(volatile
unsigned*)(0x7F008820))

#define rGPMDAT (*(volatile
unsigned*)(0x7F008824))

#define rGPMPUD (*(volatile
unsigned*)(0x7F008828))

#define PCLK 66000000 //forS3C6410 66MHZ

#define HCLK 133000000 //forS3C6410 133MHZ

#define rTCFG0 (*(volatile
unsigned*)(0x7F006000))

#define rTCFG1 (*(volatile
unsigned*)(0x7F006004))

#define rTCON (*(volatile
unsigned*)(0x7F006008))

#define rTCNTB0 (*(volatile
unsigned*)(0x7F00600C))

#define rTCMPB0 (*(volatile
unsigned*)(0x7F006010))

#define rTCNTO0 (*(volatile
unsigned*)(0x7F006014))

#define rTCNTB1 (*(volatile
unsigned*)(0x7F006018))

#define rTCMPB1 (*(volatile
unsigned*)(0x7F00601c))

#define rTCNTO1 (*(volatile
unsigned*)(0x7F006020))

#define rTCNTB2 (*(volatile
unsigned*)(0x7F006024))

#define rTCNTO2 (*(volatile
unsigned*)(0x7F00602c))

#define rTCNTB3 (*(volatile
unsigned*)(0x7F006030))

#define rTCNTO3 (*(volatile
unsigned*)(0x7F006038))

#define rTCNTB4 (*(volatile
unsigned*)(0x7F00603c))

#define rTCNTO4 (*(volatile
unsigned*)(0x7F006040))

#define rTINT_CSTAT (*(volatile
unsigned*)(0x7F006044))

void uDelay(int usec)

{

unsigned int val=(PCLK)/1000000-1; //val = 65

//configure prescaler and divider

rTCFG0&=~(0xff<<8); //0000_0000_1111_1111
TCFG0[15:8-7:0]

rTCFG0|=0<<8; //0000_0000_0000_0000 |
0000_0000_1111_1111 prescalar0 = 255 timer0,timer1 的prescalar
value= 255 timer2,3,4的prescalar1 value = 0

rTCFG1&=~(0xf<<8); // 0000_1111_1111
TCFG1 [7:0] = 1111_1111 TCFG1[11:8] = 0000(select mux for timer2 .
divider value = 1 );

rTCFG1|=0<<8;

//compute :

//timer input clock frequency = PCLK /({prescaler
value + 1})/{divider value}

// timer2 input clock frequency = 66M /(1)/(1)= 66M
hz

//configure timer counter buffer and enable
timer2

rTCNTB2=val;

rTCON&=~(0xf<<12); //
0000_1111_1111_1111

rTCON|=0xb<<12; // 1011_0000_0000_0000
|0000_1111_1111_1111 = 1011_1111_1111_1111

rTCON&=~(2<<12); // 1101_1111_1111_1111
&1011_1111_1111_1111 = 1001_1111_1111_1111

【// TCON(Timer control register)

//1001 : 表示 : auto-reload , start timer2】

//TCON[15]=1 auto-reload

//TCON[14] Reserved bits

//TCON[13]=0 no operatin , =1,update TCNTB2
TCMPB2

//TCON[12]=0 stop , =1 ,start timer2

//rTCON&= 0x9fff; //这样不就可以了吗 ,为什么要花三条语句来写。

while(usec--){

while(rTCNTO2 >= val>>1);

while(rTCNTO2 < val>>1);

};

}

void msDelay(int time)

{

volatile unsigned int i,j;

for(i=0;i<2000000;i++)

for(j=0;j

}

void GPIO_Init(void)

{

rGPMCON =0x11111;

rGPMPUD =0x00;

rGPMDAT =0X1F;

}

void LedTest(void)

{

volatile unsigned int i ,j;

while(1)

{

for(i=0;i<4;i++)

{

rGPMDAT =~(1<<i);

for(j=0;j<1000;j++)

uDelay(1000);

}

}

}

void Main(void)

{

GPIO_Init();

LedTest();

}

备注: 这里只是使用了定时器来精确定时,并没用用定时中断服务。














6410中的PWM&nbsp;定时器的更多相关文章

  1. Keil MDK STM32系列(八) STM32F4基于HAL的PWM和定时器输出音频

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  2. Keil MDK STM32系列(七) STM32F4基于HAL的PWM和定时器

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  3. STM32中的PWM的频率和占空比的设置

    转于http://blog.csdn.net/liming0931/article/details/8491468 下面的这个是stm32的定时器逻辑图,上来有助于理解:   TIM3的ARR寄存器和 ...

  4. Jmeter—7 测试中使用到的定时器和逻辑控制器

    1 测试中提交数据有延时1min,所以查询数据是否提交成功要设置定时器. 固定定时器页面:单位是毫秒 [dinghanhua] 2 集合点.Synchronizing Timer 集合点编辑:集合用户 ...

  5. C#中WebService 的 Timer定时器过段时间后自动停止运行

    我用.net做的一个Timer定时器,定时获取短信并给予回复,但大概过了十几个小时以后,Timer定时器会自动停止,再发送短信就不能收到回复,需要在服务器中重新运行定时器才可以,请教各位! 我是在.n ...

  6. Java 中Timer和TimerTask 定时器和定时任务使用的例子

    转自:http://blog.csdn.net/kalision/article/details/7692796 这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求 Timer类是用来执行任 ...

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

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

  8. C#中自定义高精度Timer定时器的实例教程

    Timer 用于以用户定义的事件间隔触发事件.Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理.它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用 ...

  9. rt-thread中线程内置定时器的作用 ---

    @2019-01-15 [小记] 常见到在内核组件的接口函数中,配置和启动一个定时器后,启动线程调度 我猜想是超时时间到达后恢复调用接口函数的线程以执行线程调度语句后的代码

随机推荐

  1. 剑指offer--28.栈的压入、弹出序列

    时间限制:1秒 空间限制:32768K 热度指数:300132 本题知识点: 栈 算法知识视频讲解 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假 ...

  2. flash代码

    Flash常用的动作命令一.Flash中的常用命令:1.在当前帧停止播放 on(release){ stop();} 2.从当前帧开始播放 on(release){ play();} 3.跳到第 10 ...

  3. [Hive]HiveServer2配置

    HiveServer2(HS2)是一个服务器接口,能使远程客户端执行Hive查询,并且可以检索结果.HiveServer2是HiveServer1的改进版,HiveServer1已经被废弃.HiveS ...

  4. 2 秒杀系统模拟基础实现,使用Redis实现

    这一篇,我们来使用redis进行数据存储. 新建一个redis的service实现类 package com.tianyalei.service; import com.tianyalei.model ...

  5. Linux 下spark安装

    一.安装前提: 1.java环境(jdk1.8) 2.scala环境(2.0) 3.python 环境(3.5)  :注如果使用pyspark的话,这个才是必须的. 二.spark安装 在官网下载安装 ...

  6. 旧书重温:0day2【8】狙击windows的异常处理实验

    现在进入0day2的第六章内容 其中第六章的书本内容我都拍成了图片格式放在了QQ空间中(博客园一张一传,太慢了)http://user.qzone.qq.com/252738331/photo/V10 ...

  7. Apache中 RewriteCond 规则参数介绍 转

    摘要: RewriteCond指令定义了规则生效的条件,即在一个RewriteRule指令之前可以有一个或多个RewriteCond指令.条件之后的重写规则仅在当前URI与Pattern匹配并且满足此 ...

  8. BJOI2019 游记

    BJOI 2019 游记 Day 1 开场拿到 \(T1\) 发现可以转成求平均 \(log\) 直接 \(AC\) 自动机上 \(Dp\) 一波即可 \(T2\) 发现是到数论神仙题,大概能想到要用 ...

  9. [BZOJ]4034: [HAOI2015]树上操作

    [HAOI2015]树上操作 传送门 题目大意:三个操作 1:a,b,c b节点权值+c 2:a,b,c 以b为根的子树节点权值全部+c 3:a,b 查询b到根路径的权值和. 题解:树链剖分 操作1 ...

  10. [Err] 1067 - Invalid default value for 'xxxTime'

    下面是导入sql脚本的的局部脚本 `xxxTime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 发现是NO_ZERO_IN_DATE,NO_Z ...