参考:Linux之ARM(IMX6U)裸机C语言蜂鸣器驱动实验–驱动编写,编译
作者:一只青木呀
发布时间: 2020-08-16 14:47:23
网址:https://blog.csdn.net/weixin_45309916/article/details/108032168

目录

  • 1、有源蜂鸣器简介
  • 2、硬件原理分析
  • 3、实验程序的编写
    • 3.1、在写驱动之前要找到对应的寄存器设置好属性
      • 3.1.1、复用为GPIO
      • 3.1.2、找到其设置电器属性并配置电器属性
    • 3.2、beep.h
    • 3.3、beep.c
    • 3.4、把头文件包含进main.h中
      • 3.4.1、修改.vscode文件把beep文件夹路径加入到.vscode
      • 3.4.2、修改main.h
    • 3.5、调用驱动和蜂鸣器执行函数
  • 4、编译下载和验证
    • 4.1、修改Makefile文件
    • 4.2、编译下载

前几篇博文试验中的驱动 LED 灯亮灭属于 GPIO 的输出控制,本章再巩固一下 I.MX6U 的 GPIO输出控制,在 I.MX6U-ALPHA 开发板上有一个有源蜂鸣器,通过 IO 输出高低电平即可控制蜂鸣器的开关,本质上也属于 GPIO 的输出控制。

1、有源蜂鸣器简介

蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中,常用的蜂鸣器有两种:有源蜂鸣器和无源蜂鸣器,这里的有“源”不是电源,而是震荡源。

  • 有源蜂鸣器内部带有震荡源,所以有源蜂鸣器只要通电就会叫。
  • 无源蜂鸣器内部不带震荡源,直接用直流电是驱动不起来的,需要 2K-5K 的方波去驱动。

I.MX6U-ALPHA 开发板使用的是有源蜂鸣器,因此只要给其供电就会工作, I.MX6U-ALPHA 开发板所使用的有源蜂鸣器如图 14.2.1 所示:

有源蜂鸣器只要通电就会叫,所以我们可以做一个供电电路, 这个供电电路可以由一个 IO来控制其通断,一般使用三极管来搭建这个电路。

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

2、硬件原理分析



通过一个 PNP 型的三极管 8550 来驱动蜂鸣器,通过 SNVS_TAMPER1这个 IO来控制三极管 Q1 的导通,当 SNVS_TAMPER1 输出低电平的时候 Q1 导通,相当于蜂鸣器的正极连接到 DCDC_3V3,蜂鸣器形成一个通路,因此蜂鸣器会鸣叫。同理,当 SNVS_TAMPER1输出高电平的时候 Q2 不导通,那么蜂鸣器就没有形成一个通路,因此蜂鸣器也就不会鸣叫。

3、实验程序的编写

本实验在上一次(BSP实验)实验的基础上再做修改,把BSP实验的工程文件复制一份,

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

3.1、在写驱动之前要找到对应的寄存器设置好属性

3.1.1、复用为GPIO


再找到头文件中对应的宏

3.1.2、找到其设置电器属性并配置电器属性




*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 低转换率

3.2、beep.h

#ifndef __BEEP_H
#define __BEEP_H#include "imx6ul.h"void init_beep(void);
void beep_switch(int status);#endif // !__BEEP_H

3.3、beep.c

#include "beep.h"/*初始化蜂鸣器*/
void init_beep(void)
{IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);  /*复用为GPIO*//**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);/*设置其电器属性*//*GPIO初始化*/GPIO5->GDIR |= (1<<1);  /*设置为输出*/GPIO5->DR |= (1<<1); /*蜂鸣器默认关闭*/}/*蜂鸣器控制*/
void beep_switch(int status)
{if(status == ON)GPIO5->DR |= (1<<1);else if(status == OFF)GPIO5->DR &= ~(1<<1);
}

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

3.4、把头文件包含进main.h中

3.4.1、修改.vscode文件把beep文件夹路径加入到.vscode

3.4.2、修改main.h

3.5、调用驱动和蜂鸣器执行函数

main.c

#include "main.h"int main()
{clk_enable();  //使能外设时钟led_init(); //初始化LEDinit_beep();//初始化蜂鸣器while(1){led_off();  beep_switch(OFF);delay(1000);led_on();beep_switch(ON);delay(1000);}return 0;
}

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

4、编译下载和验证

4.1、修改Makefile文件

主要修改目标文件和头文件路径和源码路径

CROSS_COMPILE    ?= arm-linux-gnueabihf-
TARGET          ?= beepCC              := $(CROSS_COMPILE)gcc
LD              := $(CROSS_COMPILE)ld
OBJCOPY         := $(CROSS_COMPILE)objcopy
OBJDUMP         := $(CROSS_COMPILE)objdumpINCDIRS      := imx6ul \bsp/clk \bsp/led \bsp/delay \bsp/beepSRCDIRS            := project \bsp/clk \bsp/led \bsp/delay \bsp/beepINCLUDE           := $(patsubst %, -I %, $(INCDIRS))SFILES           := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.s))
CFILES          := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))SFILENDIR     := $(notdir  $(SFILES))
CFILENDIR       := $(notdir  $(CFILES))SOBJS           := $(patsubst %, obj/%, $(SFILENDIR:.s=.o))
COBJS           := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS            := $(SOBJS) $(COBJS)VPATH          := $(SRCDIRS).PHONY: clean$(TARGET).bin : $(OBJS)$(LD) -Timx6ul.lds -o $(TARGET).elf $^$(OBJCOPY) -O binary -S $(TARGET).elf $@$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis$(SOBJS) : obj/%.o : %.s$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<$(COBJS) : obj/%.o : %.c$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<clean:rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)

