00. 目录


文章目录


00. 目录01. 控制原理02. 配置寄存器03. 程序示例一04. 程序示例二05. 程序示例三06. 附录


01. 控制原理

咱们的蜂鸣器在底板上,所以需要看底板的原理图

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

打开底板原理图(Tiny4412SDK-1506-Schematic.pdf)

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

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

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

02. 配置寄存器

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

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

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

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

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

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