文章目录
简介
前几篇实验中的驱动 LED 灯亮灭属于 GPIO 的输出控制,本篇再巩固一下 I.MX6U 的 GPIO输出控制,在 I.MX6U-ALPHA 开发板上有一个有源蜂鸣器,通过 IO 输出高低电平即可控制蜂鸣器的开关,本质上也属于 GPIO 的输出控制。
目标
巩固一下 I.MX6U 的 GPIO输出控制,通过 IO 输出高低电平即可控制蜂鸣器的开关。
阅读基础
熟悉计算机。
环境说明
- windows10
参考资料
- 原子文档:I.MX6ULL开发指南 第十四章
- NXP官方文档:I.MX6ULL参考手册、数据手册
工程管理简介
蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中。
常用的蜂鸣器有两种:有源蜂鸣器和无源蜂鸣器,这里的有“源”不是电源,而是震荡源,
- 有源蜂鸣器内部带有震荡源,所以有源蜂鸣器只要通电就会叫。
- 无源蜂鸣器内部不带震荡源,直接用直流电是驱动不起来的,需要 2K-5K 的方波去驱动。
I.MX6U-ALPHA
开发板使用的是有源蜂鸣器,因此只要给其供电就会工作,I.MX6U-ALPHA 开发板所使用的有源蜂鸣器如图所示:
有源蜂鸣器只要通电就会叫,所以我们可以做一个供电电路,这个供电电路可以由一个 IO来控制其通断,一般使用三极管来搭建这个电路。
为什么我们不能像控制 LED 灯一样,直接将GPIO 接到蜂鸣器的负极,通过 IO 输出高低来控制蜂鸣器的通断。因为蜂鸣器工作的电流比LED 灯要大,直接将蜂鸣器接到 I.MX6U 的 GPIO 上有可能会烧毁 IO,所以我们需要通过一个三极管来间接的控制蜂鸣器的通断,相当于加了一层隔离。
本篇我们就驱动 I.MX6U-ALPHA
开发板上的有源蜂鸣器,使其周期性的“滴、滴、滴……”鸣叫。
硬件原理分析
蜂鸣器的硬件原理图如图所示:
图中通过一个 PNP
型的三极管 8550
来驱动蜂鸣器,通过 SNVS_TAMPER1
这个 IO来控制三极管 Q1 的导通,
- 当
SNVS_TAMPER1
输出低电平的时候 Q1 导通,相当于蜂鸣器的正极连接到DCDC_3V3,蜂鸣器形成一个通路,因此蜂鸣器会鸣叫。 - 同理,当
SNVS_TAMPER1
输出高电平的时候 Q1 不导通,那么蜂鸣器就没有形成一个通路,因此蜂鸣器也就不会鸣叫。
实验程序编写
新建文件夹“6_beep”,然后将上一篇试验中的所有内容拷贝到刚刚新建的“6_beep”里面,拷贝完成以后的工程如图所示:
用VSCode打开文件夹,完成以后在 bsp 文件夹下新建名为“beep”的文件夹,蜂鸣器驱动文件都放到“beep”文件夹里面。如下图:
新建 beep.h 文件,保存到 bsp/beep 文件夹里面,在 beep.h 里面输入如下内容
#ifndef __BSP_BEEP_H
#define __BSP_BEEP_H
/***************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名 : bsp_beep.h
作者 : 左忠凯
版本 : V1.0
描述 : 蜂鸣器驱动头文件。
其他 : 无
论坛 : www.openedv.com
日志 : 初版V1.0 2019/1/4 左忠凯创建
***************************************************************/
#include "imx6ul.h"
/*函数声明*/
void beep_init(void);
void beep_switch(int status);
#endif /* __BSP_BEEP_H */
beep.h 很简单,就是函数声明。新建文件 beep.c,然后在 beep.c 里面输入如下内容:
#include "bsp_beep.h"
/***************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名 : bsp_beep.c
作者 : 左忠凯
版本 : V1.0
描述 : BEEP驱动文件。
其他 : 无
论坛 : www.openedv.com
日志 : 初版V1.0 2019/1/4 左忠凯创建
***************************************************************/
/*
* @description : 初始化蜂鸣器对应的 IO
* @param : 无
* @return : 无
*/
void beep_init(void)
{
/* 1、初始化IO复用 */
IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0); /* 复用为GPIO1_IO03 */
/* 2、、配置GPIO5_IO01的IO属性
*bit 16:0 HYS关闭
*bit [15:14]: 00 默认下拉
*bit [13]: 0 kepper功能
*bit [12]: 1 pull/keeper使能
*bit [11]: 0 关闭开路输出
*bit [7:6]: 10 速度100Mhz
*bit [5:3]: 110 R0/6驱动能力
*bit [0]: 0 低转换率
*/
IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0X10B0);
/* 3、初始化GPIO,GPIO5_IO01设置为输出*/
GPIO5->GDIR |= (1 << 1);
/* 4、设置GPIO5_IO01输出低电平,打开LED0*/
GPIO5->DR |= (1 << 1);
}
/*
* @description : 蜂鸣器控制函数,控制蜂鸣器打开还是关闭
* @param - status : 0,关闭,1 打开
* @return : 无
*/
void beep_switch(int status)
{
if(status == ON)
GPIO5->DR &= ~(1<<1); /* 打开LED0 */
else if(status == OFF)
GPIO5->DR |= (1<<1); /* 关闭LED0 */
}
beep.c 文件一共有两个函数:beep_init
和 beep_switch
,其中 beep_init
用来初始化 BEEP
所使用的 GPIO,也就是 SNVS_TAMPER1
,将其复用为 GPIO5_IO01
,和上一篇的 LED 灯初始化
函数一样。beep_switch
函数用来控制 BEEP 的开关,也就是设置 GPIO5_IO01
的高低电平,很简单。注意引脚在第五组GPIO中,第一个。
最后在 main.c 函数中输入如下所示内容:
/**************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名 : mian.c
作者 : 左忠凯
版本 : V1.0
描述 : I.MX6U开发板裸机实验5 BSP形式的LED驱动
其他 : 本实验学习目的:
1、将各个不同的文件进行分类,学习如何整理工程、就
和学习STM32一样创建工程的各个文件夹分类,实现工程文件
的分类化和模块化,便于管理。
2、深入学习Makefile,学习Makefile的高级技巧,学习编写
通用Makefile。
论坛 : www.openedv.com
在线教育 : www.yuanzige.com
日志 : 初版V1.0 2019/1/4 左忠凯创建
**************************************************************/
#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"
/*
* @description : mian函数
* @param : 无
* @return : 无
*/
int main(void)
{
clk_enable(); /* 使能所有的时钟 */
led_init(); /* 初始化led */
beep_init(); /* 初始化beep */
while(1)
{
/* 打开LED0 */
led_switch(LED0,ON);
beep_switch(ON);
delay(500);
/* 关闭LED0 */
led_switch(LED0,OFF);
beep_switch(OFF);
delay(500);
}
return 0;
}
main.c中只有一个main函数,
- main函数先使能所有的外设时钟,
- 初始化LED和BEEP。
- 在 while(1)循环中周期性的开关 LED 灯和蜂鸣器,周期大约为 500ms.
main.c 的内容也比较简单。
编译下载验证
编写 Makefile
Makefile 使用上一篇编写的通用 Makefile,
第2期ARM裸机篇:【11】BSP工程管理实验_心飞的博客-CSDN博客
第2期ARM裸机篇:【11】BSP工程管理实验_心飞的个人网站
- 修改变量 TARGET 为 beep,
- 在变量 INCDIRS和 SRCDIRS 中追加“bsp/beep”
修改完成以后如下所示:
1 CROSS_COMPILE ?= arm-linux-gnueabihf-
2 TARGET ?= beep
3
4 /* 省略掉其它代码...... */
5
6 INCDIRS := 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 即可,如下:
1 SECTIONS{
2 . = 0X87800000;
3 .text :
4 {
5 obj/start.o
6 *(.text)
7 }
8 .rodata ALIGN(4) : {*(.rodata*)}
9 .data ALIGN(4) : { *(.data) }
10 __bss_start = .;
11 .bss ALIGN(4) : { *(.bss) *(COMMON) }
12 __bss_end = .;
13 }
编译下载
参考文章:第2期ARM裸机篇:【6】 汇编LED驱动实验1_汇编LED代码编写_心飞的博客-CSDN博客
参考文章:第2期ARM裸机篇:【6】 汇编LED驱动实验1_汇编LED代码编写_心飞的博客-个人网站
使用 Make 命令编译代码,编译成功以后使用软件 imxdownload 将编译完成的 bsp.bin 文件下载到 SD 卡中,命令如下:
chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
./imxdownload beep.bin /dev/sdc //烧写到 SD 卡中,不能烧写到/dev/sda 或 sda1 设备里面!
烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,然后复位开发板。如果代码运行正常的话 LED 灯亮的时候蜂鸣器鸣叫,当 LED 灯灭的时候蜂鸣器不鸣叫。
其他
相关资源下载
I.MX6ULL SDK包.rar-嵌入式文档类资源-CSDN下载
I.MX6ULL官方SDK包移植头文件.rar-嵌入式文档类资源-CSDN下载
小有收获
有收获记得三连哦: