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

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

普通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裸机系列教程源码之蜂鸣器


  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值