d3b7 发表于 2012-2-28 14:27:48

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的器件比较便宜,片上资源丰富,应该比较好玩!

蓝绿黄 发表于 2012-2-29 12:41:01

最近都在用STM32:victory:

Paktu 发表于 2012-2-29 14:34:24

我现在专攻STM32F407。

清风无痕 发表于 2012-3-1 17:07:23

买了两块STM32的简单的板子,点亮了数码管之后就没怎么动。

fwgman 发表于 2012-3-2 00:01:21

都是高手啊,我还在8位的门口转呢。听说arm都是玩编程。程序不熟练之前,还是不去接触了

zxase258 发表于 2012-3-2 20:14:09

我还是喜欢AVR

Yangzai 发表于 2012-3-4 22:36:10

只玩容易洞洞板焊接的{:3_65:}
页: [1]
查看完整版本: Hello, ARM