2021年5月10日月曜日

PlatformIOでATmega系マイコンのブートローダーを書き込む方法


背景

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 programing
MiniCore/PlatformIO.md
Burn a bootloader with platformio

0 件のコメント :