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讀取計數(shù)值。當和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)))
/*函數(shù)聲明*/
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"
/********************************************************************
函數(shù)功能:PWM初始化。
入口參數(shù):無。
返回:無。
備注:定時器頻率=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);//清除手動加載
}
/********************************************************************
函數(shù)功能:停止蜂鳴器。
入口參數(shù):無。
返回:無。
備注:無。
********************************************************************/
voidBuzzerStop(void)
{
rGPBCON&=~3;
rGPBCON|=1;//==設置輸出
rGPBDAT&=~1;
}
/********************************************************************
函數(shù)功能:設置蜂鳴器頻率。
入口參數(shù):
ulFreq:蜂鳴器頻率。
返回:無。
備注:無。
********************************************************************/
voidPWMSetFreq(unsignedlongulFreq)
{
rTCNTB0=PWM_CLK/ulFreq;
rTCMPB0=rTCNTB0>>1;
}
/********************************************************************
函數(shù)功能:PWM測試函數(shù)。
入口參數(shù):無。
返回:無。
備注:無。
********************************************************************/
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計數(shù)*/
externvolatileunsignedlongg_ulTimer4Count;
/*函數(shù)聲明*/
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:
***********