看了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. C#模拟网络POST请求

    using System; using System.IO; using System.Net; using System.Text; using System.Collections.Generic ...

  2. About toupper()

    // toupper.c #include <stdio.h> #include <string.h> #include <ctype.h> int main() ...

  3. 利用selenium webdriver点击alert提示框

    在进行元素定位时常常遇到这样的alert框: 那么该如何定位并点击确定或取消按钮呢?stackoverflow上找到了这个问题的答案. OK, Show you the code: driver.fi ...

  4. WindowManager实现悬浮可拖动效果

    现在360手机卫士有个流量统计的效果,开启流量统计后,在桌面上会出现一个显示流量的窗体,在任何界面都可以自由拖动. 模仿这个功能,做了一个统计手机信号强度的Demo, 界面效果如下: 从上面的截图可以 ...

  5. Photoshop脚本指南——Hello World

    作为一个程序猿,每一个东西的学习都是从Hello World开始的,从今天开始,让我们一起进入Photoshop脚本的世界,并以Hello World开始我们的旅程. 1.简介 Photoshop支持 ...

  6. Unity在协程(Coroutines)内开启线程(Threading )

    孙广东  2017.6.13 http://blog.csdn.NET/u010019717 为什么要在协程中开启线程, 因为很多时候我们是需要线程执行完成后回到主线程的.然后主线程在继续执行后续的操 ...

  7. C++ 资源管理 —— RAII

    RAII:在构造函数中申请资源,在析构函数中释放资源. 1. RAII 自动实现锁资源的释放 void bad() { m.lock(); f(); if (COND) return; m.unloc ...

  8. 利用Github免费搭建个人主页(个人博客)

    之前闲着, 利用Github搭了个免费的个人主页. 涉及: Github注册 Github搭建博客 域名选购 绑定域名 更多 一  Github注册 在地址栏输入地址:http://github.co ...

  9. 转载 fpga中 restoring 和 non-restoring 除法实现。

    对于non-restoring方法,主要是用rem和den移位数据比较,rem_d长度为den+nom的总长,den_d长度为den+nom的总长度,rem_d的初始值为{{d_width{1'b0} ...

  10. 十五、python沉淀之路--eval()的用法

    一.eval函数 python eval() 函数的功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法:eval(source[, globals[, locals]]) -> v ...