S3C2440-蜂鸣器

发布时间:2011-3-25 14:28    发布者:techshare
关键词: S3C2440 , 蜂鸣器
ARM驱动蜂鸣器的方式有两种:一种是PWM输出口直接驱动,另一种是利用IO定时翻转电平产生驱动波形对蜂鸣器进行驱动。PWM输出口直接驱动是利用PWM输出口本身可以输出一定的方波来进行驱动。在ARM中可以用几个特殊功能寄存器对占空比和周期进行设置。通过设置这些寄存器产生符合蜂鸣器要求的方波后,这个时候利用这个方波就可以对蜂鸣器进行驱动了。使用PWM时,通过TCMPn可以决定脉宽,TCNTn决定频率,TCMPn/TCNTn决定占空比。使用IO口电平翻转时,需要使用定时器来做定时,通过定时翻转产生符合要求频率的波形。由于蜂鸣器一般的工作电流比较大,以至于IO口无法驱动,一般使用放大电路来驱动,一般使用三极管来放大电流就可以了。





使用PWM控制蜂鸣器:

rTCFG0用来设置预分频值,rTCFG1用来设置多路选择器MUX的分频值,TCNTB0也起到分频作用。使用PWM控制蜂鸣器注意设置GPB0为TOUT0。这里设置PWM频率为1HZ,占空比50%,也就是半秒响一次。S3C2440定时器中有双缓冲rTCNTBn,rTCMPBn,他们是可以通过编程访问的,他们会将数据自动装入rTCNTn,rTCMPn,这两个16位计数器对程序员来说是透明的。

一般启动定时器的步骤如下:
  • 将初始值写入到rTCNTn,rTCMPn
  • 设置对应定时器的手动更新位,自动装载
  • 启动定时器,并关闭手动更新位


#define rGPBCON (*(volatile unsigned *)0x56000010)
#define rGPBDAT (*(volatile unsigned *)0x56000014)
#define rGPBUP (*(volatile unsigned *)0x56000018)
#define rTCFG0 (*(volatile unsigned *)0x51000000)
#define rTCFG1 (*(volatile unsigned *)0x51000004)
#define rTCNTB0 (*(volatile unsigned *)0x5100000C)
#define rTCMPB0 (*(volatile unsigned *)0x51000010)
#define rTCON (*(volatile unsigned *)0x51000008)

int Main(){
        rGPBCON &= 0xfffffc;
        rGPBCON |= 0x2;
        rTCFG0 &= "0xff;
        rTCFG0 |= 0x64;
        rTCFG1 &= "0xf;
        rTCFG1 |= 0x3;
        rTCNTB0 = 0x7530;
        rTCMPB0 = rTCNTB0>>1;
        rTCON &= "0x1f;
        rTCON |= (0x1)|(0x1<<1)|(0x1<<3);
        rTCON &= "2;        
         while(1);
        return 0;
}

使用定时器产生中断使IO电平翻转,控制蜂鸣器:

定时器注意设置rINTMSK开中断,并在中断处理程序中清除中断请求位。rSRCPND |= 0x1<<10;rINTPND |= 0x1<<10;清除rINTPND通过设置相应为1进行清除。rSTCPND是向相应位写数据清除。如果不清除,会一直响应这个中断。在Main函数中清一下是为了防止以前这个位申请中断,所以清一下,以防万一。定时器接在APB总线上,所以用PCLK时钟。在这里我设预分频为0x64,除法器为16,rTCNTB0为0x7a12,所以 50M/0x64/16/0x7a12为1HZ,所以中断周期为1s,所以每一秒蜂鸣器响一下,然后隔一秒,然后再响。

#define rGPBCON (*(volatile unsigned *)0x56000010)  
#define rGPBDAT (*(volatile unsigned *)0x56000014)  
#define rGPBUP (*(volatile unsigned *)0x56000018)  
#define rSRCPND (*(volatile unsigned *)0x4A000000)  
#define rINTPND (*(volatile unsigned *)0x4A000010)  
#define rTCFG0 (*(volatile unsigned *)0x51000000)  
#define rTCFG1 (*(volatile unsigned *)0x51000004)  
#define rTCNTB0 (*(volatile unsigned *)0x5100000C)  
#define rTCON (*(volatile unsigned *)0x51000008)  
#define rINTMSK (*(volatile unsigned *)0x4A000008)  
#define U32 unsigned int   
#define _ISR_STARTADDRESS 0x33ffff00  
#define pISR_TIMER0 (*(unsigned *)(_ISR_STARTADDRESS+0x48))   
int count;   
void __irq Timer0_ISR(void){   
    rSRCPND |= 0x1<<10;   
    rINTPND |= 0x1<<10;   
    count++;   
    if(count %2 == 1)   
        rGPBDAT |= 0x01;   
    else  
        rGPBDAT &= 0xfe;   
    if(count == 1000)   
        count = 0;            
}   
  
int Main(){   
    count = 0;   
    rGPBCON &= 0xfffffc;   
    rGPBCON |= 0x1;   
    rGPBDAT &= 0xffe;   
    rGPBUP &= 0xfe;   
    pISR_TIMER0 = (U32)Timer0_ISR;   
    rSRCPND |= 0x1<<10;   
    rINTPND |= 0x1<<10;   
    rINTMSK &= "(0x1<<10);   
    rTCFG0 &= "0xff;   
    rTCFG0 |= 0x64;   
    rTCFG1 &= "0xf;   
    rTCFG1 |= 0x3;   
    rTCNTB0 = 0x7a12;   
    rTCON &= "0x1f;           
    rTCON |= 0xb;   
    rTCON &= "0x2;     
    while(1);   
    return 0;   
}

李万鹏
本文地址:https://www.eechina.com/thread-59922-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表