Hello, ARM
"Hello, ARM" 并不像PC上面写一个C语言的Helloworld那样简单。作为第一个程序,要“看得见”它运行了,至少得点亮一个LED吧。这也不难,不就是置GPIO的电平操作么。的确,只要看手册弄清楚配置哪几个寄存器,知道处理器的地址分配,了解一些指令的用法就能办到了。用汇编语言写程序,起点比较低,也是省事的办法。本人第一次玩ARM是在2008年,听说LPC21xx系列的ARM用着和单片机差不多,于是有一次“一百元玩ARM方案”,买了块LPC2103精简学习板PCB, 和20元的芯片,自己焊装。LPC2103是ARM7TDMI核心,支持32位和16位指令宽度。当时的第一个程序是这样的:
.equ SCS, 0xe01fc1a0
.equ FIODIR,0x3fffc000
.equ FIOMASK, 0x3fffc010
.equ FIOPIN,0x3fffc014
.equ FIOSET,0x3fffc018
.equ FIOCLR,0x3fffc01c
.text
.org 0x0
b main
.org 0x40
main:
ldr r0, =SCS
mov r1,#1
str r1,
ldr r1, =0x00180000
ldr r0, =FIODIR
str r1,
ldr r0, =FIOSET
ldr r2, =FIOCLR
ldr r1, =0x00080000
ldr r3, =0x00100000
loop:
mov r7, #10
ten:
mov r6, #10
one:
rsb r4, r7, #11
bln1:
str r1,
bl delay
str r1,
bl delay
subs r4, r4, #1
bne bln1
rsb r4, r6, #11
bln2:
str r3,
bl delay
str r3,
bl delay
subs r4, r4, #1
bne bln2
subs r6, r6, #1
bne one
subs r7, r7, #1
bne ten
b loop
delay:
ldr r5,=80000
wait:
subs R5, R5, #1
bne wait
mov PC, LR
.end
我后来就用C写LPC2103的程序了。但用得最多的单片机仍旧是8位的AVR!
第二块ARM片子是刚测试的LPC1114, ARM Cortex-M0核心。PCB是自己设计的了。第一个程序仍然是汇编的:
.text
.equ IOCON_BASE, 0x40044000
.equ IOCON_PIO2_6, 0x0
.equ IOCON_PIO2_8, 0x24
.equ GPIO2_BASE, 0x50020000
.equ GPIOnDATA, 0x3ffc
.equ GPIOnDIR, 0x8000
.org 0
.long 0x10001ff0
.long 0xc1
.org 0xc0
init:
ldr r0, =IOCON_BASE
mov r2, #0
str r2,
str r2,
ldr r0, =GPIO2_BASE
ldr r1, =GPIOnDIR
ldr r2, =0x140
str r2,
mov r7, #0
ldr r5, =8192
ldr r1, =GPIOnDATA
mov r2, #0x40
lsl r3, r2, #2
chg0:
str r2,
.syntax unified
loop:
subs r7, r5
beq chg
b loop
chg:
str r3,
loop2:
subs r7, r5
beq chg0
b loop2
.end
这个程序运行起来有奇怪的现象,就是两个LED不是等间隔时间交替亮的——代码中的循环完全一样呢。费解……
这次还一并做了STM32F103的小板。因为Cortex-M3和M0指令集差不多,程序改改就可以用了。当然IO设备寄存器操作不一样。点亮一个LED的程序:
.text
.equ GPIO_PortC, 0x40011000
.equ GPIOx_CRH, 0x04
.equ GPIOx_ODR, 0x0c
.equ RCC_BASE, 0x40021000
.equ RCC_APB2ENR, 0x18
.org 0x0
.long 0x20002000
.long 0x080001d1
.org 0x1d0
init:
ldr r0, =RCC_BASE
mov r2, #RCC_APB2ENR
mov r1, #0x10
str r1,
ldr r0, =GPIO_PortC
mov r2, #GPIOx_CRH
ldr r1, =0x44144444
str r1,
mov r2, #GPIOx_ODR
ldr r1, =0x2000
mov r3, #0
mov r7, #0
ldr r5, =2048
chg0:
str r1,
.syntax unified
loop:
subs r7, r5
beq chg
b loop
chg:
str r3,
loop2:
subs r7, r5
beq chg0
b loop2
.end
STM32的器件比较便宜,片上资源丰富,应该比较好玩!
最近都在用STM32:victory: 我现在专攻STM32F407。 买了两块STM32的简单的板子,点亮了数码管之后就没怎么动。 都是高手啊,我还在8位的门口转呢。听说arm都是玩编程。程序不熟练之前,还是不去接触了 我还是喜欢AVR 只玩容易洞洞板焊接的{:3_65:}
页:
[1]