create every day - 福野泰介の一日一創

マシン語で作る!75円のかわいいARMマイコン、LPC810用エルチカプログラム

2017/11/28 23:55:00
#lpc810 #maker #asm 

小さくても立派な32bit ARM Cortex-M0+のCPU、NXP社製、LPC810、75円 @marutsu
最大動作周波数30MHz、秒間3000万回計算してくれます!

本ブログでも、暗闇で自転車を探すフラッシュライトにしてみたり、おもちゃに音を組み込んだりクリスマス手作りプレゼントや、PCGサウンドライブラリSoundCortexをつかってIchigoJamから三和音鳴らしたりと、活躍。

このかわいいマイコンLPC810をIchigoJamでクロスプロットフォーム開発できる環境を目指し、BASIC風表記なアセンブリ言語 asm15 で、まずは基本にして、コンピューター制御の本質、LEDをチカチカさせる「エルチカ」プログラムをつくってみます。

エルチカは、2ステップあります。まずは、LEDを光らせること。そして、思い通りの時間待たせること。

LPC810のピンをこのように並びで使います。

RESETLPC810RXD
TXDGND
PIO0_33.3V
PIO0_2ISP

LPC1114と同様、電源を入れた時や、RESETがGNDから復帰した際、ISPがGNDになっていると書き込みモードになり、RXD/TXDをつかって、USBシリアルとソフト(FlashMagicやlpc21ispなど)で書き込みます。


ちょっと横着して、PIO0_2にLEDの長い方、PIO0_3に短い方を差し込んでテストします。

DATA L #10000400 ' stack top DATA L #21 ' entry point DATA L 0,0,0,0,0 DATA L #EFFFFBDF ' VALID_CODE = 0x100000000-0x10000400-0x21 @ENTRY R0=[@SYSAHBCLKCTRL]L R1=#DF 'SWT, GPIO, I2C:off, FLASH, FLASHREG, RAM, ROM, SYS [R0]L=R1 R0=[@PINENABLE0]L R1=[@PINENABLE0_DATA]L [R0]L=R1 R0=[@GPIO_DIR0]L R1=`1100 ' PIO0_2 and PIO0_3 [R0]L=R1 R0=[@GPIO_B0]L R1=1 [R0+2]=R1 GOTO 0 @SYSAHBCLKCTRL DATA L #40048080 @PINENABLE0 DATA L #4000C1C0 @PINENABLE0_DATA DATA L #FFFFFFBF @GPIO_DIR0 DATA L #A0002000 @GPIO_B0 DATA L #A0000000

LPC1114はCortex-M0、LPC810はCortex-M0+とマシン語はほぼ一緒ですが、IOの扱い方が違います。
1. LPC810のRAMは#10000000からの1KBなので、スタック初期値を#10000400に設定
2. 書き込みチェック用コードの次、#21にプログラム本体をおく
3. SYSAHBCLKCTRLで、GPIO、SWT(スイッチマトリクス、IOを切り替えるモノ)を設定
4. PINENABLE0で、PIO0_2/PIO0_3をGPIOとして使うよう設定
5. GPIO_DIR0で、PIO0_2/PIO0_3を出力に切り替え
6. GPIO_B0で、PIO0_2に1を書き込むと光る!
7. そのまま実行を続けてしまわなないように GOTO 0 で停止させておく

asm15で、Start Addressを0に設定、「hex file」出力を選択し、USBシリアルで書き込みます。
*3はスキップしても大丈夫でしたが、念のため。(参考、LPC1114の場合

次に、IchigoJam BASICでいう、WAITコマンドを実現して、0.5秒ごとについたり消えたりさせます。

DATA L #10000400 ' stack DATA L #21 ' entry point DATA L 0,0,0,0,0 DATA L #EFFFFBDF ' VALID_CODE = 0x100000000-0x10000400-0x21 @ENTRY R0=[@SYSAHBCLKCTRL]L R1=#DF 'SWT, GPIO, I2C:off, FLASH, FLASHREG, RAM, ROM, SYS [R0]L=R1 R0=[@FLASHCFG]L R1=[R0]L R2=3 ' set 0b00 == no wait R2=~R2 R1&=R2 [R0]L=R1 R0=[@PINENABLE0]L R1=[@PINENABLE0_DATA]L [R0]L=R1 R0=[@GPIO_DIR0]L R1=`1100 ' PIO0_2 and PIO0_3 [R0]L=R1 R0=[@GPIO_NOT0]L R1=`100 ' PIO0_2 R2=[@WAIT_N]L @LOOP [R0]=R1 ' 1cycle single cycle I/O R3=R2 ' 1cycle R3-=1 ' 1cycle IF !0 GOTO -1 'wait R3*3+2 cycles GOTO @LOOP ' 2cycles @SYSAHBCLKCTRL DATA L #40048080 @FLASHCFG DATA L #40040010 @PINENABLE0 DATA L #4000C1C0 @PINENABLE0_DATA DATA L #FFFFFFBF @GPIO_DIR0 DATA L #A0002000 @GPIO_NOT0 DATA L #A0002300 @WAIT_N DATA L 2000000

Cortex-M0+は、Cortex-M0と比較しGPIOアクセスや、GOTOのサイクルが短くなっています。(2→1、3→2、詳細はマニュアル参照

起動時の動作クロックは、内蔵オシレーターの12MHz。ウェイト用の1ループにかかる時間は3cycles。よって、12M/3で400万回ループで1秒。0.5秒のウェイトのために、WAIT_Nに200万を設定すればOK!

GPIO_NOT0という指定したビットに対応するIOを反転させるという便利な機能をつかって、エルチカループ(LOOP)をつくります。

注意点は、FLASHCFGの設定でウェイトを外しておくこと。 初期状態ではFlash ROMへのアクセスにウェイトがついているため、思ったより遅い点滅に悩みました。


2.54mmピッチではんだづけ工作にも優しい、8ピンDIPパッケージ(Dual inline package)のLPC810は、マシン語でさくっと遊べちゃうところもかわいい!

ARMマシン語に興味もった方、「はじめてのマシン語 - IchigoJamではじめるARMマシン語」をどうぞ!

links
- [PDF]UM10601 LPC81x User manual - NXP Semiconductors
- LPCマイコン情報:LPC800 Cortex-M0+搭載-スイッチ・マトリックス,LPC824,LPC822,LPC810,LPC811,LPC812,LPC810M021FN8,LPC824M201,LPC822M101,LPC811M001,LPC812M101

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image