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

相关推荐
灵哎惹,凌沃敏5 小时前
CM3/CM4内核总线知识总结
c语言·arm开发·单片机
万法若空4 天前
Cortex-A7的运行模式
linux·arm开发
ZHANG13HAO4 天前
海思 Hi3516+ML307 双模 4G 在线方案:KOL 视频 AI 不掉线、长连接稳在线
arm开发
万法若空5 天前
ARMv7-a协处理器及指令详解
arm开发
万法若空5 天前
ARM汇编程序设计基础
arm开发
zhouwy1137 天前
ARM汇编指令集详解
汇编·arm开发
山后太阳8 天前
Keil5(MDK-ARM)完整下载安装教程+入门教程:从零搭建STM32开发环境
arm开发·stm32·嵌入式硬件
zz_lzh8 天前
arm版AI牛马:armbian(rk3588)设备部署openclaw
arm开发·人工智能·arm
lanxiao88889 天前
F1C100S 内核
arm开发
杰杰桀桀桀9 天前
基于stm32ARM库函数的IIR二阶巴特沃斯低通滤波器--附完整代码
arm开发·stm32·嵌入式硬件·数字滤波器·巴特沃斯低通滤波