STM8Lはぢめました(まだはぢまってすらいない)

●STマイクロの8bitマイコンSTM8L



少し前に偽ATXMEGA128A1Uを掴まされた店から物のついでと同時に8Pinと
64PinのSTM8Lシリーズマイコンを購入しておりました。

かつてはVersaloonへの改造のため燃えないゴミと称してSTM8の部分は即廃棄して
いましたが、2022年の現在はまともな開発環境とかそろってそうだったので
手を出してみた次第でございます・・・しかし…


●STM8ライタ復活への道

しかし!ねむいさんはVersaloonへの改造のためにSTM8-discoveryのSTLinkの
部分をつぶしてしまっておりました!!!
STM8に書き込みデバッグするために
SWIMプロトコルを持つSTLink系デバッガハードが必要です!
さすが私!やらかした!だめだこりゃ!

でも私はSTM32系のDiscovery持ってるじゃないか、あれのSTLinkの部分使えば
SWIMを引き出せられるんじゃないかと思い出し手持ちのDiscovery基板やNucleo
基板を引っ張り出して調べてみました。


改造できる条件として、STLinkのファームがSTM8用のSWIMプロトコルが実際に
使用できること、そして基板上にパタンが出て改造しやすいことです。
NUCLEO系や最近のDiscvoeryではSTLink/V2-1のファームが動いており、それらは
ファームからも回路もオミットされているためこの時点でアウチです。


選んだのはSTM32F0Discoveryです(SWIM引き出し改造済み後の撮影ですが)
こいつはSWIM用の外部端子や構成回路こそはありませんが有り難いことに
SWIM向けに内部パタンは接続されており、最小限の配線をしてやればSWIMを
復活できるはず…!



そして根性の配線…ッ!
STM8S-DiscoveryのSWIM回路の真似して受動部品も装着です。
OpenOCDはすでにSTM8へのフラッシュ書き込みやデバッグ機能を持っているため、
ねむいさんの環境においてもたやすくできるはずです!
いざ勝負!



(注:STM32G0のプロジェクトになってますがmakefileをいじり、OpenOCDから
   STM8Lに書き込むようにしています。)

まぁ簡単にできるわけないよね。STM32F0DiscoveryのSTLink/V2のファームは
STM32のSWDに特化していてSWIMがファーム的に機能していませんorz
"STLINK V2J39S0"ってなっていますが"V2J39S0"の部分、J39がSWJのv39でS0は
SWIM機能ありませんって意味と解釈してください。

これ普通にSTLinkのアップデータでファームをあげてもJ39の部分が上がるだけ
なのでどう頑張ってもSWIMできません…


しかし…おそロシアの力を借りるとあら不思議(意味深)
STM8にも対応したデバッガーファームウエアが書き込まれてしまったでは
ありませんか!!しかもこの状態で最新ファームにもアップデート可能です!


おおっ!書き込み出来た!素晴らしい!V2J39S7となってSWIMが可能です!
もちろん従来のSTM32F0も書き込み可能!
流石モラルを真っ先に投擲機で投げ放つロシア!!おまえらのそういうとこだぞ!!
でもありがとう!!!!!


というわけで十数年前投げ捨ててしまったSTM8の書き込み機能を取り戻すため
かなりの労力を使ってしまったので肝心のSTM8ビルド環境については次回に
解説させていただきます…

XMEGAを使ってみる6 -どうしても外付けSRAMつけたかったので-

●XMEGAよ、やはりお前を救いたい
今から約10年前、ねむいさんはXMEGAをいじっておりましたがFatFsを実装し、SPIの
DMA化で力尽きました。ほんとは256kByteくらいのSRAMを外付けしたりしてやりた
かったのですが残念ながら当時購入したATXMEGA128A1ではチップ単体ではEBIを4PORT
SRAMモードで動作させてもアドレスバスに当たる一部のピンが外部に出ておらず、
SRAMを動作せしめることができませんでした(アドレスが1つだけでよいTFT-LCDとか
ならなんの問題もない)。

その後USB機能が付いたATXMEGA128A1Uが登場し、アドレスバスを別のポートに割り当て
できるようになっているとのことで手に入れようと試みて失敗したのが前回です

この半導体不足で何とか手に入れられないものかと思案した結果、部品がだめなら
製品を買えばよい!と至って久々にAliexpressでお買い物をしました。




