6410中的PWM 定时器
我觉得主要的知道下面这几个内容吧。
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 定时器的更多相关文章
- Keil MDK STM32系列(八) STM32F4基于HAL的PWM和定时器输出音频
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- Keil MDK STM32系列(七) STM32F4基于HAL的PWM和定时器
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- STM32中的PWM的频率和占空比的设置
转于http://blog.csdn.net/liming0931/article/details/8491468 下面的这个是stm32的定时器逻辑图,上来有助于理解: TIM3的ARR寄存器和 ...
- Jmeter—7 测试中使用到的定时器和逻辑控制器
1 测试中提交数据有延时1min,所以查询数据是否提交成功要设置定时器. 固定定时器页面:单位是毫秒 [dinghanhua] 2 集合点.Synchronizing Timer 集合点编辑:集合用户 ...
- C#中WebService 的 Timer定时器过段时间后自动停止运行
我用.net做的一个Timer定时器,定时获取短信并给予回复,但大概过了十几个小时以后,Timer定时器会自动停止,再发送短信就不能收到回复,需要在服务器中重新运行定时器才可以,请教各位! 我是在.n ...
- Java 中Timer和TimerTask 定时器和定时任务使用的例子
转自:http://blog.csdn.net/kalision/article/details/7692796 这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求 Timer类是用来执行任 ...
- iOS中的几种定时器详解
在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,经过查阅资料,大概有三种方法: ...
- C#中自定义高精度Timer定时器的实例教程
Timer 用于以用户定义的事件间隔触发事件.Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理.它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用 ...
- rt-thread中线程内置定时器的作用 ---
@2019-01-15 [小记] 常见到在内核组件的接口函数中,配置和启动一个定时器后,启动线程调度 我猜想是超时时间到达后恢复调用接口函数的线程以执行线程调度语句后的代码
随机推荐
- oracle 存储过程心得2
1.退出存储过程 return if old_save_time = new_save_time then--没有最新数据,退出 insert into hy_data_handle_mark(id, ...
- tf随笔-1
生成新的计算图,并完成常量初始化,在新的计算 图中完成加法计算 import tensorflow as tf g1=tf.Graph() with g1.as_default(): value=[1 ...
- C++友元函数实现
友元函数是一种特殊的函数,它必须要在类中进行声明,但其本身并不是类的成员函数,但友元函数可以访问类的私有成员变量. 友元函数的好处: 1.实现类之间的数据共享 2.提高程序运行效率,方便编程 友元函数 ...
- android 字符串string
String : 字符串类型 http://www.open-open.com/lib/view/open1387942832078.html 一.构造函数 String(byte[ ] by ...
- C# 浅拷贝与深拷贝(复制)
在有些时候,我们需要从数据库读取数据填充对象或从硬盘读取文件填充对象,但是这样做相对耗时.这时候我们就想到了对象的拷贝.本文即以实例形式解析了C#浅拷贝和深拷贝的用法. C#中有两种类型变量,一种 是 ...
- 有限状态机(Finite-state machine, FSM)的C语言实现
有限状态机,也称为FSM(Finite State Machine),其在任意时刻都处于有限状态集合中的某一状态.当其获得一个输入字符时,将从当前状态转换到另一个状态,或者仍然保持在当前状态.任何一个 ...
- ODBC、OLEDB、ADO、SQL的关系
对于一个刚接触数据库的菜鸟来说(比如我),总是搞不清SQL.ADO.OLE DB.ODBC,大脑中一片混乱,好像懂了,又好像没懂,非常的苦恼,今天下了点功夫研究了一下,贴出来,其中肯定有好多错误,希望 ...
- golang动态调用方法
package main import ( "fmt" "reflect" ) type YourT1 struct { } func (y *YourT1) ...
- Vue.js:安装
ylbtech-Vue.js:安装 1.返回顶部 1. Vue.js 安装 1.独立版本 我们可以在 Vue.js 的官网上直接下载 vue.min.js 并用 <script> 标签引入 ...
- Models-详细操作
# 单表简单查询13种方法 1.all(): 查询所有结果 all: models.表名.objects.all() book_all=models.Book.objects.all() # 结果是q ...