第 2 行修改目标的名称为“beep”。
第 10 行在变量 INCDIRS 中添加蜂鸣器驱动头文件路径,也就是文件 beep.h 的路径。
第 16 行在变量 SRCDIRS 中添加蜂鸣器驱动文件路劲,也就是文件 beep.c 的路径。

4.2、编译下载

使用 Make 命令编译代码,编译成功以后使用软件 imxdownload 将编译完成的 beep.bin 文件下载到 SD 卡中,命令如下:

chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
./imxdownload beep.bin /dev/sdd //烧写到 SD 卡中 不能烧写到/dev/sda 或sda1 设备里面!

烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,然后复位开发板。如果代码运行正常的话 LED 灯亮的时候蜂鸣器鸣叫,当 LED 灯灭的时候蜂鸣器不鸣叫,周期大概为 1000ms。

烧写详情请参考bin文件烧写详情

ARM(IMX6U)裸机C语言蜂鸣器驱动实验(BSP+SDK)相关推荐

  1. arm汇编和c语言混合编程实验报告,实验三C语言和ARM汇编混合编程指导书.doc

    实验三C语言和ARM汇编混合编程指导书 实验三 1. 实验目的 掌握C语言和ARM汇编混合编程方法. 2. 实验设备 硬件:PC 机 一台 软件:Windows98/XP/2000 系统,ADS 1. ...

  2. arm汇编和c语言混合编程实验报告,arm实验ARM汇编和C语言混合编程.doc

    arm实验ARM汇编和C语言混合编程.doc 成绩辽宁工程技术大学上机实验报告课程名称汇编语言程序设计基于ARM体系结构实验题目ARM汇编和C语言混合编程院系软件学院专业软件工程班级姓名学号实验日期实 ...

  3. Linux驱动开发之蜂鸣器驱动实验

    对于蜂鸣器实验来说,无非就是在GPIO上面做出以下修改和设备树上的节点修改,除此之外和我上一个发布的博客没有任何区别,有想要了解的可以前往这里Linux驱动开发之pinctrl与gpio子系统驱动实验 ...

  4. ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)

    参考:Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入) 作者:一只青木呀 发布时间: 2020-08-17 21:43:37 网址:https://blog.csdn.net/ ...

  5. 【FPGA】用Verilog代码实现无源蜂鸣器驱动实验

    目录 一.理论部分 1.蜂鸣器概述 2.驱动原理 3.实验目标 二.模块框图 三.波形图 1.时钟与复位信号 2.计数器 (1)0.5s计数器 (2)音调频率计数器 (3)分频计数器 (4)频率变量最 ...

  6. ARM(IMX6U)裸机C语言版本LED驱动实验(汇编进入处理器SVC模式、SP堆内存、跳转main函数、链接起始地址)

    参考:Linux之ARM(IMX6U)裸机C语言LED驱动实验–驱动编写,编译 作者:一只青木呀 发布时间: 2020-08-11 11:20:17 网址:https://blog.csdn.net/ ...

  7. 【小月电子】安路国产FPGA开发板系统学习教程-LESSON10无源蜂鸣器驱动

    无源蜂鸣器驱动实验例程讲解 根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤.比如非常简单的项目,我们可以省去虚线框里面的步骤,但是我们的入 ...

  8. 【小月电子】ALTERA FPGA开发板系统学习教程-LESSON10无源蜂鸣器驱动

    无源蜂鸣器驱动实验例程讲解 若要观看该博客配套的视频教程,可点击此链接 开发板实物图 根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤.比如 ...

  9. Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动

    Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动 前言 编译代码 1.把 .s 文件编译成 .o文件 2.把 .o文件编译成连接文件 .elf 3.arm-linux-gnueabi ...

最新文章

  1. 新书预告 | 你肯定想读的一本Python好作品
  2. SBO-COMMON库中查各个表的大小的SQL语句
  3. 软件设计应该遵循的基本原则有哪些?
  4. QT | QT MSVC 2015 + VS 2015开发环境配置及GIT设置
  5. login窗口for mysql_CTF| SQL注入之login界面
  6. Spring boot变量的初始化顺序
  7. Sql Server2005对t-sql的增强之Cross Apply
  8. css复选框样式_使用CSS样式复选框
  9. 网安入门须知:Python基础导读
  10. 【C语言】16-预处理指令2-条件编译
  11. 考研--线性代数辅导讲义(第一章行列式 第二章矩阵)
  12. arcgis投影坐标转经纬度
  13. 流程图-时序图-架构图,部署图-拓扑图-ER图-类图-状态图-用例图
  14. Python Re正则表达式
  15. 2021年起重机械指挥复审模拟考试及起重机械指挥考试试题
  16. 有源电场与无源磁场与麦克斯韦方程
  17. 手机c语言图形界面编程工具,「分享」C语言如何编写图形界面
  18. 揭秘篇:架构腐化之谜
  19. TM商标如何定义 TM商标与R标有何区别?
  20. 如何运营一个女性社区?

热门文章

  1. 共享单车,信息安全应未雨绸缪
  2. yii2中的rules验证规则
  3. CentOS系列启动流程和内核原理(5系列,6系列,7系列)
  4. spring-在配置文件中配置DAO时直接引用DataSource
  5. Linux包管理速查表
  6. Nhibernate教程2(3)
  7. 近300万记录的论坛还用这个分页存储过程
  8. Linux链接库三(C跟C++之间动态库的相互调用)
  9. java applet 文本框_Java Applet 文本框 TextField 小例 | 学步园
  10. python接口开发django_用 Django 开发接口