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

相关推荐
LCMICRO-133108477468 小时前
国产长芯微LPS7118完全pin-pin替代ADP7118,是一款采用 CMOS 技术设计的低噪声、高 PSRR、快速瞬态响应、低压差线性稳压器
arm开发·单片机·嵌入式硬件·fpga开发·硬件工程·线性稳压器·adp7118
LCMICRO-133108477468 小时前
国产长芯微LM3042完全P2P替代LT3042,是一款高性能低压差线性稳压器
arm开发·单片机·嵌入式硬件·fpga开发·硬件工程·线性稳压器·lt3042
2401_8275012811 小时前
Linux系统移植
linux·arm开发·单片机
神罚天下ET1 天前
典型arm位单片机启动流程(从上电到main.c)
c语言·arm开发·单片机
振南的单片机世界2 天前
高优先级“插队”,低优先级让路:中断嵌套的核心规则
arm开发·stm32·单片机·嵌入式硬件
Dlrb12112 天前
ARM---IMX6ULL 的 PWM 模块介绍及其程序的编写
arm开发·arm·pwm·imx6ull·lcd屏幕
byte轻骑兵3 天前
如何定制BlueZ编译:开启/关闭BLE/音频模块的编译参数配置
linux·arm开发·蓝牙·bluez·电脑蓝牙
亿道电子Emdoor3 天前
【Arm】MSP和PSP的区别简介
c语言·arm开发·单片机·mcu
Lee_jerome4 天前
《C/C++编译全家桶:g++四阶段、.a与.so区别、CMake构建、ARM交叉编译,这篇全讲透了》
c语言·开发语言·arm开发·c++·编译·cmake·cmakelists
Dlrb12115 天前
ARM---IMX6ULL的LCD模块简介及LCD驱动程序的编写
arm开发·lcd·arm·imx6ull·显存·像素