MCUZONE製のATXMEGA128A1Uボード。USBブートローダはちゃんと動いたので本物です!


慎重にはがして載せ替えてみました。


ちなみにATXMEGA128A1のドアップ写真を。


オリジナルATXMEGA128A1


謎の縦じまがあるぱちもん。
ATXMEGA128A1UではなくATXMEGA128A1をリマークしたもの。


本物のATXMEGA128A1U!



●外付けSRAM

今回使用する外付けのSRAMは8bitバス,2Mbit(256kByte)のCY7C1010DV33-10ZSXIです。
10年以上前にデジキでかって塩漬けにして以来の活躍です。製造メーカのCypressは
すでにInfineonに食べられてしまっていますね。



SRAMも付けたXMEGA基板の表裏はこんな感じです…
二度とバスの配線とかやりませんよもう!



●回路とコード


すみません回路図めんどくさくて10年前から書いてませんが割り振り表はあるので
まねされる方はそれを参考にしてください。
TFT-LCD駆動用にCS0をつかってしまっているのでSRAMはCS1とします。


外付けSRAM用4Port-EBIの設定です。実行する関数はmain関数より早く実行した方が
良いので".init5"セクションに配置します。


EBIの設定のほかにheap領域は外部RAMで行えるようにheapの初期設定も行います。
__malloc_heap_start__malloc_heap_endにheap領域を示すアドレスを代入します。
__malloc_heap_endってなんで固定値0xFFFFなのかについては最後に解説します


また、上記のコードで書いてあった変数"__extram_end"はリンカスクリプト内で
定義します。コード内で値の設定を行うときは&を忘れずに。


以上で外付けSRAMを使う準備ができました。


●動いた!…しかし


載せ替えたXEGAにプログラムを書き込みFatfsの動作を確認です。
チップリビジョンはATXMEGAA1Uを示す'L'になってますね。


mallocで領域確保したりちゃんとできてますね★



特筆する点はFatFsの転送スピードです!
内蔵RAMは8kByteしかないので転送用のバッファも少ししか取れずDMAの恩恵に
預かれなかったのですが、外付けで32kByteとってやると断然違います!
これだけでもわざわざATXMEGA128A1Uを手に入れた甲斐がありました!

しかし…

●立ちはだかる16bitの壁

さて、上でさらっと述べましたが何も考えないで内蔵RAMのように気軽に使用できる
のはメモリのアドレスが0xFFFFまでです。つまり最大でも64kByteまでしかだめです。
今回の作例ではメモリアドレス0x005000から開始しているので0xFFFF-0x5000=0xAFFF
で、10進数に治すと45055Byte分しか楽に使えません。

そこから先の世界に踏み出そうとすると10年以上前に頭を抱えた24bitアドレス問題
直面することとなります。私の作例では一応24bitアドレスアクセスルーチンもテスト
の一部として入れております。DMAに関しては最初っから24bit分レジスタが用意されて
いるので心配はありません。

というわけでがんむばって256kByteのSRAMくっつけてたのがつけてから64KByte分
くらいしか得しないことを気づいてしまいましたが10年来心に抱え続けていたものに
決着をつけることができました。

世間はUPDIなAVR-DBシリーズに移行している中で盛大な寄り道をしてしまいましたが
今回頭を唸らせた経験はきっと役に立つでしょう(やばい思想にはまっている目で)。


今回の成果を反映したものをおきぱにおいておきます。忘れたころにXMEGA触る人に
少しくらい役に立つと期待しております。

いろいろ試す51

今回は8bitマイコン中心のネタになります。


●AVRDUDEの整備

新世代のupdiに対応したavrdudeはgithubに戦場を移してかつてとは比べ物にならない
速度でビシバシ修正が入りまくっております。

私もそれに対応すべくなるべく最新のコミットを常にpullしてビルドしたバイナリ
OpenOCDと同じく皆様に提供しております。

前回の記事の通り、USBシリアル変換でUPDIがお手軽にできてしまったのでavrdudeの
需要がかなり増加しておりavrdude目当てでぶろぐに来られるかたも増えておりうれしい
限りでございます。

宣伝ですがSTM32系のCortex-M系マイコンのねむいさん特製書き込みスクリプト付きの
OpenOCDバイナリも公開しておりますのでこちらもご利用ください☆


●ATXMEGA128A1"U"を使ってみるつもりだったが…

