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卡中

相关推荐
WHS-_-202217 小时前
When RDMA Meets Wireless
arm开发
szxinmai主板定制专家20 小时前
基于 ARM+FPGA 数据机床实时工业控制设计--以雕刻机为例
arm开发·人工智能·嵌入式硬件·fpga开发
wandertp21 小时前
对信号处理及滤波器的理解---基于robomaster机器人嵌入式控制系统
arm开发·stm32·算法·信号处理
XMAIPC_Robot21 小时前
基于RK3588 ARM+FPGA电火花数控机床控制系统设计,兼顾ethercat软硬件实时
linux·arm开发·人工智能·嵌入式硬件·fpga开发
底层开发智库21 小时前
C1-Ultra FVP调试并运行Linux kernel全程记录,硬核演示如何解决启动问题
linux·arm开发·内核·嵌入式·arm
XMAIPC_Robot21 小时前
基于 ARM+FPGA 数据机床控制系统设计--以雕刻机为例
arm开发·fpga开发
一抹晴空2 天前
Keil MDK AC6 compiler编译报错,与AC5区别
c语言·arm开发·单片机
运维成长记2 天前
关于“有x86镜像,没有Dockerfile” 怎么制作arm架构的镜像
arm开发·架构
熠速2 天前
PolarBox高性能实时仿真系统
arm开发·fpga开发·嵌入式实时数据库·硬件在环半实物仿真
天下·第二3 天前
如何在【x86】服务器上打包构建【arm】镜像
服务器·arm开发·eureka