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

150枚限定、IchigoJam - jig.jp 15th anniversary edition

2018/06/04
#IchigoJam #jig 

IchigoJam、jig.jp 15周年記念版!

"Hello World!" に替わる、プログラミングの世界への新しい入口、"LED1"


すっきりした基板!ピン名称が読みやすい!


LPC1114FDH28をはんだづけ。フラックスを使うと意外といけます。


あとは、いつものように、サクサク楽しくはんだづけ!


改良版基板を先取り!ピンソケットまわりが広がっていて、はんだづけしやすい。


電源スイッチが強化され、microUSBの足を曲げずにはんだづけもできるようになってます。


カラーリングはお好みでどうぞ。

すべてのこどもたちへ、プログラミングを!
学生も、おとなも、シニアの方も!

links
- IchigoJam
- jig.jp夏のインターン鯖江で働くエンジニア、共に募集中です!)

IoTネコライフ、ネコゴハンマシン改修とIchigoJam組み込みテクニック

2018/05/20
#IchigoJam #maker 

我が家のネコエサイノベーション、初代はシンプルなカウンター、二代目はぴったり時刻に開くマシン
プリンの箱のまま、1年近く問題なく稼働してましたが、ついにケースに収まりました。

隙間に、DIP化されたLPC1114のマイコンモジュール(350円)を使って収めます。

ソレノイドを動かすための巨大な大きなコンデンサ(6800uF 10V)は、元のマシンから拝借。作動時に電圧が大きく下がってしまうため、制御部分との電源共有化は断念、電源ケーブルは2本出しとなりました。

ソレノイドを動かすためのリレー。リレーを駆動するMOSFET、MOSFETを制御するIchigoJamからのマイコン信号。小さな電気信号を少しずつ大きな力に変えています。

リアルタイムクロック(RCT)モジュールをI2Cで接続できるように配線も合わせてユニバーサル基板に実装が意外と配線が多い!このくらいの規模でも、Upverterで作って基板頼んだ方が効率は良さそう。でも、その場でガシガシはんだづけして作る楽しさは格別。


マイコンモジュールを使った注意点としては、左右の電源とGNDをジャンパ線でつないでおくこと。電圧差が発生し、うまく自動起動しない状態になりました。

SLEEPコマンドを使う場合、BTNピンを1MΩでプルアップするのを忘れずに!自動起動前提で使う場合は、BTNをGND接続でOKです。シリアル接続でESCキーコード送信でメンテナンス可!

あとはシリアルで接続して、IchigoJamを書き込み、プログラムを流し込んでできあがり。

