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

00. 目录

01. 控制原理

我们的蜂鸣器在底板上,因此须要看底板的原理图
在这里插入图片描述web

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

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

02. 配置寄存器

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

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

在这里插入图片描述

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

03. 程序示例一

蜂鸣器开string

bell.s文件内容以下it

.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文件内容以下io

.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文件内容以下class

.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