您的位置 首页 报告

体系时钟和定时器——PWM定时器

时钟控制逻辑给整个芯片提供3种时钟:FCLK用于CPU核;HCLK用于AHB总线设备,比如CPU核、存储器控制器、中断控制器、DMA和USB主机模块等;PC…

时钟操控逻辑给整个芯片供给3种时钟:FCLK用于CPU核;HCLK用于AHB总线设备,比方CPU核、存储器操控器、中止操控器、DMA和USB主机模块等;PCLK用于APB总线上的设备,比方WATCHDOG、IIS、IIC、PWM、MMC、ADC、RTC等等。

S3C2440 CPU核的作业电压为1.2V时,主频能够到达300MHz;作业电压为1.3V时,主频能够到达400MHz。开发板为12MHz,需求经过时钟操控逻辑的PLL进步体系时钟

S3C2440有两个PLL:MPLL和UPLL。UPLL专用于USB设备,MPLL用于设置FCLK、HCLK、PCLK。

图1 上电后MPLL的发动进程
LocK Time的长短由寄存器LOCKTIME设定。一般选用默认值。
检查芯片手册,MPLL计算公式如下图:

其间 m=MDIV+8, p=PDIV+2, s=SDIV

CLKDIVN寄存器:用于设置FCLK、HCLK、PCLK 三者份额。各种时钟份额对应的寄存器设置如下图所示:

1、 PWM(Pulse Width Modulation)定时器
S3C2440 有5个16位定时器。其间定时器0、1、2、3有PWM功用,即他们都有一个引脚,能够用过定时器来操控引脚周期性的凹凸电平改变;定时器4没有输出引脚。定时器时钟源为PCLK。内部结构如图所示:
定时器0 、1 共用第一个预分频器定时器2 、3、 4 共用第2个预分频器。预分频器的输出进入第二级分频器,它有5种频率的时钟:2、4、8、16分频。预分频经过TCFG0设置,分频值(2、4、8、16)经过TCFG1设置。

现在咱们能够归结发动一个PWM功用能够分为以下几步:

1、设置TOUT0-TOUT3,这需求装备相关外部引脚为TOUT形式。外部引脚GPB与TOUT为复用引脚
2、设置定时器的输出频率,而且经过TCFG0设置prescaler(预分频)的值。经过TCFG1设置divider的值。
3、详细脉冲宽度要经过TCMPBn与TCNTBn两个寄存器的设置来完结。这步涉及到寄存器内部逻辑的作业流程。如下:
将TCMPBn和TCNTBn装入初始值,在设置TCON寄存器之后会发动定时器,这时将过TCMPBn与TCNTBn两个寄存器的值装入内部寄存器TCMPn和TCNTn中,在定时器n的作业频率下,TCNTn开端减一计数,在TCNTn的值等于TCMPn的值的时分,TOUTn翻转,当TCNTn的值到达0的时分,再次翻转,就这样循环往复,形成了脉冲。而且触发定时器n的中止(假如设置中止的话)。
4、详细操控要交给TCON寄存器。它有以下几个功用:(先看一下数据手册)

由此能够看出,它有以下4个效果:

1、定时器的开端/中止。TCON[0]
2、手动更新。用于手动更新TCNTBn和TCMPBn,这儿要注意的是在开端定不时,必定要把这位清零,否则是不能敞开定时器。TCON[1]
3、输出回转。TOUTn不回转(0)/回转(1)TCON[2]
4、主动加载。当定时器计数到0时,TCMPBn和TCNTBn寄存器的值主动装入内部寄存器TCMPn和TCNTn中。TCON[3]
程序剖析如下:(这程序是赵春江教师的程序)

#include “2440addr.h”

#define U32 unsigned int

typedef unsigned char BOOL;

#define TRUE 1

#define FALSE 0

BOOL stop;

static void __irq Key3_ISR(void) /*暂停键,封闭蜂鸣器*/

