原创 3.利用S3C2440中Timer0的PWM输出驱动蜂鸣器

2009-2-26 22:21 6249 7 13 分类: MCU/ 嵌入式

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中有516位定时器,timer0,timer1,timer2,timer3timer4。其中,只有timer4是一个没有输出引脚的内部定时器。所以,只有定时器0123有脉宽调制功能(PWM)。定时器0有一个用于大电流设备的死区生成器。(以下,以定时器0为例)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


S3C2440PWM输出,主要是利用比较寄存器TCMPB00x51000010)。


在定时器使能时,定时器计数缓存寄存器(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


下面就要给定时器装初值了,


TCNTB00x5100000c),如,TCNTB0=62500;//装入初值 1s中断一次


TCMPB00x51000010),如,TCMPB0=rTCNTB0>>1;//50%


如果不使用PWM的话,可以不设TCMPB0,或将其设为0


接着就可以启动定时器了,不过第一次必须手动装载TCON=1<<1;


装载后,改为自动装载,并启动定时器TCON=0x09


其中TCON0x51000008


为了驱动蜂鸣器,还要初始化一下I/O口。


我用的板子是友善的,蜂鸣器连在了GPB0上。


通过改变GPBCON0x56000010)的最后两位,使能PWM


void GPIO_init(void)
{
 rGPBCON &= ~3;
 rGPBCON |= 2;
}


 


 

PARTNER CONTENT

文章评论6条评论)

登录后参与讨论

用户582664 2011-5-21 18:28

原来要登录才能下载, 谢谢分享

用户42041 2010-2-5 17:10

very useful thing

用户241765 2009-12-3 11:42

怎么下载啊

用户1406660 2009-8-29 15:13

非常感谢!!

用户18678 2009-4-30 09:24

DING

用户1440970 2009-4-16 17:00

好东西哈!
相关推荐阅读
用户1439330 2009-10-13 20:34
诺依曼结构和哈佛结构
材料一:        关于这个问题,有人说51地址线复用,就是冯诺依曼结构。        很多入门的书上基本上都说:由运算器、控制器、存储器、输入设备、输出设备组成的系统 都叫冯氏结构。 也有的说...
用户1439330 2009-07-08 23:49
移植linux2.6.29.4进友善mini2440开发板
终于移植成功,总结下:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />移植linux...
用户1439330 2009-07-08 23:29
Kernel panic - not syncing: Attempted to kill init
Kernel panic - not syncing: Attempted to kill init! 用arm-linux-gcc 4.00以上的编译器做出都 文件系统老是报这个错 ,而用rm-li...
用户1439330 2009-06-14 15:47
转帖:在fc9 安装vmware tools 没有 kernel-devel的解决方案
在vmware 6 上面安装 fc 9,然后安装vmware tools 的时候,没有C header files。What is the location of the directory of C...
用户1439330 2009-06-02 01:22
“has no driver”的解决方法
今天在进行原理图绘制完成后,对其进行编译,发现出现好多相同的错误:“......has no driver”,找了很久,没有发现什么错误。经过慢慢摸索:原来,我开始只是新建了一个schematic文件...
用户1439330 2009-04-13 14:11
基于S3C2440的linux驱动
MINI2440_BUTTON.C<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> ...
EE直播间
更多
我要评论
6
7
关闭 站长推荐上一条 /3 下一条