今年の春、思うことあってXMEGAを再び使う気持ちになり、ATXMEGA128A1の進化系である
ATXMEGA128A1"U"を入手して使用してみました…


ATXMEGA128A1"U"はU無しの物にUSB機能やその他修正を加えたものです。多分USB付き
だからUなのでしょうね…



デバイスIDはなんとATXMEGA128A1と同一です…間際らしい…


A1UのリビジョンはHか〜…A1と全く同じじゃん(←まだ気づいてない



しかし、その後いろいろいじって気づいたがねむいさんが本当に使いたかった4-Port
EBIのSRAMが使用できなかった…。具体的に言うとA1UはEBIがPORTFに割り振られており
A8~A15のアドレスバスが使用できるはずなのですができない!!!!!

唸ること1週間、AVRFREAKSの記事にATXMEGA128A1Uのチップリビジョンは'L'である
というコメントが…そしてもう一回入手したA1UのリビジョンIDを見直すと…


↑A1UはRev:LのはずなのにRev:H
あああAAあああああ!!!これA1UではなくてA1なのでは!?
もう一度チップ表面を見てみる


あれ…私がaliexpressで買ったA1UはA1の奴と見比べるとよく見ると真ん中あたり
削ってるような形跡…

リマーク品でしたー!クソァ1!!!1!!!

まぁこんな半導体不足のご時世でデジキもMOUSERもA1Uの在庫0なのにAliexpressから
すんなり買えるはずはないと思ったのですよぅ…

このネタは次回のA1U入手作戦に続きます…


●arm-gccがアップデート
今年の春先にarm-gccがgccバージョン11.2になってアップデートしています


今回からファイルサイズがメタクソにでかくなってるのでダウンロードの際は十分
ご注意下さい。スタティクライブラリを各コアごとにすべて用意しているのが原因の
ようです。ちなみにCortex-M系だけではなくLPC2388等のARM7TDMI等もビルド可能です。


●avr-gccもアップデート
avr-gccも12.1.0にアップデートしております。

こちらについては次回予定のATXMEGA128A1Uの記事で合わせて紹介させてたいだきます。


●STM8Lはぢめてます


ATXMEGA128A1U購入のついでに8pinSTM8LシリーズのSTM8L050J3M3も試用してます。
こちらもうまいこと使いこなせるようになったら紹介したいと思います。

ATTINY202(とその他)を使ってみる3 -UPDI難民問題解決の件-

●私の中でUPDI難民問題に終止符が!!
新しい世代のAVRシリーズは以前使用してきたISP,JTAG,PDI,TPI,dWireとは全く別の
プログラミング・デバッグインターフェース(UPDI)となっているのはご存じの通り
かと思います。ねむいさんもPDI,TPIまでは手持ちのデバッガ・ライタハードウエアで
で何とかしのげていたのですがUPDIに関しては市販の評価基板から線を引き出して
それに対応した特別なavrdudeを使用して茶を濁しておりました


そしてその後にpyUPDIというCOMポートの通信だけでUPDIのプログラミングをお手軽に
できる代物が世に広まり、嗚呼…これがavrdudeにも実装されたらなぁ…
…とずっと願っておりましたが今年に入ってついに!ついに!それが実現しました!!


●ハードウエアを用意する
avrdudeはsvnからgitに移行した時から鬼のような勢いでfixが入りまくり日々成長を
広げております。ねむいさんもgitからクローンしたやつからビルドして試してみました。
なお今回紹介するお手軽COMポートUPDIはavrdude内ではserialupdiと呼ばれているので
以下それに倣います。


使用するCOMポートについてはUSBシリアル変換チップが勿論使用できます。安物中華
チップでもそれなりに動きますが5Vトレラント高いボーレートが保証されてるFTDI系の
ものがやはり安心です(注:後述しますがFTDIに関してはドライバの設定必須)。

ねむいさんは写真の秋月製のFT23xモジュールを愛用しています。



そしてUPDI実現のための追加ハードウエアはたったこれだけ!
AVR側の電源は別口からとることを想定しております。また、FT234xなら+5V信号を
受けられるので、3.3~5Vの範囲ならば電圧レベル変換などの考慮も不要です。


こんな感じでユニバーサル基板のきれっぱを使用してコネクタと部品を実装して
脱着可能アダプター形式にしてみました。



●実際に使ってみよう

まずは私も使っているATTINY202を使用しましょう。ちなみに昨年夏位にpyUPDIが公表
されてからUPDIのハードルが一気に下がったせいか秋月で一瞬で売り切れてしましたが
半導体不足の波も超え今では安定して入手可能となっていますがたくさん買いすぎるなよ!

avrdudeはねむいさん特製ビルドのものを使用してください。最新のコミットのほかに
avrftdiのバグの修正やLUFAのAVRISP2エミュの不具合修正パッチもあてています。


avrdudeに与えるハードウエア名は"serialupdi"、使用するポートはCOM+ポート番号と
ボーレートを指定してください。



とその前に!
FTDI系のチップを使用する際はドライバの設定(デバイスマネージャからCOMポートのプロ
パティ->詳細設定)でBMオプションの待ち時間を1mSecにしないと本来のスピードが出ません。
これ何かというとFTDI系は送信バッファがそれぞれのデバイスの上限に達したらUSB転送
開始もしくは上記待ち時間(latency_timerという)の時間が過ぎたらとりあえずUSB転送
する仕様となっており、最小の1mSecにすればUSBフルスピードの1フレーム間隔(1mSec)で
とにかく隙間なく転送されることになりCPUパワーは食いますが少量のバイト数の転送の
場合に効率が良くなります。

jtag2updiのサイトに深い記述があるのでこちらも熟読してください。

> "C:¥Devz¥Coreutils¥bin¥make.exe" program
C:/Devz/AVR/avrdude/avrdude -v -p attiny202 -P com3 -b230400 -c serialupdi -U flash:w:main.hex

avrdude: Version 6.99-20211218
Copyright (c) Brian Dean, http://www.bdmicro.com/
Copyright (c) Joerg Wunsch

System wide configuration file is "C:/Devz/AVR/avrdude/avrdude.conf"

Using Port : com3
Using Programmer : serialupdi
Overriding Baud Rate : 230400
avrdude: serial_baud_lookup(): Using non-standard baud rate: 230400 AVR Part : ATtiny202
RESET disposition : dedicated
RETRY pulse : SCK
Serial program mode : yes
Parallel program mode : yes
Memory Detail :

Block Poll Page Polled
Memory Type Alias Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
signature 0 0 0 0 no 3 1 0 0 0 0x00 0x00
prodsig 0 0 0 0 no 61 61 0 0 0 0x00 0x00
sernum 0 0 0 0 no 10 1 0 0 0 0x00 0x00
osccal16 0 0 0 0 no 2 1 0 0 0 0x00 0x00
osccal20 0 0 0 0 no 2 1 0 0 0 0x00 0x00
tempsense 0 0 0 0 no 2 1 0 0 0 0x00 0x00
osc16err 0 0 0 0 no 2 1 0 0 0 0x00 0x00
osc20err 0 0 0 0 no 2 1 0 0 0 0x00 0x00
fuses 0 0 0 0 no 9 10 0 0 0 0x00 0x00
fuse0 wdtcfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse1 bodcfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse2 osccfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse4 tcd0cfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse5 syscfg0 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse6 syscfg1 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse7 append 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse8 bootend 0 0 0 0 no 1 1 0 0 0 0x00 0x00
lock 0 0 0 0 no 1 1 0 0 0 0x00 0x00
data 0 0 0 0 no 0 1 0 0 0 0x00 0x00
userrow usersig 0 0 0 0 no 32 32 0 0 0 0x00 0x00
flash 0 0 0 0 no 2048 64 0 0 0 0x00 0x00
eeprom 0 0 0 0 no 64 32 0 0 0 0x00 0x00

Programmer Type : serialupdi
Description : SerialUPDI

avrdude: UPDI link initialization OK
avrdude: NVM type 0: 16-bit, page oriented write
avrdude: Entering NVM programming mode
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% -0.00s

avrdude: Device signature = 0x1e9123 (probably t202)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (1592 bytes):

Writing | ################################################## | 100% 0.36s

avrdude: 1592 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: input file main.hex auto detected as Intel Hex

Reading | ################################################## | 100% 0.14s

avrdude: 1592 bytes of flash verified
avrdude: Leaving NVM programming mode

avrdude done. Thank you.


> Process Exit Code: 0
> Time Taken: 00:02

脱線しましたが書き込みはこんな感じです。
ATTINY202はROM容量が少ないので早いのか遅いのかよくわかりませんが…



ではAVR128DB28で12kByteくらいのバイナリを書き込んで確かめてみた
curiocity nanoのmDBG
> "C:¥Devz¥Coreutils¥bin¥make.exe" program
C:/Devz/AVR/avrdude/avrdude -v -p avr128db28 -P usb -c pkobn_updi -U flash:w:main.hex

avrdude: Version 6.99-20211218
Copyright (c) Brian Dean, http://www.bdmicro.com/
Copyright (c) Joerg Wunsch

System wide configuration file is "C:/Devz/AVR/avrdude/avrdude.conf"

Using Port : usb
Using Programmer : pkobn_updi
avrdude: Found CMSIS-DAP compliant device, using EDBG protocol
AVR Part : AVR128DB28
RESET disposition : dedicated
RETRY pulse : SCK
Serial program mode : yes
Parallel program mode : yes
Memory Detail :

Block Poll Page Polled
Memory Type Alias Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
signature 0 0 0 0 no 3 1 0 0 0 0x00 0x00
prodsig 0 0 0 0 no 125 125 0 0 0 0x00 0x00
tempsense 0 0 0 0 no 2 1 0 0 0 0x00 0x00
sernum 0 0 0 0 no 16 1 0 0 0 0x00 0x00
fuses 0 0 0 0 no 9 16 0 0 0 0x00 0x00
fuse0 wdtcfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse1 bodcfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse2 osccfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse4 tcd0cfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse5 syscfg0 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse6 syscfg1 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse7 codesize 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse8 bootsize 0 0 0 0 no 1 1 0 0 0 0x00 0x00
lock 0 0 0 0 no 4 1 0 0 0 0x00 0x00
userrow usersig 0 0 0 0 no 32 32 0 0 0 0x00 0x00
data 0 0 0 0 no 0 1 0 0 0 0x00 0x00
flash 0 0 0 0 no 131072 512 0 0 0 0x00 0x00
eeprom 0 0 0 0 no 512 1 0 0 0 0x00 0x00

Programmer Type : JTAGICE3_UPDI
Description : Curiosity nano (nEDBG) in UPDI mode
ICE HW version : 0
ICE FW version : 1.21 (rel. 37)
Serial number : MCHP3280031800001375
Vtarget : 3.31 V
PDI/UPDI clock Xmega/megaAVR : 100 kHz

avrdude: Partial Family_ID returned: "AVR "
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% -0.00s

avrdude: Device signature = 0x1e970e (probably avr128db28)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (12076 bytes):

Writing | ################################################## | 100% 3.75s

avrdude: 12076 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: input file main.hex auto detected as Intel Hex

Reading | ################################################## | 100% 2.06s

avrdude: 12076 bytes of flash verified

avrdude done. Thank you.


> Process Exit Code: 0
> Time Taken: 00:07

serialupdi
> "C:¥Devz¥Coreutils¥bin¥make.exe" program
C:/Devz/AVR/avrdude/avrdude -v -p avr128db28 -P com3 -b230400 -c serialupdi -U flash:w:main.hex

avrdude: Version 6.99-20211218
Copyright (c) Brian Dean, http://www.bdmicro.com/
Copyright (c) Joerg Wunsch

System wide configuration file is "C:/Devz/AVR/avrdude/avrdude.conf"

Using Port : com3
Using Programmer : serialupdi
Overriding Baud Rate : 230400
avrdude: serial_baud_lookup(): Using non-standard baud rate: 230400 AVR Part : AVR128DB28
RESET disposition : dedicated
RETRY pulse : SCK
Serial program mode : yes
Parallel program mode : yes
Memory Detail :

Block Poll Page Polled
Memory Type Alias Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
signature 0 0 0 0 no 3 1 0 0 0 0x00 0x00
prodsig 0 0 0 0 no 125 125 0 0 0 0x00 0x00
tempsense 0 0 0 0 no 2 1 0 0 0 0x00 0x00
sernum 0 0 0 0 no 16 1 0 0 0 0x00 0x00
fuses 0 0 0 0 no 9 16 0 0 0 0x00 0x00
fuse0 wdtcfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse1 bodcfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse2 osccfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse4 tcd0cfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse5 syscfg0 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse6 syscfg1 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse7 codesize 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse8 bootsize 0 0 0 0 no 1 1 0 0 0 0x00 0x00
lock 0 0 0 0 no 4 1 0 0 0 0x00 0x00
userrow usersig 0 0 0 0 no 32 32 0 0 0 0x00 0x00
data 0 0 0 0 no 0 1 0 0 0 0x00 0x00
flash 0 0 0 0 no 131072 512 0 0 0 0x00 0x00
eeprom 0 0 0 0 no 512 1 0 0 0 0x00 0x00

Programmer Type : serialupdi
Description : SerialUPDI

avrdude: serial_baud_lookup(): Using non-standard baud rate: 230400avrdude: UPDI link initialization OK
avrdude: NVM type 2: 24-bit, word oriented write
avrdude: Entering NVM programming mode
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% -0.00s

avrdude: Device signature = 0x1e970e (probably avr128db28)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (12076 bytes):

Writing | ################################################## | 100% 0.85s

avrdude: 12076 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: input file main.hex auto detected as Intel Hex

Reading | ################################################## | 100% 0.78s

avrdude: 12076 bytes of flash verified
avrdude: Leaving NVM programming mode

avrdude done. Thank you.


> Process Exit Code: 0
> Time Taken: 00:05


>curiocity nanoのmDBG
計7秒
>serialupdi
計5秒
あれ…イケてるじゃないですか…☆
しかも純粋な書き込み時間だけ見たら3.75sec対0.85Secで圧勝ですね…!

というわけで実践でも結構使えるUSBシリアルとavrdudeを使ったお手軽UPDIはこれから
爆発的に流行ってくるとおもいます!ねむいさんが記事にしたせいでATTINY202の在庫
また切れてしまうかもしれないので何度も言いますが一人で買い占めちゃダメだゾ!


☆serialupdi対応のavrdude-windows32bitバイナリはこちら☆

在庫復活記念!!ATTINY202を限界まで使い倒す!

●ATTINY202復ッ活ッ!
プーチンが突然けぉって顔真っ赤にしてウクライナに侵攻してから半導体の納期が
さらに悪化する兆しを見せやがっておりますが、その中でATTINY202の在庫
秋月電子通商さんに復活しました!!

なんか20円値上がりしてる気がしますがたぶん気のせいでしょう…そんな
細密なこと気にするより在庫が復活するのが超重要事項なのです!!!!

扱いが非常に簡単かつ非常に安価に使いまわせるので様々なシーンで
活躍していくことでしょう!!


●ていうわけでねむいさんも本腰入れて使ってみました
昨年になってATTINY202のポテンシャルに気付いた方々が爆買いに走り気づいた
時にはすっからかんとなっておりました。ねむいさんもちょっと動かして満足して
ほっぽっていましたが
他の方の使用例に刺激されてATTINY202のROM容量
限界まで使ってみました!!!


なお,ATTINY202はメモリリソースが非常に少ないです…。
ROM:2048Byte
RAM:128Byte


ねむいさんいつもSTM32H7等の大容量メモリを扱ってたのでパワーゲーム
慣れきってしまったせいか逆に少ないリソースのマイコンは新鮮に感じます。

私のモットーとしては
1.スタックを考慮してRAMはなるべく使用しない。
2.ROMもメモリ容量圧縮しつつギッチギチに使う


で攻めてみます!

●作例1:1-Wire温湿度計
過去にSTM32G0を使用したときのAosong製AM2322Bを今回も採用して出力をUART
から吐くようなプログラムを作ってみました!


ROM容量は2037Byte....2048バイトまで10バイト弱…これはギリギリ


-fno-split-wide-typesをコメントアウトしてみました…
2バイト削減…もはや数バイトの戦い!


関数突入時のプロローグ/エピローグルーチンをあらかじめ作ってROM容量を削減
する効果がある-mcall-prologuesをあえてコメントアウト!
使用する関数がごく少ない場合は逆にコメントアウトしたほうがROM容量が減って
お得です☆これで2027バイト…まぁこれでよいでしょう…!

なお、XMEGAとかでこのオプションちゃんと付けてないと確実に容量が膨れ上がって
爆死します☠



動いたところはこんな感じです。
内蔵クロックが20MHzもあるので230400bpsでも余裕です☆


●作例2:2-Wireで定番LCD(IC:HD44780)を動かす
すでにI2Cでキャラクタ液晶動かすネタはほかの人がやってしまっているので
ひねくれ者のねむいさんは11年前の無理やりすぎるやつをやってみました!
SUNLIKE製の安く購入できるものに代表される2行16文字で内臓コントローラICが
HD44780互換なキャラクタ液晶モジュールを受動部品を追加してたったの2線で
動かしちゃう実用性皆無の超力技
です!中国だもんなア…
↑のリンク先で牛という単語が散見しますが中国では牛を肯定的な意味で使用
 されることがあるとのことです。この力業は文字通り強い牛を見るようだ。



ソースコードは上リンクの中国の人のATMega16のものをベースに汎用で幅広く使えるように
一般公開向けに現在整備中です!間に合わなかったわけじゃないよ!


しかし…


そこに立ちふさがるROM容量の壁!orz
ああっつ!「作例1:1-Wire温湿度計の計測」結果をUART出力の代わりにかっこよく
表示して今回の記事を〆たかったのに容量ぜんぜん足らない…!
あと500Byteあれば…


・・・


15分ほど頑張りましたが挫けてしまい文字列表示ルーチンだけ走らせて敗戦の弁を
述べさせていただきます…orz







というわけでSTM32に慣れ切った私の体には負担が強すぎたのはわかりましたが
ATTINY202の(ROM容量の)イッパイ使用できて非常に満足しております…!
今回の記事で紹介した作例のソースコードはまだ公開用に整備中なのでもうしばらく
お待ちいただければ幸いです。


ところでねむいさん今回はUPDIプログラマ使ってなくてなんかUSBシリアル変換
だけで開発してない?ですって!?それの詳細は次回以降でみっっっちりと解説
させていただきますよぅ♥
ATTIY202売り切れしたのってこれ絡みが原因だったかもれませんがこうご期待!

AVR128DAとかDBをもうちょっと使ってみる

●XMEGAの後継!機能満載でエラッタも満載
品種的にはXMEGAの後継となるAVR-Dxシリーズ。数々の新機能がありますがそれは
同時に数々のエラッタを仕込むこととなりエラッタシートとチップリビジョンに
注意しておかないとドハマリして目の下にクマつけてダブルピースしてしまいます。

現在、AVR128DAに代表されるAVR-DAシリーズとAVR-DBシリーズが流通しております。
DAとDBの違いはアナログ入出力がさらに強化されているのと異なる電圧のI/O
そしてDAに存在したエラッタが修正されていることです。

マイクロチップは過去のシリーズで出たエラッタは新しい奴で修正するよという
スタンスなのでしょうか…???これから買う人はDBシリーズ以降にしておけば変な
地雷踏まずに済むと思います。ただし使用前にエラッターシートは必ず目を
通しておいてください。


●製造開始直後のAVR32DAに存在した致命的エラッタ
さてAVRはアトメル時代からまず大きめの容量のチップ作ってそのあとシュリンク
していく量産体制の流れになっていますがAVR128DAが世に出て少し経った頃に
製造されたAVR32DAというチップに致命的エなエラッタが存在していました!!!

エラッタの内容は本来は4バイト必要なリセットベクタが2バイト刻みになっている
というものです。AVR32DAのフラッシュ領域すべてにアクセスするためにはリセット
ベクタで4バイトのjmp命令を使う必要があります。が、ハード的に発生する割り込み
要因は2バイトずつで詰め詰めになってるのでjmp命令ではとんだ先がめちゃくちゃ
になってrjmp命令を使用しなければならず、8kB分しかアクセスできません。

↓以下AVRのジャンプ命令の参考資料

RJMPは16bitオペコードなので2バイト
(フラッシュ8kB以下のデバイスはこちら)


JMPは32bitオぺコードなので4バイト
(フラッシュ8kB以上のでデバイスはこちら)

avr-gccに関しては4バイト区切りの割り込みベクタアドレスを前提に
スタートアップコードがビルドインされておりうんこつきのAVR32DAでは
どう頑張ってもまともに割り込みが使えません!


↑データシートよりAVR32DAの割り込みベクタの解説。
アドレスは2ワード(=4バイト)区切りなのがわかります。

AVRって最初に出た当初は"すっきり16bitオペコード"を売りにしてて伝統的に
ワード(16bit)でプログラムアドレスを表現してきたからシュリンク設計した人が
バイトアドレスと間違っちゃったんじゃないかな…

というわけでこの製造初期に出てしまったAVR32DAは回収され、現在流通している
物については正しい割り込みアドレス間隔になっているそうです。わたしは怖くて
使う気もないですけど!

ちなみに致命的すぎるエラッタゆえにエラッターシートには記載されておらず、
AvrFreaksで指摘があって初めて広く知られるようになったそうです。


●AVR128DAにもやっぱりあかんエラッタ
そして私が持っているAVR128DAもフラシュメモリがらみのエラッタがありますが、
それは下記の条件がすべて重なった時に起こります。

.侫薀奪轡緡琉茲鬟如璽仁琉茲0x8000から32kB分をマッピングして読み書きする
FUSE領域のBOOTCODEに0以外の数値が入っている(=APPCODE領域を有効にする)
NVMCTRL.CTRLBのBOOTRPをたててブート領域のプロテクションを行う

上記すべてが重なると32kB区切りのどの領域をマッピングしても最初のBOOTCODEの
領域が頭のほうにかぶさってきやがります!!


↑超わかりづらい公式のエラッタシートの解説DA!。


ブート領域を設定しなかったりLPMでフラッシュ領域のデータの読み取りするなら
全く気にする必要はありませんがせっかくデータ領域にフラッシュ領域のデータを
マッピングできるのですからせめて活用はしたいですよね…!


●AVR-Dxを救いたい
というわけでせめて32kB分だけでもPROGMEMしないでSTM32とかと同じようにconst
な値を置いてみたかったので上記エラッタを踏まないように配慮したうえで
リンカスクリプトをいじりフラッシュ領域のマッピング機能を最大限に活用する
作戦を取りました!


1.通常版の場合

マッピングを使用せず素直にPROGMEMした場合のプランです。
128kByte自由に使えますが64kB以上のPROGMEMの読み出しはfarポインタを使用する必要が
あります。


なお、私は使おうとするAVRのフラッシュ容量を見てfar使うか使わないかを使い分け
られるようにしてます。しかしなんでもかんでもfarにするとべらぼうにリソースを
食ってしまいますのでChaN師に倣いfarはなるべく使用しない方が吉です。

2.マッピングあり&フラッシュ容量32kBのマイコンとして使う

妥協案その1。AVR128DAを32kB分しか使わず残り96kBは見なかったことにしたら
32kByte全域にPROGMEMしないでもconstだけでアクセスできるわ♥ヤッター!
ってあほか!


3.マッピングあり&rodataだけ最終セクタに押し込む。

妥協案その2.リンカスクリプトをいじくり倒してrodataだけ96kB以降に押し込んで
この領域をマッピングする!
これが一番妥協できて無難ではないでしょうか?FONTX2みたいな馬鹿でかいファイル
おかない限りはリード専用領域32kBは十分すぎると思いますよぅ。




リンカスクリプトのいじる際のミソは__RODATA_PM_OFFSET__にデータ領域へマッピング
されたアドレス0x8000を指定することとtextの次にrodataが来るようにすること(重要)
順番間違えたらビルドが通らないです。


こんなわけでAVR−Dxシリーズの売りの一つだったフラッシュ領域のデータ領域への
マッピングも一応使いものになってきましたので少しは救いになったかと思います!


今回のソースコードは↓になります。回路はAVR128DA48-CuriosityNANOに準拠した
つくりとなっておりますが設定を変えてビルドしたらDBシリーズでも使用可能です。
AVR-DAとかDBとか買ったはいいものの持て余してる方はお試しください。

AVR128DA48 CuriosityNANO TestProgram.



●AVR-XMEGA、お前は救えない

上でちょっと触れたfar使う使わないの判定ですがXMEGAにも横展開しておきました。
対象はChaN氏のAVR版xprintfと私のavr版fontx2ドライバです。
FONTX2ドライバとかサイズでかいからさいっしょっからfar必須でしょ
とお思いかもしれませんがankコードだけなら10kbyteもないものが
あるので少しでもリソース減らすために追加してみました。

なんというか4年ぶりのxmegaの更新をしましたがここまでプログラムの規模が
でかくなるとやはりSTM32とかの32bitマイコンのほうが使いやすいなと感じます。

一方AVR使うならフラッシュ容量32kB以下のものを使っていくのが適材適所かなと
感じてます。進化の袋小路に入りこんだXMEGA。そこから生まれたAVR-Dxはどこまで
正当な進化を続けられるのか?これからの活躍を見届けたいと思います!




おまけ


超久しぶりにXMEGA触ったからAとAUの違いって何だろうと調べたらUSB機能追加の
ほかにPORTLが存在しなくて不可能だった4Port-EBIが完全に使用できるのが判明!
今さら遅いんだYO!

Go to top of page