ARM | 让蜂鸣器发声!

一、原理图

结合原理图,查阅手册可以得知beep引脚接GPIO5_IO01引脚,置低电平时导通,蜂鸣器响

二、步骤

这里我们直接调用STM32的固件库来完成让蜂鸣器发声的操作

需要用到以下两个头文件

Matlab 复制代码
#include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"

和我们操作LED灯的步骤基本相同

步骤:

1.使能所有的外设时钟

Matlab 复制代码
void enable_clock(void)
{
    CCM->CCGR0 = 0xFFFFFFFF;
    CCM->CCGR1 = 0xFFFFFFFF;
    CCM->CCGR2 = 0xFFFFFFFF;
    CCM->CCGR3 = 0xFFFFFFFF;
    CCM->CCGR4 = 0xFFFFFFFF;
    CCM->CCGR5 = 0xFFFFFFFF;
    CCM->CCGR6 = 0xFFFFFFFF;
}

2.配置引脚复用功能

由于我们调用了固件库,直接使用IOMUXC_SetPinMux函数

3.配置电气属性

调用IOMUXC_SetPinConfig函数,传默认值(0x10B0)

4.配置引脚为输出模式

将GPIO5的GDIR寄存器bit1置1

Matlab 复制代码
//配置GPIO5_IO01引脚复用功能
    IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0);
    //配置引脚电气属性
    IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0x10B0);
    //配置引脚为输出模式
    GPIO5->GDIR |= (1 << 1);

5.控制蜂鸣器发声

打开:GPIO5的DR寄存器bit1清0

关闭:GPIO5的DR寄存器bit1置1

翻转:GPIO5的DR寄存器bit1 按位异或 1

Matlab 复制代码
//蜂鸣器响
void beep_on(void)
{
    GPIO5->DR &= ~(1 << 1);
}

//蜂鸣器关
void beep_off(void)
{
    GPIO5->DR |= (1 << 1);
}

//蜂鸣器翻转
void beep_nor(void)
{
    GPIO5->DR ^= (1 << 1);
}

6.编译

链接脚本:

Matlab 复制代码
SECTIONS
{
    . = 0x87800000;
    .text :
    {
        obj/start.o
        *(.text)
    }

    .rodata ALIGN(4) : {*(.rodata*)}
    .data ALIGN(4) : {*(.data)}
    . = ALIGN(4);
    _bss_start = .;
    .bss ALIGN(4) : {*(.bss) *(COMMON)}
    _bss_end = .;
}

先设置整个程序的起始地址,从0x87800000地址开始

下来需链接

.text段:代码段,存放代码、指令,是程序运行入口

.rodata段:只读数据段,存放如字符串常量,const修饰的全局变量等

.data段:数据段,存放已初始化的全局变量和静态变量

.bss段:未初始化的数据段,存放未初始化的全局变量和静态变量

这四个段的代码:

Makefile

Matlab 复制代码
target = beep

cross_compiler = arm-linux-gnueabihf-

cc = $(cross_compiler)gcc
ld = $(cross_compiler)ld
objcopy = $(cross_compiler)objcopy
objdump = $(cross_compiler)objdump

incdirs = bsp imx6ull
srcdirs = bsp project

include = $(patsubst %, -I%, $(incdirs))


cfiles = $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.c))
sfiles = $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.S))

cfilenodir = $(notdir $(cfiles))
sfilenodir = $(notdir $(sfiles))

cobjs = $(patsubst %, obj/%, $(cfilenodir:.c=.o))
sobjs = $(patsubst %, obj/%, $(sfilenodir:.S=.o))

objs = $(cobjs) $(sobjs)

VPATH = $(srcdirs)

$(target).bin : $(objs)
	$(ld) -Timx6ull.lds -o$(target).elf $^
	$(objcopy) -O binary -S -g $(target).elf $@
	$(objdump) -D $(target).elf > $(target).dis

$(sobjs) : obj/%.o : %.S
	@mkdir -p obj
	$(cc) -Wall -nostdlib -c $(include) -o $@ $<

$(cobjs) : obj/%.o : %.c
	@mkdir -p obj		
	$(cc) -Wall -nostdlib -c $(include) -o $@ $<

.PHONY : clean
clean:
	rm -rf $(objs) $(target).elf $(target).bin $(target).dis

7.运行程序

编译成功后,使用./imxdownload beep.bin /dev/sdb 将程序烧录到SD卡中

相关推荐
Black_Rock_br3 小时前
ARM服务器固件FVP仿真开发流程深度解析实战指南
arm开发·人工智能·嵌入式硬件·硬件工程
又见情义4 小时前
RK3568 Android 13驱动适配-WiFi&BT模块(RTL8822CS)
android·arm开发·驱动开发
DevHub4 小时前
STM32 USB HID 教程:TinyUSB 实现键盘设备,从描述符到枚举
arm开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
蓝速科技5 小时前
蓝速鸿蒙信创终端长效流畅性深度评测
arm开发·华为·harmonyos
zlinear数据采集卡5 小时前
数据采集卡从入门到精通(46):趋势展望——软件定义硬件、AI分析与开源生态
arm开发·stm32·单片机·嵌入式硬件·fpga开发·开源
咯哦哦哦哦11 小时前
linux so库(arm)对比分析
linux·运维·arm开发
又见情义18 小时前
RK3568 Android 13 板载驱动适配-USB
android·arm开发·驱动开发
DevHub1 天前
probe-rs 教程:一行命令替代 OpenOCD 烧写调试 Cortex-M
arm开发·嵌入式硬件·mcu·rust
etc95271 天前
IAR下如何同时指定section的LMA和VMA
arm开发·嵌入式硬件·mcu
ZJU_统一阿萨姆2 天前
【算子开发】扫描(Scan)与前缀和
开发语言·arm开发·架构·系统架构·硬件架构