00. 目錄
文章目錄
00. 目錄01. 控制原理02. 配置寄存器03. 程式示例一04. 程式示例二05. 程式示例三06. 附錄
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}