背景
ATmega系のマイコンにブートローダーを書き込むのはArduino IDEを自分はよく利用しますが、マイコンに合わせてGUIで設定をで変更するのが手間に思えたので、PlatformIOでブートローダーを書き込む方法を調べてみました。備忘録を兼ねて分かったことを共有します。
使ったもの
- プログラムを書き込むPC
- PlatformIO
利用したバージョンは 5.1.1です。 - Arduino as ISPを書き込んだProMicro
- ATMega328PB
- 上記の2つをISPで接続する端子や線など
この記事はPlatformIOの設定の解説が主なので、回路の説明は深くしません。
ProMicroのSPIとATmeaga328PBの電源線とSPIの線を接続し、ProMicroの10をATmega328PBのRSTに接続した状態を作り、ProMicroからファームウェアをアップロード可能にしています。
書き方
Arduino ISPを利用したアップロードをするため、PlatformIOの「Uploat using Programmer」の「Arduino as ISP」に従い下記のようにplatformio.iniを書き換えます。このとき、上記の資料ではupload_speedを指定していますが、それを指定するとブートローダーの選択に影響するため、指定せず標準値を利用します。
(それを指定すると、Arduino IDEからUARTで書き込めないブートローダーが使われます。)
ボードの環境名はisp-for-ATmega328PBとしました。
platformio.ini
[env:isp-for-ATmega328PB]
platform = atmelavr
board = ATmega328PB
framework = arduino
upload_protocol = custom
upload_port = /dev/ttyACM0
upload_flags =
-C
; use "tool-avrdude-megaavr" for the atmelmegaavr platform
$PROJECT_PACKAGES_DIR/tool-avrdude/avrdude.conf
-p
$BOARD_MCU
-P
$UPLOAD_PORT
-b
$UPLOAD_SPEED
-c
stk500v1
upload_command = avrdude $UPLOAD_FLAGS -U flash:w:$SOURCE:i
他の設定を変えたい場合はBootloader programingの説明が参考になると思います。
上記の環境を指定しつつ 下記のように-t bootloader を付けてPlatformIOコマンドを実行すると、ブートローダーとヒューズの状態を自動で選択して書き込んでくれます。
今回は詳細も見たかったので-vオプションも付けました。
pio run -e isp-for-ATmega328PB -t bootloader -v
書き込み時のログの一部を共有
周波数やuartポートの指定をしていないため、標準設定の外部発信子16MHzのUART0でプログラムが書き換え可能な設定になります。---------------------
Target = atmega328pb
Clock speed = 16000000L
Oscillator = external
BOD level = 2.7v
Save EEPROM = yes
UART port = uart0
Clock output = no
CFD enable = no
---------------------
ヒューズはこれらが選択されました。
Selected fuses: [lfuse = 0xff, hfuse = 0xd6, efuse = 0xf5]
組み立てられたヒューズ設定とブートローダーファイルを含む書き込みコマンドです。
avrdude -p atmega328pb -C "/home/asuki/.platformio/packages/tool-avrdude/avrdude.conf" -C /home/asuki/.platformio/packages/tool-avrdude/avrdude.conf -p atmega328pb -P /dev/ttyACM0 -b 115200 -c stk500v1 -Uflash:w:"/home/asuki/.platformio/packages/framework-arduino-avr-minicore/bootloaders/optiboot_flash/bootloaders/atmega328pb/16000000L/optiboot_flash_atmega328pb_UART0_115200_16000000L_B5.hex":i -Ulock:w:0x0F:m
UART0利用、アップロード速度115200bps、16MHzのブートローダーが利用されました。
(upload_speedとして19200を指定していると、そのアップロード速度のブートローダーが利用されて、標準設定ではUART経由でのプログラム書き換えができなくなるので注意です。)
avrdude: input file /home/asuki/.platformio/packages/framework-arduino-avr-minicore/bootloaders/optiboot_flash/bootloaders/atmega328pb/16000000L/optiboot_flash_atmega328pb_UART0_115200_16000000L_B5.hex contains 32768 bytes
約2.5秒で書き込めました。
isp-for-ATmega328PB SUCCESS 00:00:02.554
成功するとUART経由でプログラムを更新可能なブートローダーが書き込まれたATmega328PBが出来上がります。
Arduino IDEからでも、PlatformIOからでも書き換え可能です。
USB-UART変換モジュールを介してArduino IDEからBlinkプログラムを書き込み、Lチカできました。
まとめ
PlatformIOの-t bootloaderオプションを利用して、ATmega328PBに標準設定のブートローダーを書き込めました。今までブートローダー書き込み時は基本Arduino IDEを開いていましたが、書き込み装置の設定(この記事だとArduino as ISP)と-t bootloaderオプションの利用でブートローダーを書けると分かったので、書き込みを何度も行うときなどはPlatformIOを使うと速くてGUI操作不要で便利そうです。
参考
Bootloader programingMiniCore/PlatformIO.md
Burn a bootloader with platformio
0 件のコメント :
コメントを投稿