您的位置 首页 产品

6410中的PWM 定时器

看了OK6410的手册,感觉晕晕的。需要整理一下思路。我觉得主要的知道下面这几个内容吧。定时器的电路结构。定时器的工作原理是什么。定时器…

看了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.守时器的电路结够图: 

  1. 守时器架构流程。
    • à经过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< for(j=0;j<1000;j++)
uDelay(1000);
}
}

}
void Main(void)
{
GPIO_Init();
LedTest();
}

补白: 这儿仅仅运用了守时器来准确守时,并没用用守时中止服务。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/275452.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部