您的位置:首页 > 其它

Exynos4412裸机开发系列教程--蜂鸣器

2014-08-14 16:58 225 查看
  蜂鸣器为一种自激震荡的发声设备,用于各种操作提示,一般都是单频发声,当然也有不带自激震荡的蜂鸣器,需要由处理器产生各种频率的方波,以驱动蜂鸣器发声。

普通IO口是无法直接驱动任何蜂鸣器的,一般都需要通过三极管来增强驱动能力,下图即是蜂鸣器的最简单应用电路,通过设置pwm1管脚电平能打开或关闭蜂鸣器。

  


同样,更Led流水灯类似,我们需要编写一个函数能控制蜂鸣器,方便以后的调用,实现如下:

enum beep_status {
BEEP_STATUS_OFF		= 0,
BEEP_STATUS_ON		= 1,
};

void beep_set_status(enum beep_status status)
{
if(status == BEEP_STATUS_ON)
writel(EXYNOS4412_GPD0_BASE + EXYNOS4412_GPIO_DAT, (readl(EXYNOS4412_GPD0_BASE + EXYNOS4412_GPIO_DAT) & ~(0x1<<1)) | (0x1<<1));
else if(status == BEEP_STATUS_OFF)
writel(EXYNOS4412_GPD0_BASE + EXYNOS4412_GPIO_DAT, (readl(EXYNOS4412_GPD0_BASE + EXYNOS4412_GPIO_DAT) & ~(0x1<<1)) | (0x0<<1));
}


当然在操作蜂鸣器之前,我们需要初始化相关IO,输出上拉模式

/*
* Beep Pin -> EXYNOS4_GPD0(1)
*/
void beep_initial(void)
{
writel(EXYNOS4412_GPD0_BASE + EXYNOS4412_GPIO_CON, (readl(EXYNOS4412_GPD0_BASE + EXYNOS4412_GPIO_CON) & ~(0xf<<4)) | (0x1<<4));
writel(EXYNOS4412_GPD0_BASE + EXYNOS4412_GPIO_PUD, (readl(EXYNOS4412_GPD0_BASE + EXYNOS4412_GPIO_PUD) & ~(0x3<<2)) | (0x2<<2));
writel(EXYNOS4412_GPD0_BASE + EXYNOS4412_GPIO_DAT, (readl(EXYNOS4412_GPD0_BASE + EXYNOS4412_GPIO_DAT) & ~(0x1<<1)) | (0x0<<1));
}


接下来,我们来看看主程序:

int tester_beep(int argc, char * argv[])
{
while(1)
{
beep_set_status(BEEP_STATUS_ON);
mdelay(500);

beep_set_status(BEEP_STATUS_OFF);
mdelay(500);
}

return 0;
}


很简单,死循环,每隔500毫秒改变蜂鸣器的状态,并可听到滴滴声。

是不是很简单呢,发现跟单片机编程没什么两样啊。是这样的,只要我们将各种外设模块包装好各种库,开发裸机,跟开发各种应用软件,没有任何差异,专心做好业务逻辑层面就可以了。

贴上完整源码参考吧,有兴趣的自行下载编译,测试。有问题的请留言。

Exynos4412裸机系列教程源码之蜂鸣器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: