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

相关推荐
零依赖极客21 小时前
Day 9·1 KV 也量化——q8 KV 把缓存与 decode 带宽压到一半
c语言·开发语言·arm开发·人工智能·缓存·矩阵
secondyoung1 天前
I2C通信协议详解
arm开发·驱动开发·stm32·单片机·嵌入式硬件·mcu·51单片机
奔跑的架构师1 天前
[A-50]ARMv9/v8-DVFS系统架构
linux·arm开发·架构·系统架构·arm
零依赖极客2 天前
Day 8·1 自注意力机制:Q·K^T/softmax/V的在线计算
c语言·arm开发·人工智能·llama
T1mzhou2 天前
ARM64 Linux 6.10 内核驱动(14):drivers/base/platform.c:板级设备主战场
linux·c语言·开发语言·arm开发
零依赖极客3 天前
《30 天手搓 ARM 架构零依赖纯 C 推理引擎》课程介绍与大纲
c语言·开发语言·arm开发·人工智能·嵌入式硬件·ai编程
新时代牛马3 天前
ATF/ TEE / REE 与ARM 异常级别EL 安全体系完整篇:TrustZone硬件到 SMC 进OP-TEE的全链路
arm开发·python·安全
T1mzhou3 天前
ARM64 Linux 6.10 内核驱动(13):bus.c / driver.c 总线两张表,驱动怎么挂上去
linux·服务器·c语言·arm开发·arm
2401_862880824 天前
嵌入式开发 --- 51单片机与ARM核心知识
arm开发·嵌入式硬件·51单片机
CubeSandbox4 天前
Cube Sandbox 受邀亮相 Arm Create:腾讯云工程师将在“云 + AI”专场带来开场演讲
arm开发·腾讯云·cube sandbox