矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 4696|回复: 6

Hello, ARM

[复制链接]
     
发表于 2012-2-28 14:27:48 | 显示全部楼层 |阅读模式
"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,[r0]
        ldr r1, =0x00180000
        ldr r0, =FIODIR
        str r1,[r0]

        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,[r2]
        bl delay
        str r1,[r0]
        bl delay
        subs r4, r4, #1
        bne bln1
        
        rsb r4, r6, #11
bln2:
        str r3,[r2]
        bl delay
        str r3,[r0]
        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, [r0, #IOCON_PIO2_6]
    str r2, [r0, #IOCON_PIO2_8]

    ldr r0, =GPIO2_BASE
    ldr r1, =GPIOnDIR
    ldr r2, =0x140
    str r2, [r0, r1]

    mov r7, #0
    ldr r5, =8192

    ldr r1, =GPIOnDATA
    mov r2, #0x40
    lsl r3, r2, #2

chg0:
    str r2, [r0, r1]

.syntax unified

loop:
    subs r7, r5
    beq chg
    b loop
chg:
    str r3, [r0, r1]

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, [r0, r2]

    ldr r0, =GPIO_PortC
    mov r2, #GPIOx_CRH
    ldr r1, =0x44144444
    str r1, [r0, r2]
    mov r2, #GPIOx_ODR

    ldr r1, =0x2000
    mov r3, #0

    mov r7, #0
    ldr r5, =2048

chg0:
    str r1, [r0, r2]

.syntax unified
loop:
    subs r7, r5
    beq chg
    b loop
chg:
    str r3, [r0, r2]

loop2:
    subs r7, r5
    beq chg0
    b loop2

.end

STM32的器件比较便宜,片上资源丰富,应该比较好玩!
stm32.jpg

评分

1

查看全部评分

     
发表于 2012-2-29 12:41:01 | 显示全部楼层
最近都在用STM32
回复 支持 反对

使用道具 举报

     
发表于 2012-2-29 14:34:24 | 显示全部楼层
我现在专攻STM32F407。
回复 支持 反对

使用道具 举报

     
发表于 2012-3-1 17:07:23 | 显示全部楼层
买了两块STM32的简单的板子,点亮了数码管之后就没怎么动。
回复 支持 反对

使用道具 举报

     
发表于 2012-3-2 00:01:21 | 显示全部楼层
都是高手啊,我还在8位的门口转呢。听说arm都是玩编程。程序不熟练之前,还是不去接触了
回复 支持 反对

使用道具 举报

发表于 2012-3-2 20:14:09 | 显示全部楼层
我还是喜欢AVR
回复 支持 反对

使用道具 举报

     
发表于 2012-3-4 22:36:10 | 显示全部楼层
只玩容易洞洞板焊接的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-4-28 20:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表