ARM(IMX6U)裸机C语言蜂鸣器驱动实验(BSP+SDK)
參考:Linux之ARM(IMX6U)裸機C語言蜂鳴器驅(qū)動實驗–驅(qū)動編寫,編譯
作者:一只青木呀
發(fā)布時間: 2020-08-16 14:47:23
網(wǎng)址:https://blog.csdn.net/weixin_45309916/article/details/108032168
目錄
- 1、有源蜂鳴器簡介
- 2、硬件原理分析
- 3、實驗程序的編寫
- 3.1、在寫驅(qū)動之前要找到對應(yīng)的寄存器設(shè)置好屬性
- 3.1.1、復用為GPIO
- 3.1.2、找到其設(shè)置電器屬性并配置電器屬性
- 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、調(diào)用驅(qū)動和蜂鳴器執(zhí)行函數(shù)
- 4、編譯下載和驗證
- 4.1、修改Makefile文件
- 4.2、編譯下載
前幾篇博文試驗中的驅(qū)動 LED 燈亮滅屬于 GPIO 的輸出控制,本章再鞏固一下 I.MX6U 的 GPIO輸出控制,在 I.MX6U-ALPHA 開發(fā)板上有一個有源蜂鳴器,通過 IO 輸出高低電平即可控制蜂鳴器的開關(guān),本質(zhì)上也屬于 GPIO 的輸出控制。
1、有源蜂鳴器簡介
蜂鳴器常用于計算機、打印機、報警器、電子玩具等電子產(chǎn)品中,常用的蜂鳴器有兩種:有源蜂鳴器和無源蜂鳴器,這里的有“源”不是電源,而是震蕩源。
- 有源蜂鳴器內(nèi)部帶有震蕩源,所以有源蜂鳴器只要通電就會叫。
- 無源蜂鳴器內(nèi)部不帶震蕩源,直接用直流電是驅(qū)動不起來的,需要 2K-5K 的方波去驅(qū)動。
I.MX6U-ALPHA 開發(fā)板使用的是有源蜂鳴器,因此只要給其供電就會工作, I.MX6U-ALPHA 開發(fā)板所使用的有源蜂鳴器如圖 14.2.1 所示:
有源蜂鳴器只要通電就會叫,所以我們可以做一個供電電路, 這個供電電路可以由一個 IO來控制其通斷,一般使用三極管來搭建這個電路。
為什么我們不能像控制 LED 燈一樣,直接將GPIO 接到蜂鳴器的負極,通過 IO 輸出高低來控制蜂鳴器的通斷。因為蜂鳴器工作的電流比LED 燈要大,直接將蜂鳴器接到 I.MX6U 的 GPIO 上有可能會燒毀 IO,所以我們需要通過一個三極管來間接的控制蜂鳴器的通斷,相當于加了一層隔離。本章我們就驅(qū)動 I.MX6U-ALPHA 開發(fā)板上的有源蜂鳴器,使其周期性的鳴叫。
2、硬件原理分析
通過一個 PNP 型的三極管 8550 來驅(qū)動蜂鳴器,通過 SNVS_TAMPER1這個 IO來控制三極管 Q1 的導通,當 SNVS_TAMPER1 輸出低電平的時候 Q1 導通,相當于蜂鳴器的正極連接到 DCDC_3V3,蜂鳴器形成一個通路,因此蜂鳴器會鳴叫。同理,當 SNVS_TAMPER1輸出高電平的時候 Q2 不導通,那么蜂鳴器就沒有形成一個通路,因此蜂鳴器也就不會鳴叫。
3、實驗程序的編寫
本實驗在上一次(BSP實驗)實驗的基礎(chǔ)上再做修改,把BSP實驗的工程文件復制一份,
新建 VSCode 工程(放置頭文件),工程創(chuàng)建完成以后在 bsp 文件夾下新建名為“beep”的文件夾,蜂鳴器驅(qū)動文件都放到“beep”文件夾里面。
3.1、在寫驅(qū)動之前要找到對應(yīng)的寄存器設(shè)置好屬性
3.1.1、復用為GPIO
再找到頭文件中對應(yīng)的宏
3.1.2、找到其設(shè)置電器屬性并配置電器屬性
*bit 16:0 HYS 關(guān)閉
*bit [15:14]: 00 默認下拉
*bit [13]: 0 kepper 功能
*bit [12]: 1 pull/keeper 使能
*bit [11]: 0 關(guān)閉開路輸出
*bit [7:6]: 10 速度 100Mhz
*bit [5:3]: 110 R0/6 驅(qū)動能力
*bit [0]: 0 低轉(zhuǎn)換率
3.2、beep.h
#ifndef __BEEP_H #define __BEEP_H#include "imx6ul.h"void init_beep(void); void beep_switch(int status);#endif // !__BEEP_H3.3、beep.c
#include "beep.h"/*初始化蜂鳴器*/ void init_beep(void) {IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0); /*復用為GPIO*//**bit 16:0 HYS 關(guān)閉*bit [15:14]: 00 默認下拉*bit [13]: 0 kepper 功能*bit [12]: 1 pull/keeper 使能*bit [11]: 0 關(guān)閉開路輸出*bit [7:6]: 10 速度 100Mhz*bit [5:3]: 110 R0/6 驅(qū)動能力bit [0]: 0 低轉(zhuǎn)換率*/IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0x10b0);/*設(shè)置其電器屬性*//*GPIO初始化*/GPIO5->GDIR |= (1<<1); /*設(shè)置為輸出*/GPIO5->DR |= (1<<1); /*蜂鳴器默認關(guān)閉*/}/*蜂鳴器控制*/ void beep_switch(int status) {if(status == ON)GPIO5->DR |= (1<<1);else if(status == OFF)GPIO5->DR &= ~(1<<1); }beep.c 文件一共有兩個函數(shù): beep_init 和 beep_switch,其中 beep_init 用來初始化 BEEP 所使用的 GPIO,也就是 SNVS_TAMPER1,將其復用為 GPIO5_IO01,和上一章的 LED 燈初始化函數(shù)一樣。 beep_switch 函數(shù)用來控制 BEEP 的開關(guān),也就是設(shè)置 GPIO5_IO01 的高低電平,很簡單。
3.4、把頭文件包含進main.h中
3.4.1、修改.vscode文件把beep文件夾路徑加入到.vscode
3.4.2、修改main.h
3.5、調(diào)用驅(qū)動和蜂鳴器執(zhí)行函數(shù)
main.c
#include "main.h"int main() {clk_enable(); //使能外設(shè)時鐘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函數(shù), main函數(shù)先使能所有的外設(shè)時鐘,然后初始化LED和BEEP。最終在 while(1)循環(huán)中周期性的開關(guān) 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 中添加蜂鳴器驅(qū)動頭文件路徑,也就是文件 beep.h 的路徑。
第 16 行在變量 SRCDIRS 中添加蜂鳴器驅(qū)動文件路勁,也就是文件 beep.c 的路徑。
4.2、編譯下載
使用 Make 命令編譯代碼,編譯成功以后使用軟件 imxdownload 將編譯完成的 beep.bin 文件下載到 SD 卡中,命令如下:
chmod 777 imxdownload //給予 imxdownload 可執(zhí)行權(quán)限,一次即可 ./imxdownload beep.bin /dev/sdd //燒寫到 SD 卡中 不能燒寫到/dev/sda 或sda1 設(shè)備里面!燒寫成功以后將 SD 卡插到開發(fā)板的 SD 卡槽中,然后復位開發(fā)板。如果代碼運行正常的話 LED 燈亮的時候蜂鳴器鳴叫,當 LED 燈滅的時候蜂鳴器不鳴叫,周期大概為 1000ms。
燒寫詳情請參考bin文件燒寫詳情
總結(jié)
以上是生活随笔為你收集整理的ARM(IMX6U)裸机C语言蜂鸣器驱动实验(BSP+SDK)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看IIS连接数
- 下一篇: Games 图形学 L2线性代数