【ARM】Tiny4412裸板编程之蜂鸣器

00. 目录

01. 控制原理

咱们的蜂鸣器在底板上,所以需要看底板的原理图
在这里插入图片描述

打开底板原理图(Tiny4412SDK-1506-Schematic.pdf)
在这里插入图片描述
在这里插入图片描述

由上图可知,Tiny4412有1个蜂鸣器,控制它们四个引脚分别是GPD0_0,由原理可知,当IO引脚为高电平时,蜂鸣器就响,当IO引脚为低电平时蜂鸣器就不响了。我们要做的工作就是设置GPD0_0为输出功能,且控制且输出电平高低即可。

02. 配置寄存器

由原理图可知,程序只进行了两步操作。

第一步:GPD0功能配置寄存器,地址为0x11400000+0x000000A0=0x114000A0,每四位控制一个引脚,0输入,1输出等等,这里我们用到的是输出功能,相应位(GPDCON[1])配置为1

在这里插入图片描述

第二步:GPD0数据寄存器,输出时相应位赋值0/1,可以输出高低电平,引脚配置为输入,读取相应引脚可以获取IO状态,地址为0x11400000+0x000000A4=0x114000A4
在这里插入图片描述

03. 程序示例一

蜂鸣器开

bell.s文件内容如下

    .section .text
    .align 2
    .global bell_init
bell_init:
    @GPD0_0
    ldr r0, =0x114000A0
    ldr r1, [r0]
    bic r1, r1, #0xf
    orr r1, r1, #0x1
    str r1, [r0]
    mov pc, lr


    .align 2
    .global bell_on
bell_on:
    ldr r0, =0x114000A4
    ldr r1, [r0]
    orr r1, r1, #0x1
    str r1, [r0]
    mov pc, lr


    .align 2
    .global bell_off
bell_off:
    ldr r0, =0x114000A4
    ldr r1, [r0]
    bic r1, r1, #0x1
    str r1, [r0]
    mov pc, lr

test.s文件内容如下

    .section .rodata
    .align 2
.LC0:
    .string "led all off\n"


    .section .text
    .align 2
    .global _start
_start:
    stmfd sp!, {lr}

    bl bell_init

    bl bell_on

    
    ldmfd sp!, {pc}

04. 程序示例二

bell.s文件内容如下

    .section .text
    .align 2
    .global bell_init
bell_init:
    @GPD0_0
    ldr r0, =0x114000A0
    ldr r1, [r0]
    bic r1, r1, #0xf
    orr r1, r1, #0x1
    str r1, [r0]
    mov pc, lr


    .align 2
    .global bell_on
bell_on:
    ldr r0, =0x114000A4
    ldr r1, [r0]
    orr r1, r1, #0x1
    str r1, [r0]
    mov pc, lr


    .align 2
    .global bell_off
bell_off:
    ldr r0, =0x114000A4
    ldr r1, [r0]
    bic r1, r1, #0x1
    str r1, [r0]
    mov pc, lr

test.s文件内容如下:

    .section .rodata
    .align 2
.LC0:
    .string "led all off\n"


    .section .text
    .align 2
    .global _start
_start:
    stmfd sp!, {lr}

    bl bell_init

    bl bell_off

    
    ldmfd sp!, {pc}

05. 程序示例三

蜂鸣器开1秒 关1秒 如此循环

lib.s文件内容

     .align 2
    .global led_delay
led_delay:
    stmfd sp!, {lr}

    mov lr, pc
    ldr pc, =0x43e26480

    ldmfd sp!, {pc}

bell.s文件内容

    .section .text
    .align 2
    .global bell_init
bell_init:
    @GPD0_0
    ldr r0, =0x114000A0
    ldr r1, [r0]
    bic r1, r1, #0xf
    orr r1, r1, #0x1
    str r1, [r0]
    mov pc, lr


    .align 2
    .global bell_on
bell_on:
    ldr r0, =0x114000A4
    ldr r1, [r0]
    orr r1, r1, #0x1
    str r1, [r0]
    mov pc, lr


    .align 2
    .global bell_off
bell_off:
    ldr r0, =0x114000A4
    ldr r1, [r0]
    bic r1, r1, #0x1
    str r1, [r0]
    mov pc, lr

test.s文件内容

    .align 2
.LC0:
    .string "led all off\n"


    .section .text
    .align 2
    .global _start
_start:
    stmfd sp!, {lr}

    bl bell_init

1:
    bl bell_on

    ldr r0, =1000000
    bl led_delay


    bl bell_off

    ldr r0, =1000000
    bl led_delay

    b 1b
    
    ldmfd sp!, {pc}

06. 附录

Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf

猜你喜欢

转载自blog.csdn.net/dengjin20104042056/article/details/107832910