TQ2440裸奔程序>>PWM蜂鸣器测试程序
2013-01-02 18:38
351 查看
转自:http://caiyh.blog.163.com/blog/static/18670512220115152564613/
//=========================================
// NAME: main.c
// DESC: TQ2440PWM测试程序
// 蜂鸣器频率响 GPB0 设置为TOUT
// 设置为输出低电平就关掉蜂鸣器
// 改变频率通过改变时钟频率
//=========================================
/* 头文件包含 */
#include "def.h"
#include "option.h"
#include "2440addr.h"
void delay_ms(U32 time)
{
//定时器3输入时钟频率 = PCLK / {预分频值+1} / {分频值}
//{预分频值} = 0~255
//{分频值} = 2, 4, 8, 16
//PCLK:50MHz 时钟频率:6250KHz 定时1ms 计数:时钟频率*定时时间-1
U32 val = 50000000/(4*2)/1000-1;
rTCFG0 = (rTCFG0 & ~(0xff<<8)) | (3<<8);//Prescaler1 = 3+1
rTCFG1 = (rTCFG1 & ~(0xf<<12)) | (0<<12);//mux = 1/2
rTCNTB3 = val;
rTCMPB3 = rTCNTB3/2; //占空比50%
rTCON = (rTCON & ~(0xf<<16)) | (0xb<<16);//自动重载、变相、手动更新、启动定时器3
rTCON = (rTCON & ~(0x2<<16)); //禁止手动更新
while(time--) //等待一次定时结束
{
while(rTCNTO3 >= (val>>1));
while(rTCNTO3 < (val>>1));
}
}
void buzzer_freq_set(U32 freq)
{
//定时器1输入时钟频率 = PCLK / {预分频值+1} / {分频值}
//{预分频值} = 0~255
//{分频值} = 2, 4, 8, 16
//PCLK:50MHz 时钟频率:6250KHz 定时1ms 计数:时钟频率*定时时间-1
// 50000000/(16*8) = 390625
rGPBCON = (rGPBCON & ~0x3) | 0x2;//GPB0口设置为TOUT PWM 0b10
rTCFG0 = (rTCFG0 & ~0xff) | 15; //Prescaler0 = 15+1
rTCFG1 = (rTCFG1 & ~0xf) | 0x2; //mux = 1/8 0b0010
rTCNTB0 = 50000000/(16*8)/freq;
rTCMPB0 = rTCNTB0/2; //占空比50%
rTCON = (rTCON & ~0x1f) | 0xb; //禁止死区、自动重载、变相、手动更新、启动定时器3
rTCON = (rTCON & ~0x2); //禁止手动更新
}
void buzzer_stop(void)
{
rGPBCON = (rGPBCON & ~0x3) | 0x1;//GPB0口设置为输出0b01
rGPBDAT = (rGPBDAT & ~0x1); //GPB0口输出低电平关掉蜂鸣器
}
void beep(U32 freq,U32 time)
{
buzzer_freq_set(freq);
delay_ms(time);
buzzer_stop();
}
void Main(void)
{
beep(20000,100);
while(1);
}
//=========================================
// NAME: main.c
// DESC: TQ2440PWM测试程序
// 蜂鸣器频率响 GPB0 设置为TOUT
// 设置为输出低电平就关掉蜂鸣器
// 改变频率通过改变时钟频率
//=========================================
/* 头文件包含 */
#include "def.h"
#include "option.h"
#include "2440addr.h"
void delay_ms(U32 time)
{
//定时器3输入时钟频率 = PCLK / {预分频值+1} / {分频值}
//{预分频值} = 0~255
//{分频值} = 2, 4, 8, 16
//PCLK:50MHz 时钟频率:6250KHz 定时1ms 计数:时钟频率*定时时间-1
U32 val = 50000000/(4*2)/1000-1;
rTCFG0 = (rTCFG0 & ~(0xff<<8)) | (3<<8);//Prescaler1 = 3+1
rTCFG1 = (rTCFG1 & ~(0xf<<12)) | (0<<12);//mux = 1/2
rTCNTB3 = val;
rTCMPB3 = rTCNTB3/2; //占空比50%
rTCON = (rTCON & ~(0xf<<16)) | (0xb<<16);//自动重载、变相、手动更新、启动定时器3
rTCON = (rTCON & ~(0x2<<16)); //禁止手动更新
while(time--) //等待一次定时结束
{
while(rTCNTO3 >= (val>>1));
while(rTCNTO3 < (val>>1));
}
}
void buzzer_freq_set(U32 freq)
{
//定时器1输入时钟频率 = PCLK / {预分频值+1} / {分频值}
//{预分频值} = 0~255
//{分频值} = 2, 4, 8, 16
//PCLK:50MHz 时钟频率:6250KHz 定时1ms 计数:时钟频率*定时时间-1
// 50000000/(16*8) = 390625
rGPBCON = (rGPBCON & ~0x3) | 0x2;//GPB0口设置为TOUT PWM 0b10
rTCFG0 = (rTCFG0 & ~0xff) | 15; //Prescaler0 = 15+1
rTCFG1 = (rTCFG1 & ~0xf) | 0x2; //mux = 1/8 0b0010
rTCNTB0 = 50000000/(16*8)/freq;
rTCMPB0 = rTCNTB0/2; //占空比50%
rTCON = (rTCON & ~0x1f) | 0xb; //禁止死区、自动重载、变相、手动更新、启动定时器3
rTCON = (rTCON & ~0x2); //禁止手动更新
}
void buzzer_stop(void)
{
rGPBCON = (rGPBCON & ~0x3) | 0x1;//GPB0口设置为输出0b01
rGPBDAT = (rGPBDAT & ~0x1); //GPB0口输出低电平关掉蜂鸣器
}
void beep(U32 freq,U32 time)
{
buzzer_freq_set(freq);
delay_ms(time);
buzzer_stop();
}
void Main(void)
{
beep(20000,100);
while(1);
}
相关文章推荐
- TQ2440裸奔程序>>PWM蜂鸣器测试程序
- TQ2440裸奔程序>>串口UART的PC机按键测试程序
- TQ2440裸奔程序>>串口UART打印printf测试程序
- TQ2440裸奔程序>>EINT中断按键测试程序
- TQ2440裸奔程序>>流水灯测试程序
- TQ2440裸奔程序>>2440init.s启动代码分析
- TQ2440裸奔程序>>看门狗测试程序
- TQ2440裸奔程序>>定时器4中断测试程序
- 删除Symbian模拟器(功能表->安装)里面测试程序的方法
- 错误的程序之阶乘之和测试程序的快慢程度(加一个计时器)<time.h>和clock()函数
- 第二步在TQ2440(S3C2440)上实现点灯程序--->完结,测试OK .
- MCAPI学习笔记<一>——简介与Linux下示例程序测试
- S3C2440 测试程序(一)PWM控制蜂鸣器Beep(2000, 100)
- MINI2440开发板PWM驱动与测试程序简要分析
- K&R的名著:<C程序设计语言>小程序总结7指针
- std::stack<T>和std::queue<T>在执行频率比较高的程序中,效率太低
- K&R名著<C程序设计语言>p103函数指针:串联以前小程序
- 小菜开始学习算法(返璞归真->程序=数据结构+算法)
- <<c++ primer>>文本查询程序
- 软件测试第二章<软件测试的基本概念和方法>