分类: 嵌入式
2011-07-13 22:38:33
//======================================================================
// 工程名称: PWM.mcp
// 功能描述: 实现占空比为50%的PWM输出,按第一、二个键可增加或减少频率
// IDE环境: ADS v1.2 TX2440A
// 组成文件: main.c
// 硬件连接: 无
// 维护记录: Lzy 2011-7-13 V1.0
//======================================================================
#include "2440addr.h"
#include "string.h"
#include "def.h"
#include "2440lib.h"
extern unsigned int PCLK;
//====================================================
// 语法格式:void Buzzer_Freq_Set(U32 freq)
// 功能描述: 设置蜂鸣器频率函数
// 入口参数: freq
// 出口参数: 无
//====================================================
void Buzzer_Freq_Set(U32 freq)
{
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1 timer0的时钟频率为50M/16 = 3.125MHz
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8 timer0的时钟频率为50M/16/8 = 0.39MHz
rTCNTB0 = (PCLK>>7)/freq; //设置timer0初值
rTCMPB0 = rTCNTB0>>1; // 50%
rTCON &= ~0x1f;
rTCON |= 0xb; //自动重载, 反向关闭, 手动刷新, 启动timer0
rTCON &= ~2; //clear manual update bit
}
int Main(void)
{
U16 freq =800; //默认频率为800;
memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);
/*初始化系统时钟*/
SetSysFclk(FCLK_400M); //设置系统时钟 400M
ChangeClockDivider(2, 1); //设置分频 1:4:8
CalcBusClk(); //计算总线频
rGPFCON = (rGPFCON | 0xFFFF) & 0xFFFF0055; //GPF0--GPF3设置为output,GPF4--GPF5为输入
rGPFUP = rGPFUP & 0xFFF0; //使能GPF上拉电阻
rGPFDAT = 0xFF; //GPF低4位初始化为1
rGPBCON &= ~3; //设置GPB口 B0为TOUT0输出 PWM输出管脚
rGPBCON |= 2;
Buzzer_Freq_Set(freq);
while(1)
{
if(!(rGPFDAT & 0x10))
{
if((freq > 20)) //最大频率为2000
{
freq -= 10;
Buzzer_Freq_Set(freq);
rGPFDAT = 0xfe; //点亮第一个灯
Delay(20);
rGPFDAT = 0xff;
}
}
if(!(rGPFDAT & 0x20))
{
if((freq < 2000)) //最大频率为2000
{
freq += 10;
Buzzer_Freq_Set(freq);
rGPFDAT = 0xfd; //点亮第二个灯
Delay(20);
rGPFDAT = 0xff;
}
}
}
}