10 LET[10],700,1200,1700,2000,2300:C=5 20 GSB@GETHM:A=0 30 IF N>[10+A] ?N,[10+A]:A=A+1:IF A=C A=0:GSB@WAITM:ELSE CONT 50 @LOOP 60 GSB@GETHM:CLS:?" NOW:";N:?"NEXT:";[10+A] 70 IF N>=[10+A] ?"GOHAN!":GSB@MOVE:WAIT60:A=(A+1)%C:IF !A GSB@WAITM 80 WAIT 60*10:GOTO@LOOP 90 @WAITM:GSB@GETHM:CLS:?" NOW:";N:?"WAIT TOMORROW":IF !N RTN ELSE WAIT60*30:CONT 100 @MOVE:WAIT1:OUT1:WAIT1:OUT0:RTN 200 @GETTIME 210 IF I2CR(#68,0,#700,7) ERR 220 FOR I=0 TO 6:[I]=PEEK(#706-I):[I]=[I]>>4*10+[I]&15:NEXT:RTN 240 @GETHM:GSB@GETTIME:N=[4]*100+[5]:RTN

ACアダプター動作させるので、省電力化しないメンテナンス性と応答性重視のコード。
10行で、7時、12時、17時、20時、23時の1日5回動作するよう設定してます。


時刻設定をいつでも変えられるように、シリアル通信ポートも外に引き出すことにしました。これで、箱を開ける手間なく、設定変更できます。


こちらが元の、IchigoJam完成版をそのまま使ったネコゴハンマシン。1台、回収できました。

他、ネコ関係、外出先からの確認に便利なネコIoTとして、ネコトイレIoTと、IO-DATAの「Qwatch」が活躍中!

ICTで良いネコライフを!

変換基板到着! IchigoJam for STM32 でも動くArmマシン語3x3キャラ描画

2018/02/21
#IchigoJam #stm #KidsIT #asm 

注文していたプリント基板(PCB)が到着、動きました!

IchigoJam for STM32
LEDをつけるけすはもちろん、IchigoJam BASICのツールやゲームはそのまま動作。
Armマシン語も、仮想RAMしか使わないものならそのまま動きます!
第3回こどもプログラミングサミット」のIchigoJamワークショップにて初お披露目!

つくりかた手順
1. 変換基板を入手(PCB発注など)
2. テスターで変換基板の回路パターンを確認(電源とGNDがショートしていないかなど)
3. CPU、STM32F030K6T6をはんだづけ(0.8mmピッチなのでLPC1114FDH28より少し簡単)
* 秋月電子で入手可能なSTM32F042K6T6でもOK
4. CPUを実装していないIchigoJamを準備(IchigoJam 完全組立キットTなど)
5. 変換基板をCPUとして接続(ピンヘッダーではんだづけや、抜き差しできるようになどお好みで)
6. USBシリアルを使い、STM用のファームウェア、IchigoJam BASICをstm32writerを使って書き込みます
* ファームウェアはIchigoJam-FANにてβ公開予定、書き込み時に接続待ちがでた場合、RESETピンを一瞬GNDに

変換基板とSTM32F030K6T6。

ミニテクニック
IchigoJam BASIC、GOTOを使わないFORコマンドを使ったエルチカ無限ループ。

FOR I=0 TO 1 STEP 0:LED A:WAIT10:A=1-A:NEXT

キャラクター9つで3x3サイズの大きなキャラとして表示する、Armマシン語。
配列の先頭2つで座標を指定して、9文字分の文字列を渡すと表示します。

10 POKE#700,8,68,8,35,27,2,11,68,26,136,89,136,128,51,128,51,19,68,73,1,11,68,3,33,2,120,26,112,66,120,90,112,130,120,154,112,3,48,32,51,1,57,245,209,112,71 20 LET[0],RND(30),RND(20):U=USR(#700,"ABCDEFGHI") 30 GOTO 20

asm15でアセンブルできるプログラムはこちら
(R1を使った仮想メモリアドレスを物理メモリアドレスへ変換がポイント)

R0+=R1 R3=8 R3=R3<<8 R3+=R1 R2=[R3]W ' [0]=X R1=[R3+1]W ' [1]=Y R3+=128 R3+=128 R3+=R2 R1=R1<<5 R3+=R1 R1=3 @LOOP R2=[R0] [R3]=R2 R2=[R0+1] [R3+1]=R2 R2=[R0+2] [R3+2]=R2 R0+=3 R3+=32 R1-=1 IF !0 GOTO @LOOP RET

高速化したい時、メインループの一番内側から順にマシン語化してみましょう
Armマシン語入門

Armマシン語でライフゲーム - IchigoJamとRaspberry Pi用IchigoJam RPi(beta)で動く!

2018/01/28
#arm #IchigoJam #rasppi 

1995年のMSX-FANで出会ってから、シンプルな法則から生まれる多彩な結果に魅了されたライフゲーム。
一日一創でも、広大なライフゲームチェックボックスでつくったもの光の3原色をレイヤー表示したものなど作ってました。

IchigoJam BASICでも、10x10くらいなら配列を使ったプログラミングの練習にもちょうどいい感じでできます。
シミュレーション入門 / こどもパソコン IchigoJam でつくるライフゲーム
IchigoJam でも IchigoJam RPi(1.2b16以降) でも同じプログラムで動きます!

IchigoJam-FANにて、紹介あったArmマシン語でサクサク全画面で動くライフゲーム!
IchigoJam RPi vs LPC1114 マシン語ルーチンで動作違いを確認(戻り値の動き)
asm15 assembly表記にしてみました。

こちらちょうど1kbyte(=1024byte)になったライフゲームプログラム。(ベースプログラム by KubotaProject

1 'L-GAME 10 POKE#7D0,240,181,132,70,0,32,0,35,0,36,37,0,0,38,45,66,6,208,1,45,4,208,2,45,2,208,3,61,1,54,246,231,66,9,87,1,199,27,2,180 20 POKE#7F8,0,33,18,66,4,209,54,66,9,209,23,33,73,1,6,224,22,42,4,209,2,46,2,209,23,33,73,1,73,66,63,66,3,209,45,66,6,209,32,49 30 POKE#820,4,224,31,47,2,209,2,45,0,209,32,57,10,0,2,188,23,24,127,25,32,37,110,67,191,25,33,63,9,34,18,2,191,24,125,92,101,69,0,209 40 POKE#848,1,51,1,52,9,44,196,209,143,36,36,1,100,90,198,8,247,0,199,27,53,25,7,38,246,27,111,92,132,24,1,34,178,64,102,92,102,69,7,209 50 POKE#870,3,43,9,208,4,43,7,208,255,36,98,64,23,64,2,224,3,43,1,209,23,67,111,84,64,28,66,9,23,42,162,209,0,224,132,70,0,32,9,34 60 POKE#898,18,2,143,35,27,1,91,90,0,36,230,8,247,0,231,27,245,24,7,38,246,27,111,92,247,64,1,37,47,64,165,24,1,47,1,209,64,28,103,70 70 POKE#8C0,111,84,100,28,101,9,23,45,235,209,240,189 100 CLS:S=#700:W=0:FORI=0TO95:POKES+I,0:NEXT 110 FORI=0TO255:G=RND(736):M=G/8+S:F=7-G%8:R=PEEK(M):R=R|1<<F:POKEM,R:NEXT 120 WAIT3:LC0,23:?DEC$(USR(#7D0,#ED),5);:CONT

#700からのメモリに1マス1bitの生命データを置き、USRのマシン語読み出しで1世代進めています。
asm15形式にした、Armマシン語プログラムはこちら。(ベースプログラム by KubotaProject

' LIFE GAME - START ADDRESS #7D0 PUSH {LR,R4-R7} R12=R0 R0=0 @LP0 R3=0 R4=0 @LP1 R5=R4<<0 R6=0 @LP2 R5&R5 IF 0 GOTO @JP1 R5-1 IF 0 GOTO @JP1 R5-2 IF 0 GOTO @JP1 R5-=3 R6+=1 GOTO @LP2 @JP1 R2=R0>>5 R7=R2<<5 R7=R0-R7 PUSH {R1} R1=0 @TOP R2&R2 IF !0 GOTO @BOTTOM R6&R6 IF !0 GOTO @LEFT R1=23 R1=R1<<5 GOTO @LEFT @BOTTOM R2-22 IF !0 GOTO @LEFT R6-2 IF !0 GOTO @LEFT R1=23 R1=R1<<5 R1=-R1 @LEFT R7&R7 IF !0 GOTO @RIGHT R5&R5 IF !0 GOTO @JP5 R1+=32 GOTO @JP5 @RIGHT R7-31 IF !0 GOTO @JP5 R5-2 IF !0 GOTO @JP5 R1-=32 @JP5 R2=R1<<0 POP {R1} R7=R2+R0 R7=R7+R5 R5=#20 R6*=R5 R7=R7+R6 R7-=#21 R2=9 R2=R2<<8 R7=R7+R2 R5=[R7+R1] R5-R12 IF !0 GOTO @JP2 R3+=1 @JP2 R4+=1 R4-9 IF !0 GOTO @LP1 @PREP R4=143 R4=R4<<4 R4=[R4+R1]W R6=R0>>3 R7=R6<<3 R7=R0-R7 R5=R6+R4 R6=7 R6=R6-R7 R7=[R5+R1] R4=R0+R2 R2=1 R2<<=R6 @JUDGE R6=[R4+R1] R6-R12 IF !0 GOTO @JPB R3-3 IF 0 GOTO @JP3 R3-4 IF 0 GOTO @JP3 @DEATH R4=#FF R2^=R4 R7&=R2 GOTO @JPMEM @JPB R3-3 IF !0 GOTO @JP3 R7|=R2 @JPMEM [R5+R1]=R7 @JP3 R0=R0+1 R2=R0>>5 R2-23 IF !0 GOTO @LP0 GOTO @JPX2 @MEM2VRAM R12=R0 @JPX2 R0=0 R2=9 R2=R2<<8 R3=#8F R3=R3<<4 R3=[R3+R1]W R4=0 @LPX1 R6=R4>>3 R7=R6<<3 R7=R4-R7 R5=R6+R3 R6=7 R6=R6-R7 R7=[R5+R1] R7>>=R6 R5=1 R7&=R5 R5=R4+R2 R7-1 IF !0 GOTO @JPX1 R0=R0+1 R7=R12 @JPX1 [R5+R1]=R7 R4=R4+1 R5=R4>>5 R5-23 IF !0 GOTO @LPX1 POP {PC,R4-R7}

asm15 assemblerでアセンブルできます。

asm15 assemblerのアップデート
- R8からR15レジスタに未対応の一部命令を追加しました。
- レジスタに代入できるのは8bit/1byteの符号なし定数までなど、範囲制限のある数値で超える場合にエラーが出るようにしました。

IchigoJam、ラズパイ、スマホで動くArmマシン語、興味持った方はこちらからどうぞ!
はじめてのマシン語 - IchigoJamではじめるARMマシン語その1

My First Machine language - the simplest course of Arm machine language with IchigoJam step1

2018/01/25
#IchigoJam #KidsIT #Arm #rasppi #english 

Computers only know them binary machine language using just 0(off) and 1(on).
How do we make binary number sequence? It's depends on computers.


"RUN the Arm machine language on IchigoJam RPi after 1.2b16 (Raspberry Pi 2)"

The computer of IchigoJam understands 16 bit words (0 or 1 x 16).

0011000000000001

This machine language means to add 1 to R0 register. (resisters are kind of memories in the computer)

First 5 bit means "to add", next 3 bit means the resister number, last 8 bit means number to add.

00110 000 00000001

Let's write to RAM using POKE command of IchigoJam BASIC. (*IchigoJam BASIC reference ver 1.2)

POKE#700,`00000001,`00110000

#700 is position of RAM. Number starts with ` means binary number. (# for hexadecimal number)
To write last 8 bit in the first is a rule of this computer. (little-endian)

You need an other machine language word to work, "return" to IchigoJam BASIC.

0100011101110000

Write this word to RAM in the same way.

POKE#702,`01110000,`01000111

You are ready to run!

?USR(#700,1)

Did you get a number 2 as a right result?

USR command needs an start address of the machine languages and a number as a parameter.
Please check using 100 as a parameter.

?USR(#700,100)

Try to make to add 5 program using the machine language.

POKE#700,5 ?USR(#700,100)

You did it!

Speed is the greatest advantage of using the machine language.
The disadvantage is wrong machine language program doesn't protect your system.
So, please save before run if you make long program with machine language.

IchigoJam will stop if you write wrong machine languages.
Try to freeze your IchigoJam.

?USR(#704,0)

Computers work with some machine language words such them.
CPU of IchigoJam (LPC1114 Arm Cortex-M0) knows only 56 words Arm Thumb machine language.
It's very simple to understand!

If you use IchigoJam RPi after 1.2b16 (Raspberry Pi2/3 Arm Cortex-A7/A53), it knows more words.

It's a sample code to use SIMD(single instruction multiple data) machine language.
QADD8 can calculate 4 number as parallel during just 1 CPU cycle.

POKE#700,#80,#FA,#10,#F0,#70,#47 ?HEX$(USR(#700,#1234)) 2468

*It can calculate 8bit x 4 numbers but variables of IchigoJam BASIC are 16bit.

To be continued!

references
- Cortex-M0 Technical Reference Manual - Instruction set summary / ARM Information Center
- Cortex-A7 MPCore Technical Reference Manual - About the programmers model / ARM Information Center

links (now in Japanese)
- asm15 - simple Arm assembly language and machine language table
- asm15 assembler for IchigoJam
- series of "My First Arm Assembly language"

IchigoJamが音痴な理由と対処法、STM32F0版IchigoJamは音痴が解消する見込み

2018/01/04
#IchigoJam #stm32 #maker 

IchigoJamには懐かしのBEEP音とPLAY文によるMML演奏が可能です。
ただ訳あってちょっと音痴です。

音痴な理由、2つ

1. 標準で付属しているサウンダーの周波数特性
音楽再生用じゃないので、与えた周波数通りには鳴りません。
別途エイリアンスピーカーなどに接続することである程度解消されます。

2. 元々音痴で鳴らしている
標準のオクターブ(O4)で、ドのシャープで1.2%、ファで2.2%ずれています。
ディスプレイ表示用の水平同期信号を最低周期として使っているために、ちょうどいい周波数になっていないのです。
PWMコマンドやマシン語を使って、目的の周波数に合わせて鳴らすことで一応対策可能ですが、PanCakeや、FM音源や、MIDIなどでいい音につなぐのもいいですよ!

開発中のSTM32F0版IchigoJamでは、タイマーが豊富なので、PLAY文用にタイマーが使える見込みです!

きれいな440Hzが鳴っています!音域も低音O1から超音波に突入するO9まで拡げられそう。
LPC1114のハードウェア(CPU)によるタイマーはディスプレイ表示、2つはサーボ制御用PWMを優先させ、音痴で妥協していましたが、念願の音痴解消!?(ただし、理由1対策に、いいスピーカーは必要です)

音は波。
昔、MSXturboR標準ソフトで、音声を録音して、波形を見ていろいろいじって楽しかったことを思い出します。
音の正体とプログラム作曲 / はじめてのプログラミングその8

links
- IchigoJam電子工作パーツセット エイリアンスピーカー / ASP-JamP

だいたい動いたSTM32F0版IchigoJam、画面&キーボード可能バージョンβ

2018/01/03
#IchigoJam #stm32 #maker 

シリアルで動いたSTM32F0版IchigoJam、NTSC信号を作成し、SPIで受け取るPS/2キーボード入力部分を作って、IchigoJamっぽくなりました!

CPUを実装していないIchigoJam T基板につないで、起動からLEDチカチカ、かわくだりゲームの読み込み、保存までを動画にしてみました。 ベンチマークしてみたところ、LPC1114版とほぼ同速度でした。

LPC1114と違って、1KBずつファイルが書き込めるので、今まで同様4ファイル保存するとして、4KB増の28KBまでOSで使えます! アナログが豊富にあったり、タイマーがたくさん使えたりするので、いろいろできなかったこともできるかも。(参考、LPC1114での4ファイル保存


開発中、たいへん役だってくれたオシロスコープくん。電子工作のデバッグに便利です!

STM32F0版IchigoJam、シリアル通信バージョンβ

2018/01/02
#IchigoJam #stm32 #asm #maker 

お気に入りCPU、Arm Cortex-M0NXP社製LPC1114シリーズと同じクラス、STMicroelectronics社製STM32F0シリーズでIchigoJamが動きました!


シリアル通信でIchigoJamを便利に使える、IJUtilitiesを使うとスクリーンを使ったゲームも動かせます!


今回は、秋月電子で手に入るSTM32F042K6T6へ書き込んだら、そのままシリアル通信で使えます。 (Nucleoにbinファイル書き込みでも動くかもしれません)

I/Oは、まだLED(PB3とPA7)のみ使えます。他、配置と機能、検討中です。

同じArmなので、USRコマンドを使ったマシン語はそのままで動きます!
ハンドアセンブルで超速計算! - IchigoJamではじめるArmマシン語その2
I/Oを使うマシン語は、LPC1114とSTM32F0、I/Oのメモリマップが違う点に注意です。

ターゲットにしている、STM32F030K6T6TRは、LPC1114と同じ48MHz/Flash32KB/RAM4KBで、1コ175円、12,000コ買えば1つあたりなんと74円

STM32で始めるC言語」で紹介した上級者向けミニマム開発環境サンプルも拡充
(GPIO/Clock変更/UART/割り込み/TIM/SPI/Flash書き込み)

ちっちゃいコンピューターをプログラミングで味方に付け、身の回りをどんどん便利にしちゃいましょう!

STM32で始めるC言語、アセンブリ言語と比べてみよう

2017/12/30
#stm32 #asm 

Mbed対応のSTM32の開発環境Nucleoでマシン語でエルチカに成功したので、次はいろいろ製品化を見越して、CPUそのままを使って作ってみます。


今回使用したのは、秋月で売っている一番安いSTM32、STM32F042K6T6です。
Arm Cortex-M0 48MHz, Flash32KB, SRAM6KB, LQFP32
LQFP32に対応するDIP化基板へはんだづけ!
0.8mmピッチなので、0.65mmピッチ28ピンのLPC1114FDH28のはんだづけより簡単です。


USBシリアルを使って書き込みます。LEDとUSBシリアルとの接続の仕方はつぎの通り。
VDDA、VDDIO2にも電源供給が必要です。BOOT0をHIGHにすることで、書き込みモードになります。
RTSが使えない場合は、リセットする際、手でジャンパー線をGNDにつなぐか、タクトスイッチをつけましょう。

3.3VVDD 1STM32F032 VSSGND
OSC_IN 231 BOOT03.3V
OSC_OUT 330 PB7
RTSNRST 429 PB6
3.3VVDDA 528 PB5
PA0 627 PB4
PA1 726 PB3
PA2 825 PA15
PA3 924 PA14
PA4 1023 PA13
PA5 1122 PA12
PA6 1221 PA11
PA7 1320 PA10TXD
PB0 1419 PA9RXD
LEDPB1 1518 PA8
GNDVSS 1617 VDDIO23.3V
USBシリアルの書き込みに、"STM32 FLASH Writer Program Using Python" stm32writerを使わせてもらいました。 stm32用プロジェクト一式をGitHub"my-first-stm32" からダウンロードし、マシン語のエルチカを書き込んでみましょう。(Mac用です。USBシリアルの設定は、makefile内を書き換えてください)

t0-asm$ make ../tools/stm32writer/stm32writer.py --port=/dev/tty.SLAB_USBtoUART --go "obj.mot" stm32writer (version: 20171231py) ...

うまくいけば書き込み終了後に自動的にエルチカが始まります。
書き込み終わっているので、USBシリアルを外して、BOOT0をGNDに接続し、3Vくらいにつなげばエルチカマシンのできあがりです!

アセンブリ言語でマシン語プログラムも楽しいですが、C言語で開発できるようにすると楽です。
例えば、48MHzへの切り替えの一部 (asm15 アセンブリ言語 from STM32エルチカ)

R0=[@RCC]L R3=R0+4 ' RCC_CFGR R1=[R3]L R2=`1111 R2=R2<<18 R2=~R2 R1&=R2 R2=4 ' PLLMUL6 R2=R2&lt;<18 R1|=R2 [R3]L=R1

これがC言語だと1行で書けます!

RCC->CFGR = (RCC->CFGR & ~(0b1111 << 18)) | (4 << 18);

t1-led-blinkがC言語でのエルチカ、t2-clockがクロックを48MHzに変更と、stm32の取説に合わせて必要最小限のプログラムになっているので、C言語の雰囲気をつかむのにのぞいてみてください。

t2-usartではstm32とのシリアル通信が一応できていますが、どうも内蔵クロックの精度が悪く計算上の値とは5%ほどずれてしまう点と、切り替えるべきAF(Alternate Function)の番号がstmのシリーズによって違う点が注意です。

STM32F0シリーズの取説は、日本語版もあって親切丁寧です!
参考資料 RM0091 リファレンスマニュアル STM32F0x1/STM32F0x2/STM32F0x8 advanced ARM-based 32bit MCUs

コンピューターをフル活用できる、マシン語とC言語の世界もぜひどうぞ!

BASICでプログラムの楽しさを知り
マシン語でコンピューターを知り
C言語でツールの便利さを知る
かつての王道、今でも通じる!?

links
- taisukef/my-first-stm32: first step of STM32F0
- IchigoJamではじめるArmマシン語

STM32はじめのいっぽ、64byteでつくるエルチカ1Hz Armマシン語

2017/12/24
#Arm #stm32 

CPUアーキテクチャとしてArmを採用しているメーカーはたくさんあるので、Armマシン語を覚えたらいろいろと応用できます。 今回コントロールするマイコンは、STマイクロエレクトロニクスSTM32F031K6です!


実は古い、STM32との出会い。マイコンに興味を持ち始めた4年前、開発環境が1,000円とあまりに安かったでひとまず買ってWindowsでデモのエルチカを見るも、Macでの開発環境が見つからずお蔵入り。 その後、書籍「組み合わせ自在!超小型ARMマイコン基板」をきっかけにNXP社のDIP版LPC1114に出会ったできた、IchigoJam

IchigoJamでマイコン開発で使っているDIP版LPC810も残念ながら生産終了なので、メーカー問わずマイコン探しをしている中での再会です!

ひとまず一番小さいSTM32F0シリーズのお手軽ボード「STM32 Nucleo Board STM32F031K6」で実験。 Arm Mbedに対応したUSBでPCに接続するとドライブとして認識して、binファイルをコピーするだけで書き込んでくれます。

LPC1114と同様、Arm Cortex-M0なので、基本は一緒。 親切な取説を見ながら、ひとまずミニマムなエルチカ(64byte)が完成! (参考、Cortex-M0 Armマシン語表(抜粋)

DATA L #20001000 ' stack top DATA L #08000009 ' entry point @ENTRY R0=[@RCC_AHBENR]L R1=[R0]L R2=1 R2=R2<<18 R1|=R2 [R0]L=R1 R0=[@GPIOB]L ' GPIOB_MODER R1=`01000000 [R0]L=R1 R0+=#14 ' GPIOB_ODR R1=`1000 R2=0 R3=[@WAIT_CNT]L @LOOP [R0]L=R1 R4=R3 R4-=1 IF !0 GOTO -1 [R0]L=R2 R4=R3 R4-=1 IF !0 GOTO -1 GOTO @LOOP @RCC_AHBENR DATA L #40021014 @GPIOB DATA L #48000400 @WAIT_CNT DATA L 1000000

RCC_AHBENRでGPIOを有効にする(省エネの基本は使う部品だけ有効に!)
GPIOB_MODERでGPIOを設定(Nucleoの取説より、PB3にオンボードLEDがつながっていることを確認)
GPIOB_ODRでGPIOに書き込む(メモリマップドI/Oなので、メモリに書き込むだけ)
空ループでWAIT(1ループ4clock、標準は8MHzなので、1Hzエルチカするには1万回でOK!)
* Flashは#08000000に置かれます。チェックサムがないので手抜きするとヘッダは8byteでOK!

asm15 Assemblyでstart address:0、hex fileにアセンブルして、objcopyでbinファイルを作って、コピーしてみましょう!

cat > obj.hex :1000000000100020090000080A480168012292043B :10001000114301600848402101601430082100228A :10002000064B01601C46013CFDD102601C46013CB0 :10003000FDD1F6E7141002400004004840420F00D2 :00000001FF arm-none-eabi-objcopy -I ihex --output-target=binary obj.hex obj.bin

定格いっぱいフルパワー48MHzでエルチカする方法はこちら

DATA L #20001000 ' stack top DATA L #08000009 ' entry point @ENTRY 'clock 48MHz R0=[@FLASH]L ' FLASH_ACR R1=[R0]L R2=`10001 ' 1<<4:enbale prefetch, 1 wait state R1|=R2 [R0]L=R1 R0=[@RCC]L R3=R0+4 ' RCC_CFGR R1=[R3]L R2=`1111 R2=R2<<18 R2=~R2 R1&=R2 R2=4 ' PLLMUL6 R2=R2<<18 R1|=R2 [R3]L=R1 R1=[R0]L ' RCC_CR R2=1 R2=R2<<24 ' PLLON R1|=R2 [R0]L=R1 R2=R2<<1 ' PLLRDY R1=[R0]L R1&R2 IF !0 GOTO -2 R1=[R3]L ' RCC_CFGR R2=2 ' PLL R1|=R2 [R3]L=R1 R2=12 R1=[R3]L R1&=R2 R1-8 ' 2<<2 == PLL IF !0 GOTO -3 ' init GPIO R0+=#14 'RCC_AHBENR R1=[R0]L R2=1 R2=R2<<18 R1|=R2 [R0]L=R1 R0=[@GPIOB]L ' GPIOB_MODER R1=`01000000 [R0]L=R1 R0+=#14 ' GPIOB_ODR R1=`1000 R2=0 R3=[@WAIT_CNT]L @LOOP [R0]L=R1 R4=R3 R4-=1 IF !0 GOTO -1 [R0]L=R2 R4=R3 R4-=1 IF !0 GOTO -1 GOTO @LOOP @FLASH DATA L #40022000 @RCC DATA L #40021000 @GPIOB DATA L #48000400 @WAIT_CNT DATA L 6000000

24MHzを超える場合はFlashアクセスにウェイトが必要です。ただプリフェッチバッファー4byteが3つあり、それを有効にしておくことで、速度はそこそこ保たれます。 PLLを有効にして、内蔵クロック8MHzを6倍にする設定をして、クロックを切り替えることで48MHz動作になります!エルチカも6倍速くなってしまうので、WAIT_CNTを6倍にして1Hzエルチカのできあがり!

次は、Nucleoの書き込み機能に頼らず、IchigoJamからマイコンへの書き込みに挑戦です!

links
- リファレンスマニュアル STM32F0x1/STM32F0x2/STM32F0x8 advanced ARM®-based 32-bit MCUs
- IchigoJamとLPC810でつくるLED点滅クリスマスアクセサリー
- はじめてのマシン語 - IchigoJamではじめるARMマシン語その1

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