mini2440硬件篇之PWM定時(shí)器
1.硬件原理
2440有5個(gè)16位定時(shí)器,其中0、1、2、3有PWM功能,有一根輸出引腳,可以產(chǎn)生周期性高低電平變化。定時(shí)器4沒有輸出引腳。
2.芯片手冊(cè)
3.mini2440電路圖
4.S3C2440寄存器
定時(shí)器時(shí)鐘源是PCLK,先通過2個(gè)預(yù)分頻器TCFG0TCFG1降低頻率,降頻后就確定了定時(shí)器工作頻率。初始設(shè)定值TCMPBn(用于比較反轉(zhuǎn)輸出電平)、TCNTBn。TCON控制定時(shí)器啟動(dòng)。TCMPBn的值裝入TCMPn,TCNTBn的值裝入TCNTn,每個(gè)定時(shí)器周期,TCNTn減1,可以通過TCNTOn讀取計(jì)數(shù)值。當(dāng)和TCMPn相等時(shí),反轉(zhuǎn)電平輸出。減到0時(shí),再次反轉(zhuǎn),如果TCON設(shè)置自動(dòng)加載,則重復(fù)如上步驟。
pwm.h
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:pwm.h
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:脈寬調(diào)制蜂鳴器驅(qū)動(dòng).
*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:脈寬調(diào)制蜂鳴器驅(qū)動(dòng).
*FunctionList:
*History:
******************************************************************/
#include"common.h"
#include"core.h"
#include"drv.h"
/********************************************************************
函數(shù)功能:PWM初始化。
入口參數(shù):無。
返回:無。
備注:定時(shí)器頻率=PCLK/(預(yù)分頻+1)/分頻值;
預(yù)分頻24,分頻8,定時(shí)器頻率250kHz
********************************************************************/
voidPWMInit(unsignedlongulFreq)
{
rGPBCON&=~(0x3<<0);
rGPBCON|=0x2<<0;
rTCFG0&=~(0xff<<0);
rTCFG0|=PRESCALER0<<0;//預(yù)分頻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);//自動(dòng)重載,手動(dòng)加載,使能定時(shí)器
rTCON&=~(1<<1);//清除手動(dòng)加載
}
/********************************************************************
函數(shù)功能:停止蜂鳴器。
入口參數(shù):無。
返回:無。
備注:無。
********************************************************************/
voidBuzzerStop(void)
{
rGPBCON&=~3;
rGPBCON|=1;//==設(shè)置輸出
rGPBDAT&=~1;
}
/********************************************************************
函數(shù)功能:設(shè)置蜂鳴器頻率。
入口參數(shù):
ulFreq:蜂鳴器頻率。
返回:無。
備注:無。
********************************************************************/
voidPWMSetFreq(unsignedlongulFreq)
{
rTCNTB0=PWM_CLK/ulFreq;
rTCMPB0=rTCNTB0>>1;
}
/********************************************************************
函數(shù)功能:PWM測(cè)試函數(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:定時(shí)器4驅(qū)動(dòng).
*FunctionList:
*History:
******************************************************************/
#ifndef__TIMER_H__
#define__TIMER_H__
#definePRESCALER10xf9
#defineMUX40x2
/*定時(shí)器4計(jì)數(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:定時(shí)器4驅(qū)動(dòng).
*FunctionList:
*History:
***********