看了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. Android 中Activity,Window和View之间的关系

    转自:http://hi.baidu.com/xiaofanqing/blog/item/8261ac114ab14f64cb80c435.html 我这里根据我个人的理解来讲讲我个人对这3个概念的理 ...

  2. win+D可以最小化所有窗口,显示桌面 win+E可以快速打开我的电脑 这两个对我来说非常常用,要用熟练,节约时间

    win+D可以最小化所有窗口,显示桌面   win+E可以快速打开我的电脑

  3. python之路——文件操作

    阅读目录 初窥文件操作基本流程 文件编码 文件的打开模式 文件内的光标移动 with上下文管理 文件的修改 练习 回到顶部 初窥文件操作基本流程 计算机系统分为:计算机硬件,操作系统,应用程序三部分. ...

  4. Js中分号使用总结

    作者:尤雨溪链接:https://www.zhihu.com/question/20298345/answer/49551142来源:知乎著作权归作者所有,转载请联系作者获得授权. 没有应该不应该,只 ...

  5. Leetcode 944. Delete Columns to Make Sorted

    class Solution: def minDeletionSize(self, A: List[str]) -> int: ans = 0 for j in range(len(A[0])) ...

  6. Gradle配置IDEA正常识别JPA Metamodel Generator动态生成的代码

    我们在使用JPA动态查询构建查询条件时,为了实现安全的类型检查,常常需要引用Hibernate JPA Metamodel Generator自动为我们生成静态元模型类. 而这些类由于编译时由Hibe ...

  7. devops 几个方便的工具

    1. fake API      [canned](https://github.com/sideshowcoder/canned  )    fake API.      [wiremock](ht ...

  8. Python学习系列(七)( 数据库编程)

    Python学习系列(七)( 数据库编程)        Python学习系列(六)(模块) 一,MySQL-Python插件       Python里操作MySQL数据库,需要Python下安装访 ...

  9. bzoj 2259 [Oibh]新型计算机 ——最短路(建图)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2259 不是 n^2 条边!连那条边权为0的边之后,只要每个位置向它的前一个位置和后一个位置连 ...

  10. Could not find class 'org.ksoap2.serialization.SoapObject

    Could not find class 'org.ksoap2.serialization.SoapObject工程编译没问题,一在模拟器运行就报错! 这是由于ADT版本过高引发的问题,解决办法: ...