天天看點

【ARM】Tiny4412裸闆程式設計之蜂鳴器

00. 目錄

文章目錄

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

01. 控制原理

咱們的蜂鳴器在底闆上,是以需要看底闆的原理圖

【ARM】Tiny4412裸闆程式設計之蜂鳴器

打開底闆原理圖(Tiny4412SDK-1506-Schematic.pdf)

【ARM】Tiny4412裸闆程式設計之蜂鳴器
【ARM】Tiny4412裸闆程式設計之蜂鳴器

由上圖可知,Tiny4412有1個蜂鳴器,控制它們四個引腳分别是GPD0_0,由原理可知,當IO引腳為高電平時,蜂鳴器就響,當IO引腳為低電平時蜂鳴器就不響了。我們要做的工作就是設定GPD0_0為輸出功能,且控制且輸出電平高低即可。

02. 配置寄存器

由原理圖可知,程式隻進行了兩步操作。

​第一步​:GPD0功能配置寄存器,位址為0x11400000+0x000000A0=0x114000A0,每四位控制一個引腳,0輸入,1輸出等等,這裡我們用到的是輸出功能,相應位(GPDCON[1])配置為1

【ARM】Tiny4412裸闆程式設計之蜂鳴器

​第二步​:GPD0資料寄存器,輸出時相應位指派0/1,可以輸出高低電平,引腳配置為輸入,讀取相應引腳可以擷取IO狀态,位址為0x11400000+0x000000A4=0x114000A4

【ARM】Tiny4412裸闆程式設計之蜂鳴器

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. 附錄