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;
}
/***************************************************************************/



原文地址:https://www.cnblogs.com/libing64/p/2878747.html