ul c语言,IMX6UL裸机实现C语言蜂鸣器实验

蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中,常用的蜂鸣器有两种:

有源蜂鸣器和无源蜂鸣器,这里的有“源”不是电源,而是震荡源,有源蜂鸣器内部带有震荡源,所以有源蜂鸣器只要通电就会叫。无源蜂鸣器内部不带震荡源,直接用直流电是驱动不起来的,需要 2K-5K 的方波去驱动。 I.MX6U-ALPHA 开发板使用的是有源蜂鸣器,因此只要给其供电就会工作, I.MX6U-ALPHA 开发板所使用的有源蜂鸣器如图所示:

3f288ee285423cc6e29fa526842ca321.png

有源蜂鸣器

有源蜂鸣器只要通电就会叫,所以我们可以做一个供电电路, 这个供电电路可以由一个 IO来控制其通断,一般使用三极管来搭建这个电路。为什么我们不能像控制 LED 灯一样,直接将GPIO 接到蜂鸣器的负极,通过 IO 输出高低来控制蜂鸣器的通断。因为蜂鸣器工作的电流比LED 灯要大,直接将蜂鸣器接到 I.MX6U 的 GPIO 上有可能会烧毁 IO,所以我们需要通过一个三极管来间接的控制蜂鸣器的通断,相当于加了一层隔离。本章我们就驱动 I.MX6U-ALPHA 开发板上的有源蜂鸣器,使其周期性的“滴、滴、滴…..”鸣叫。

蜂鸣器的硬件原理图如图所示:

3f288ee285423cc6e29fa526842ca321.png

蜂鸣器原理图

图中通过一个 PNP 型的三极管 8550 来驱动蜂鸣器,通过 SNVS_TAMPER1 这个 IO来控制三极管 Q1 的导通,当 SNVS_TAMPER1 输出低电平的时候 Q1 导通,相当于蜂鸣器的正极连接到 DCDC_3V3,蜂鸣器形成一个通路,因此蜂鸣器会鸣叫。同理,当 SNVS_TAMPER1输出高电平的时候 Q2 不导通,那么蜂鸣器就没有形成一个通路,因此蜂鸣器也就不会鸣叫。新建文件夹“6_beep”,然后将前一篇文章《

3f288ee285423cc6e29fa526842ca321.png

工程文件夹

新建 VSCode 工程,工程创建完成以后在 bsp 文件夹下新建名为“beep”的文件夹,蜂鸣器驱动文件都放到“beep”文件夹里面。

新建 beep.h 文件,保存到 bsp/beep 文件夹里面,在 beep.h 里面输入如下内容:

1 #ifndef __BSP_BEEP_H

2 #define __BSP_BEEP_H

3

4#include "imx6ul.h"

5

6 /* 函数声明 */

7 void beep_init(void);

8 void beep_switch(int status);

9 #endif

beep.h 很简单,就是函数声明。新建文件 beep.c,然后在 beep.c 里面输入如下内容:

1 #include "bsp_beep.h"

2

3/*

4 * @description : 初始化蜂鸣器对应的 IO

5 * @param : 无

6 * @return : 无

7 */

8 void beep_init(void)

9{

10 /* 1、初始化 IO 复用,复用为 GPIO5_IO01 */

11 IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);

12

13 /* 2、、配置 GPIO1_IO03 的 IO 属性 */

14 IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0X10B0);

15

16 /* 3、初始化 GPIO,GPIO5_IO01 设置为输出 */

17 GPIO5->GDIR |= (1 << 1);

18

19 /* 4、设置 GPIO5_IO01 输出高电平,关闭蜂鸣器 */

20 GPIO5->DR |= (1 << 1);

21 }

22

23 /*

24 * @description : 蜂鸣器控制函数,控制蜂鸣器打开还是关闭

25 * @param - status : 0,关闭蜂鸣器, 1 打开蜂鸣器

26 * @return : 无

27 */

28 void beep_switch(int status)

29{

30 if(status == ON)

31 GPIO5->DR &= ~(1 << 1); /* 打开蜂鸣器 */

32 else if(status == OFF)

33 GPIO5->DR |= (1 << 1); /* 关闭蜂鸣器 */

}

beep.c 文件一共有两个函数: beep_init 和 beep_switch, 其中 beep_init 用来初始化 BEEP 所使用的 GPIO,也就是 SNVS_TAMPER1,将其复用为 GPIO5_IO01,和上一章的 LED 灯初始化函数一样。 beep_switch 函数用来控制 BEEP 的开关,也就是设置 GPIO5_IO01 的高低电平,很简单。

最后在 main.c 函数中输入如下所示内容:1 #include "bsp_clk.h"

2 #include "bsp_delay.h"

3 #include "bsp_led.h"

4 #include "bsp_beep.h"

5 6

/*

7 * @description : main 函数

8 * @param : 无

9 * @return : 无

10 */

11 int main(void)

12{

13 clk_enable(); /* 使能所有的时钟 */

14 led_init(); /* 初始化 led */

15 beep_init(); /* 初始化 beep */

16

17 while(1)

18 {

19 /* 打开 LED0 和蜂鸣器 */

20 led_switch(LED0,ON);

21 beep_switch(ON);

22 delay(500);

23

24 /* 关闭 LED0 和蜂鸣器 */

25 led_switch(LED0,OFF);

26 beep_switch(OFF);

27 delay(500);

28 }

29

30 return 0;

31 }

main.c中只有一个 main函数,main函数先使能所有的外设时钟,然后初始化 LED和 BEEP。最终在 while(1)循环中周期性的开关 LED 灯和蜂鸣器,周期大约为 500ms, main.c 的内容也比较简单。

Makefile 使用上一篇文章编写的通用 Makefile,修改变量 TARGET 为 beep,在变量 INCDIRS和 SRCDIRS 中追加“bsp/beep”,修改完成以后如下所示:1 CROSS_COMPILE ?= arm-linux-gnueabihf-

2 TARGET ?= beep

3

4 /* 省略掉其它代码...... */

5

6INCDIRS := imx6ul \

7 bsp/clk \

8 bsp/led \

9 bsp/delay \

10 bsp/beep

11

12 SRCDIRS := project \

13 bsp/clk \

14 bsp/led \

15 bsp/delay \

16 bsp/beep

17

18 /* 省略掉其它代码...... */

19

20 clean:

21 rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)

第 2 行修改目标的名称为“beep”。

第 10 行在变量 INCDIRS 中添加蜂鸣器驱动头文件路径,也就是文件 beep.h 的路径。

第 16 行在变量 SRCDIRS 中添加蜂鸣器驱动文件路劲,也就是文件 beep.c 的路径。

链接脚本就使用上一篇文章中的链接脚本文件 imx6ul.lds 即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值