mini2440硬件篇之PWM定时器

1.硬件原理

2440有5个16位定时器,其中0、1、2、3有PWM功能,有一根输出引脚,可以产生周期性高低电平变化 。定时器4没有输出引脚 。
2.芯片手册
3.mini2440电路图
4.S3C2440寄存器
定时器时钟源是PCLK,先通过2个预分频器TCFG0TCFG1降低频率,降频后就确定了定时器工作频率 。初始设定值TCMPBn(用于比较反转输出电平)、TCNTBn 。TCON控制定时器启动 。TCMPBn的值装入TCMPn,TCNTBn的值装入TCNTn,每个定时器周期,TCNTn减1,可以通过TCNTOn读取计数值 。当和TCMPn相等时,反转电平输出 。减到0时,再次反转,如果TCON设置自动加载,则重复如上步骤 。
pwm.h


/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:pwm.h
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:脉宽调制蜂鸣器驱动.
*FunctionList:
*History:
******************************************************************/
#ifndef__PWM_H__
#define__PWM_H__
#definePRESCALER024
#defineMUX00x2
#definePWM_CLK(50000000/(PRESCALER0+1)/(2<<(MUX0+1)))
/*函数声明*/
voidPWMInit(unsignedlongulFreq);
voidPWMTest(void);
#endif

pwm.c


/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:pwm.c
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:脉宽调制蜂鸣器驱动.
*FunctionList:
*History:
******************************************************************/
#include"common.h"
#include"core.h"
#include"drv.h"

/********************************************************************
函数功能:PWM初始化 。
入口参数:无 。
返回:无 。
备注:定时器频率=PCLK/(预分频+1)/分频值;
预分频24,分频8,定时器频率250kHz
********************************************************************/
voidPWMInit(unsignedlongulFreq)
{
rGPBCON&=~(0x3<<0);
rGPBCON|=0x2<<0;
rTCFG0&=~(0xff<<0);
rTCFG0|=PRESCALER0<<0;//预分频24
rTCFG1&=~(0xf<<0);
rTCFG1|=MUX0<<0;//分频8
rTCNTB0=PWM_CLK/ulFreq;//周期
rTCMPB0=rTCNTB0>>1;//占空比50%
rTCON&=~0x1f;
rTCON|=(1<<0)|(1<<1)|(1<<3);//自动重载,手动加载,使能定时器
rTCON&=~(1<<1);//清除手动加载
【mini2440硬件篇之PWM定时器】}
/********************************************************************
函数功能:停止蜂鸣器 。
入口参数:无 。
返回:无 。
备注:无 。
********************************************************************/
voidBuzzerStop(void)
{
rGPBCON&=~3;
rGPBCON|=1;//==设置输出
rGPBDAT&=~1;
}
/********************************************************************
函数功能:设置蜂鸣器频率 。
入口参数:
ulFreq:蜂鸣器频率 。
返回:无 。
备注:无 。
********************************************************************/
voidPWMSetFreq(unsignedlongulFreq)
{
rTCNTB0=PWM_CLK/ulFreq;
rTCMPB0=rTCNTB0>>1;
}
/********************************************************************
函数功能:PWM测试函数 。
入口参数:无 。
返回:无 。
备注:无 。
********************************************************************/
voidPWMTest(void)
{
charucKey;
unsignedlongulFreq;
while(1)
{
ucKey=Uart0GetChar();
if(ucKey=='+')
{
if(ulFreq<2000)
{
ulFreq+=10;
PWMSetFreq(ulFreq);
}
}
if(ucKey=='-')
{
if(ulFreq>11)
{
ulFreq-=10;
PWMSetFreq(ulFreq);
}
}
if(ucKey==ESC_KEY)
{
BuzzerStop();
return;
}
}
}

time.h


/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:timer.h
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:定时器4驱动.
*FunctionList:
*History:
******************************************************************/
#ifndef__TIMER_H__
#define__TIMER_H__
#definePRESCALER10xf9
#defineMUX40x2
/*定时器4计数*/
externvolatileunsignedlongg_ulTimer4Count;
/*函数声明*/
voidTimer4Init(void);
#endif

timer.c


/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:timer.c
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:定时器4驱动.
*FunctionList:
*History:
***********

    推荐阅读