楽天市場
[無料でホームページを作成] [通報・削除依頼]

番外 LPC810でアセンブラ

LPC810(ARM Cortex-M0+)が安く出回っているので、早速入手してCortex-M0+のアセンブラプログラムを試してみました。

開発環境:トラ技ARMライタ+LPCXpresso IDE

LPC810_CodeBase(https://github.com/microbuilder/LPC810_CodeBase)のCプログラムソースを参考に、
LEDのブリンキングとシリアルエコーのプログラムをオールアセンブラで作成しました。

[LPC810_CodeBaseからの変更点]
1.LPC810_CodeBase同様LPCXpresso IDE のCプロジェクトを使用していますが、main.cの替わりにmain.sをコンパイルします。
2.Cで使用するDATAとBBSのセクションを使用しません。使用するのはTEXTセクションのみ。
3.Cで使用するスタートアップルーチンを使用しません。この場合LPC810のメインクロックは(初期値の)内部RC発信12MHzになります。


[テスト回路]
SWDやUARTを用いた書き込み用の結線は割愛しています。
img_20140307-003422.jpg


LEDのブリンキングプログラムはこんな感じです。ブリンキング周期はr0 = 0x00200000の値で調節します。

[main.s]
     .syntax unified
     .cpu cortex-m0
     .align    2
     .thumb
     .thumb_func

    .section .isr_vector        @Vector table definition

    .long    0x10000400      @ 0000:StackTop
    .long    1+main             @ 0004:Reset_Handler
    .
    .
     .long    1+main            @ 00BC:PININT7_IRQHandler

.text

.equ    LED    ,1                 @ LED = PORT0,1


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@    Blink LED on PORT0,1 use(r0,r1,r6,r7)
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

main:

    movs    r1,#(1<<LED)     @r1 = (1<<LED)
    adr       r6,table              @r6 = table_top

    movs    r0,#DIR0             @r7 = DIR0
    ldr       r7,[r6,r0]
    ldr       r0,[r7,#0]            @DIR0 |= (1<<LED)
    orrs      r0,r0,r1
    str        r0,[r7,#0]

    movs    r0,#NOT0            @r7 = NOT0
    ldr        r7,[r6,r0]

loop:
    str        r1,[r7,#0]            @Toggle (1<<LED)
delay:
    movs    r0,#0x20              @r0 = 0x00200000
    lsls       r0,r0,#16
dloop:
    subs     r0,r0,#0x01
    bne      dloop

    b          loop

     .align    4

table:
.equ    DIR0    ,0x00
    .long    0xA0002000    @+00:Direction Registers port 0
.equ    NOT0    ,0x04
    .long    0xA0002300    @+04:GPIO toggle port 0 register


[HEX]
:1000000000040010C1000000C1000000C100000099
:1000100000000000000000000000000000000000E0
:10002000000000000000000000000000C10000000F
:100030000000000000000000C1000000C10000003E
:10004000C1000000C100000000000000C10000006D
:10005000C1000000C100000000000000000000001E
:10006000C1000000C1000000C1000000C10000008C
:10007000C1000000C100000000000000C10000003D
:100080000000000000000000000000000000000070
:100090000000000000000000000000000000000060
:1000A000C1000000C1000000C1000000C10000004C
:1000B000C1000000C1000000C1000000C10000003C
:1000C000022107A60020375838680843386004200A
:1000D00037583960202000040138FDD1F9E7C046C7
:1000E000002000A0002300A0C046C046C046C04675
:00000001FF



LPC810はPICやAVRのように割り込みベクターテーブル(0x00~0xBF)の一部にプログラムコードを記述することができません。

またLPC810はRISCのプロセッサなので、thumb命令で記述してもソースコードが冗長になる傾向があります。
試しにPIC16FのプログラムをLPC810に移植してみたところ、PICで0x400ワード位のプログラムがLPC810ではthumb命令で0x700ワード位になりました。


ソース一式のダウンロード先

Bequest333のページ(別館)

http://hp.vector.co.jp/authors/VA058115/

https://drive.google.com/file/d/1CuCbSCIeWAf_ezVexhqzuedNgfaaOAeP/view?usp=drivesdk

ダウンロードしたZIPファイルは圧縮プロジェクトとしてLPCXpressoからインポートすることが可能です。

























.