TQ2440使用定时器产生PWM,控制蜂鸣器发声


GPBCON:引脚配置寄存器
GPBUP:端口使能上拉寄存器                              
GPBDAT:端口数据寄存器
TCFG0:配置两个8位预分频器
TCFG1:5路多路选择器和DMA模式选择寄存器
TCNTB0:  定时器0计数缓冲寄存器
TCMPB0: 定时器0比较缓冲寄存器
TCON:     定时器控制寄存器
2440有两个8位预分频器0,1共用一个2,3,4共用另外一个,每个定时器都有一个可以生成5种不同分频信号(1/2,1/4,1/8,1/16和TCLK)的时钟分频器。
8位预分频器是可编程的,并且按存储在TCFG0和TCFG1寄存器中的加载值来分频PCLK。
定时器输入时钟频率由TCFG0与TCFG1决定
定时器输入时钟频率 =  PCLK/(预分频值+1)/(分频值);
预分频值 = 0~255;
分频值 = 2,4,8,16
TCNTB0包含了一个当使能定时计数器的初始值。TCMPB0包含了一个与TCNTB0相比较的初始值。当递减计数器到达0时,产生定时器中断请求通知CPU定时器操作已经完成。
TCON 定时器控制寄存器 定时器0的自动重载开启或关闭,TOUT0变换极性,手动更新TCNTB0与TCMPB0的值,启动/停止定时器。
GPBCON,GPBUP,GPBDAT这些寄存器只是为了设置GPBDAT的最低位为第二功能。


输出频率计算:fout = PCLK/(预分频值+1)/(分频值)/计数个数
根据需要的频率反推计数个数 计数个数= PCLK/(预分频值 +1)/分频值/fout
其中 PCLK 为 AHB BUS时钟50M
预分频值为0~255 由TCFG0设置
分频值为2、4、8、16几种,分别对应的TCFG1 = 1、3、7、15
计数个数由TCNTB0确定

以下是一段例程:
/***************************************************************************/
#include<S3C2440.h>
int main(){
      int freq = 100; //想要获得的频率
unsigned int PCLK = 50000000; 


    GPBCON &= ~3; //set GPB0 as tout0, pwm output
GPBCON |= 2;

TCFG0 &= ~0xff;    
TCFG0 |= 15; //prescaler = 15+1


TCFG1 &= ~0xf;
TCFG1 |= 2; //mux = 1/8




TCNTB0 = (PCLK>>7)/freq;//TCNTB0 = PCLK/(预分频值 +1)/分频值/fout  其中预分频值+1 = 16 ,分频值 = 8 ,共右移7位
TCMPB0 = TCNTB0>>1; // 50%


TCON &= ~0x1f;
TCON |= 0xb;    //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
TCON &= ~2;    //clear manual update bit
return 0;
}
/***************************************************************************/



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值