【ARM】Tiny4412裸板编程之LED(二)
生活随笔
收集整理的這篇文章主要介紹了
【ARM】Tiny4412裸板编程之LED(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. 控制原理
- 02. 配置寄存器
- 03. 程序示例一
- 04. 程序示例二
- 05. 程序示例三
- 06. 附錄
01. 控制原理
咱們的LED在核心板上,所以需要看核心板的原理圖
打開核心板原理圖(Tiny4412-1412-Schematic.pdf)
由上圖可知,Tiny4412有4個用戶LED燈,控制它們四個引腳分別是GPM4_0~ GPM4_3,由原理可知,當IO引腳為高電平時,LED燈滅,當IO引腳為低電平時LED亮。我們要做的工作就是設置GPM4_0~ GPM4_3為輸出功能,且控制且輸出電平高低即可。
02. 配置寄存器
由原理圖可知,程序只進行了兩步操作。
第一步:設置GPM4_0~GPM4_3相對應的控制寄存器GPM4CON,使GPM4_0 GPM4_3四個引腳為輸出功能。
第二步:設置其對應的數據寄存器GPM4DAT對應的4個bit位為0,使GPM4_0~ GPM4_3為低電平,4個LED燈全亮,使GPM4_0~ GPM4_3全為高電平,4個LED燈全滅。
03. 程序示例一
所有led閃爍 匯編函數
.section .rodata.align 2 .LC0:.string "led all off\n".section .text.align 2.global _start _start:stmfd sp!, {lr}bl led_init 1:bl led_alloffldr r0, =1000000bl led_delaybl led_allonldr r0, =1000000bl led_delayb 1bldmfd sp!, {pc}.align 2.global led_init led_init:@配置為輸出ldr r0, =0x110002E0 ldr r1, [r0]ldr r2, =0xffffbic r1, r1, r2ldr r2, =0x1111orr r1, r1, r2str r1, [r0]mov pc, lr.align 2.global led_allon led_allon:ldr r0, =0x110002E4 ldr r1, [r0]bic r1, r1, #0xfstr r1, [r0]mov pc, lr.align 2.global led_alloff led_alloff:ldr r0, =0x110002E4 ldr r1, [r0]orr r1, r1, #0xfstr r1, [r0]mov pc, lr.align 2.global led_delay led_delay:stmfd sp!, {lr}mov lr, pcldr pc, =0x43e26480ldmfd sp!, {pc}Makefile
all:arm-linux-gcc -c test.s -o test.oarm-linux-ld -Ttext=0x40008000 test.o -o testarm-linux-objcopy -O binary test test.bin.PHONY:clean clean:rm -rf test.o test test.bin04. 程序示例二
所有led閃爍 匯編函數 多文件操作
lib.s文件內容如下
.section .text.align 2.global led_delay led_delay:stmfd sp!, {lr}mov lr, pcldr pc, =0x43e26480ldmfd sp!, {pc}led.s文件內容如下
.section .text.align 2.global led_init led_init:@配置為輸出ldr r0, =0x110002E0 ldr r1, [r0]ldr r2, =0xffffbic r1, r1, r2ldr r2, =0x1111orr r1, r1, r2str r1, [r0]mov pc, lr.align 2.global led_allon led_allon:ldr r0, =0x110002E4 ldr r1, [r0]bic r1, r1, #0xfstr r1, [r0]mov pc, lr.align 2.global led_alloff led_alloff:ldr r0, =0x110002E4 ldr r1, [r0]orr r1, r1, #0xfstr r1, [r0]mov pc, lrtest.s文件內容如下:
.section .rodata.align 2 .LC0:.string "led all off\n".section .text.align 2.global _start _start:stmfd sp!, {lr}bl led_init 1:bl led_alloffldr r0, =1000000bl led_delaybl led_allonldr r0, =1000000bl led_delayb 1bldmfd sp!, {pc}Makefile文件
all:arm-linux-gcc -c test.s -o test.oarm-linux-gcc -c led.s -o led.oarm-linux-gcc -c lib.s -o lib.oarm-linux-ld -Ttext=0x40000000 test.o lib.o led.o -o testarm-linux-objcopy -O binary test test.bin.PHONY:clean clean:rm -rf *.o test test.bin05. 程序示例三
跑馬燈程序
lib.s文件內容
.align 2.global led_delay led_delay:stmfd sp!, {lr}mov lr, pcldr pc, =0x43e26480ldmfd sp!, {pc}led.s文件內容
.section .text.align 2.global led_init led_init:@配置為輸出ldr r0, =0x110002E0 ldr r1, [r0]ldr r2, =0xffffbic r1, r1, r2ldr r2, =0x1111orr r1, r1, r2str r1, [r0]mov pc, lr.align 2.global led_allon led_allon:ldr r0, =0x110002E4 ldr r1, [r0]bic r1, r1, #0xfstr r1, [r0]mov pc, lr.align 2.global led_alloff led_alloff:ldr r0, =0x110002E4 ldr r1, [r0]orr r1, r1, #0xfstr r1, [r0]mov pc, lr.align 2.global led_on led_on:ldr r1, =0x110002E4 ldr r2, [r1]mov r3, #1bic r2, r2, r3, LSL r0str r2, [r1]mov pc, lr.align 2.global led_off led_off:ldr r1, =0x110002E4 ldr r2, [r1]mov r3, #1orr r2, r2, r3, LSL r0str r2, [r1]mov pc, lrtest.s文件內容
.section .rodata.align 2 .LC0:.string "led all off\n".section .text.align 2.global _start _start:stmfd sp!, {lr}bl led_initbl led_alloffmov r4, #01:mov r0, r4bl led_onldr r0, =1000000bl led_delaymov r0, r4bl led_offldr r0, =1000000bl led_delayadd r4, r4, #1cmp r4, #4moveq r4, #0b 1bldmfd sp!, {pc}Makefile文件
all:arm-linux-gcc -c test.s -o test.oarm-linux-gcc -c led.s -o led.oarm-linux-gcc -c lib.s -o lib.oarm-linux-ld -Ttext=0x40000000 test.o lib.o led.o -o testarm-linux-objcopy -O binary test test.bin.PHONY:clean clean:rm -rf *.o test test.bin06. 附錄
Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf
總結
以上是生活随笔為你收集整理的【ARM】Tiny4412裸板编程之LED(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【IT资讯】TIOBE - 2020年8
- 下一篇: 【ARM】Tiny4412裸板编程之蜂鸣