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

変換基板到着! 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マシン語入門

CPUの安全、Arm Cortex-M0/M0+はセキュア機能が加わりCortex-M23に! Cortex-M3もはじめました

2018/01/07
#IoT #stm32 

PC(WindowsもMacも)、スマホ(iPhoneもAndroidも)、サーバー、これらコンピューターに共通して使われている部品、CPUに問題が見つかり、急ピッチで対策が進んでいます。

見つかったのは、アプリの安全な実行を司る部分のバグ。

CPUには、アプリ毎に実行権限を設定する機能があって、ネットワークからダウンロードしてきたアプリなどにむやみに大事なデータを見せたり、重要な設定を触らせないよう制限をかける機能があります。 その機能に穴があって、パスワードや個人情報など、読めてはいけないデータが読めてしまう可能性があるとのこと。
Googleが発見した「CPUの脆弱性」とは何なのか。ゲーマーに捧ぐ「正しく恐れる」その方法まとめ - 4Gamer.net

原因は、L1キャッシュというコンピューターが実行するプログラムを高速化のために一時的においておく機能。 CPUは、CPUの速度に対して遅いメモリ(RAM)から、使いそうなデータはまとめてとってきて机の上においておく的なことをやっています。 まとめてとってくる際、本来アクセスしちゃいけない領域のデータも含めて机の上におく仕組みが悪用できてしまったようです。

IchigoJamがCPUとして使っているArm Cortex-M0には、そもそもこういう保護機能がないのでバグの影響は受けません!
Why Raspberry Pi isn't vulnerable to Spectre or Meltdown - Raspberry Pi
ラズパイも影響は受けないと創始者、Eben Upton氏、本人によるブログ。

2016年末に発表され、チップの発売が楽しみな、Cortex-M0/M0+の後継、Cortex-M23には、限定的ながらこの種の保護機能が搭載されます。

ネットワークからソフトをダウンロードして実行できることで、より柔軟なIoTを設計できますね!

新アーキテクチャーに対しても開発慣れすべく、マイコン開発はじめに一番最初に買って挫折した、ST32VLDISCOVERYに再挑戦!

データシートとマニュアルをさらっと見て、stm32f0からstm32f1用にメモリマップを少し書き換え、プログラムをUSBシリアルで転送して、動作確認完了!

STM32VLDISCORVERYで使っているCPUは、STM32F100RBT6という、Cortex-M3 / Flash128KB / RAM8KB / 24MHz(!)というもの。 クロックの遅さに時代を感じますが、Flash128KBの大容量と、DAC搭載は魅力的。プログラムは my-first-stm32 on GitHub に置きました。

Cortex-M3/M4/M7を使った高速大容量処理も使えそう感がでてきて、ますますワクワクが広がりました。
Cortex-M3はハードウェアで除算や積和演算ができて、メモリ保護ユニット(MPU)も扱えます!
Armマシン語の入門は、Cortex-M0からどうぞ!

Cortex-M3/M4の後継は、Cortex-M43ならぬ、Cortex-M33とのこと。
Cortex-M7の後継は未発表ですが、Cortex-M73とか??
Cortex-M23搭載チップ、発売楽しみ!

links
- 【後藤弘茂のWeekly海外ニュース】ARMがセキュリティ機能を統合した新プロセッサ「Cortex-M23/M33」を発表 - PC Watch
- Cortex-M23 – Arm Developer

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マシン語

2019新卒エンジニア募集! 無いものを創ろう - asm15 supported SREC format!

2017/12/29
#jig #asm #web #stm32 

jig.jp、2019年4月入社となる新卒エントリーページをオープン!

新卒採用案内 | スマホ(Android/iPhone)アプリ・携帯アプリならjig.jp(ジグジェイピー)

コンテンツ:代表の想い、募集要項、弊社エンジニアの声、座談会、使用技術、使用言語!
jig.jp本店、鯖江の開発センターの雰囲気にビビっと来た人のエントリー、待ってます!

今日の一日一創は、JavaScriptで無いものづくり。

シンプルなアセンブリ言語を「IchigoJamではじめるArmマシン語入門」の解説用に使っていたら、作ってCC0で公開してくれたboxheadroomさんによるasm15アセンブラ! GitHubに載せてオープンソースでオープンライセンスな気軽に使えるWebアプリとして、必要に応じて成長させています。

ターゲットデバイスへのプログラムのバイナリを記述するためのフォーマット、IntelのHEXフォーマットと並ぶ、SRECフォーマット(モトローラSフォーマット、とも呼ばれる)への対応追加!

IoTに最適Arm Cortex-M0からLinuxが動いちゃうCortex-M7までのシームレス感が美しいSTM32の開発環境整備の一貫です。


asm15」 SREC format supported!!

コードを書き足し、テストして、GitHubへコミット!
検索してあえば使う、無ければ創って、共有する。
エンジニアの醍醐味です。

新卒採用案内 | スマホ(Android/iPhone)アプリ・携帯アプリならjig.jp(ジグジェイピー)

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 / アイコン画像 / プロフィール画像