https://static.assets-stash.eet-china.com/album/old-resources/2009/2/26/7cd3a1cf-967c-4c7f-a004-8a9b04e7cb2c.rar参考程序(友善的板子)
https://static.assets-stash.eet-china.com/album/old-resources/2009/2/26/90e5ec37-3516-4380-86dc-bf1a6f00453a.rarPWM的中文数据手册
S<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />3C2440中有5个16位定时器,timer0,timer1,timer2,timer3和timer4。其中,只有timer4是一个没有输出引脚的内部定时器。所以,只有定时器0,1,2,3有脉宽调制功能(PWM)。定时器0有一个用于大电流设备的死区生成器。(以下,以定时器0为例)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
S3C2440的PWM输出,主要是利用比较寄存器TCMPB0(0x51000010)。
在定时器使能时,定时器计数缓存寄存器(TCNTBn)得到一个被装载到递减计数器中的初始值。定时器比较缓存寄存器(TCMPBn)有一个被装载比较器中用来和递减计数器得值作比较的初始值。
每个定时器有一个自己的由定时器时钟驱动的16位递减计数器。当递减计数器为零时,定时器中断请求生成通知CPU定时器操作已经完成。当定时器计数器达到0,相应的TCNTBn的值也知道装载到递减计数器中以继续下一个操作(自动装载)。但是,如果定时器停止了,例如在定时器运行模式下通过对TCONn的定时器使能位清零,则TCNTBn的值不会装载到计数器中。
TCMPBn的值用于脉宽调制。当递减计数器的值和定时器控制逻辑中的比较寄存器的值匹配时,定时器控制逻辑改变输出电平。因此,比较寄存器决定了PWM输出的开启时间。
有了以上知识,可以知道
在初始化定时器时,主要要设定以下几个寄存器(以定时器0为例):
定时器输出时钟频率=PCLK/(prescaler value + 1)/(divider value)
TCFG0(0x51000000),如:TCFG0=99;//prescaler value="99"
TCFG1(0x51000004),如: TCFG1=0x03;//divider value="1/16"
这样,当PCLK=400M时。定时器输出频率为6.25M
下面就要给定时器装初值了,
TCNTB0(0x5100000c),如,TCNTB0=62500;//装入初值 1s中断一次
TCMPB0(0x51000010),如,TCMPB0=rTCNTB0>>1;//50%
如果不使用PWM的话,可以不设TCMPB0,或将其设为0。
接着就可以启动定时器了,不过第一次必须手动装载TCON=1<<1;
装载后,改为自动装载,并启动定时器TCON=0x09;
其中TCON(0x51000008)
为了驱动蜂鸣器,还要初始化一下I/O口。
我用的板子是友善的,蜂鸣器连在了GPB0上。
通过改变GPBCON(0x56000010)的最后两位,使能PWM
void GPIO_init(void)
{
rGPBCON &= ~3;
rGPBCON |= 2;
}
用户582664 2011-5-21 18:28
用户42041 2010-2-5 17:10
用户241765 2009-12-3 11:42
用户1406660 2009-8-29 15:13
用户18678 2009-4-30 09:24
用户1440970 2009-4-16 17:00