{

rSRCPND = rSRCPND | (0x1<<2); /*界说EINT2*/

rINTPND = rINTPND | (0x1<<2);

rTCON &= ~0x8; /*制止定时器主动重载,即封闭定时器0111*/

stop = TRUE;

}

void __irq Key2_ISR(void) /*重启键,敞开蜂鸣器*/

{

rSRCPND = rSRCPND | 0x1; /*界说EINT0*/

rINTPND = rINTPND | 0x1;

stop = FALSE;

}

void delay(int a)

{

int k;

for(k=0;k

;

}

void Main(void)

{

int freq;

rGPBCON = 0x155556; /*B0为TOUT0,B5~B8为输出,给LED 0001 0101 0101 0101 0101 0110*/

rGPBUP = 0x7ff; /*0111 1111 1111封闭上拉使能*/

rGPFCON = 0xaaaa; /*F口为EINT,给按钮 1010 1010 1010 1010*/

/*按钮的一些必要装备*/

rSRCPND = 0x0f; /*中止设置*/

rINTMSK = ~0x0f;

rINTPND =0x0f;

rEXTINT0 = 0x2222; /*EINT0/EINT1均设置为下降沿触发*/

freq = 2500;

rTCFG0 &= 0xFFFF00;

rTCFG0 |= 0x31; /*prescal 是49 3*16+1=49 timer0 and timer1*/

rTCFG1 &= ~0xF; /*低四位清零 divider value=1/2,由于PCLK为50MHz,所以50MHz/50/2=500kHz/

rTCNTB0 = 5000; /*定时器计数初始值*/

rTCMPB0 = freq; /*定时器比较值*/

rTCON &= ~0x1F;

rTCON |= 0xf; /*死区无效,主动装载,电平回转,手动更新,定时器敞开*/

rTCON &= ~0x2 ; /*手动更新位清零,PWM开端作业*/

pISR_EINT0 = (U32)Key2_ISR;

pISR_EINT2 = (U32)Key3_ISR;

stop = FALSE;

rGPBDAT = ~0x60; /*两个LED亮*/

while(1)

{

/*频率递加*/

for ( ; freq<4950 ; )

{

freq+=10;

rTCMPB0 = freq; /*从头赋值*/

delay(20000);

while (stop == TRUE) /*是否暂停*/

{

delay(1000);

if (stop ==FALSE) /*判别是否重启*/

{

rTCON &= ~0x1F;

rTCON |= 0xf;

rTCON &= ~0x2 ; /*康复PWM功用*/

}

}

/*4个LED跟着频率的凹凸,时灭时亮。灯亮的数目4-3-2-1*/

if(freq == 100)

rGPBDAT = ~0x560; /*0001 1110 0000 取反之后1110 0001 1111*/

if(freq == 1300)

rGPBDAT = ~0x160; /*1110 0000取反之后 0001 1111*/

if(freq == 2500)

rGPBDAT = ~0x60; /*0110 0000取反之后 1001 1111*/

if(freq == 3700)

rGPBDAT = ~0x20; /*0010 0000取反之后 1101 1111*/

if(freq == 4900)

rGPBDAT = ~0x0; /*0000取反之后 1111111111*/

}

/*频率递减*/

for( ; freq>50 ; )

{

freq-=10;

rTCMPB0 = freq;

delay(20000);

while (stop == TRUE)

{

delay(1000);

if (stop ==FALSE)

{

rTCON &= ~0x1F;

rTCON |= 0xf;

rTCON &= ~0x2 ;

}

}

if(freq == 100)

rGPBDAT = ~0x560;

if(freq == 1300)

rGPBDAT = ~0x160;

if(freq == 2500)

rGPBDAT = ~0x60;

if(freq == 3700)

rGPBDAT = ~0x20;

if(freq == 4900)

rGPBDAT = ~0x0;

}

}

}

TOUT输出的波形是:
 
上图是频率上升时的大致波形图。由此能够看出高电平在每个周期中保持的时刻越来越长,低电平时刻越来越短。频率下降时的波形图正好相反。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部