ATmega32u4 (1)

Date: 2020/03/28 (initial publish), 2021/12/05 (last update)

Source: jp/note-00019.md

Previous Post Top Next Post

TOC

前々回・前回は、Arduino Uno/Nano に使われている基本のシリアルAVRの ATmega328P のプログラムの勉強・練習をしました。その結果チップ周辺の配線状態 確認をホストPCのターミナルからするシェルのような avrmon を書きました。

今回は基本のUSB AVRの ATmega32u4 を中心としたAVRチップのプログラム方法とその環境に関して、 調査と情報の整理をします。

ATmega32u4開発ボード

ATmega32u4を5V 16MHzで使う開発ボードをしては、 Arduino LeonardoArduino microSparkFun Pro MicroRobotDyn Micro ATmega32U4-MUTeensy 2.0などや そのコンパチ品が通販サイト(例えば、 banggoodaliexpressebay )で出回っています。私はTeensy 2.0のコンパチ品を入手しました。

AVRへのプログラム導入

ATmega32u4へのプログラム導入アプローチは、 ATmega328Pへのプログラム導入アプローチ より選択肢が多く混乱しがちなので、以前書いた英語のメモ( Serial AVRUSB AVR )をベースに、日本語で以下に比較しながら状況を確認と整理をします。

Serial AVR

Serial AVR (ATmega328P等) では、チップにプログラムを導入するのに 主に2つのアプローチがあります:

USB AVR

USB AVR (ATmega32u4等) では、チップにプログラムを導入するのに 主に4つのアプローチがあります:

AVRのプログラム環境

AVRのプログラム環境としては、いわゆるArduino環境がよく使われます。 ここでは深入りしませんが、Arduino環境はSTLを使わないC++言語環境で 独自のArduinoライブラリーを使うことで、ハードウエアーの細かな相違 をライブラリーの影に隠し、アプリケーションのプログラムを機能だけを 規定してできるようにさせてくれるプログラム環境です。だから、 Serial AVRとUSB AVRの違いはもとより、ARM系のMCUまでほぼ同じコード でカバーでき、USBデバイスの使用も簡単です。Arduino環境のGUI部分は 本質的ではなく、arduino-mk( Debian パッケージgithubサイト )を使えば普通のエディターでソースが書けコマンドラインから各種処理 ができます。この様にArduino環境は非常に便利なプログラム環境なんで すが、今私がしたいこととずれてます。

今の私のAVRのプログラム環境としては、PUREなC言語環境が良いです。 具体的には、avr-gcc をGNU拡張機能したC99環境で、avr-libcとともに 使うのが、コンパクトで分かりやすく勝手が良い気がします。これなら ハードウエアーに何をさせるのかを、PUREなC言語しか慣れていない初心 者の私にでも直截的に理解できます。

ATmega328Pをターゲットをしたavrmon を書いた際にはまさにこれで充分でした。実際には、最も複雑なホストPCと の通信がシリアル通信で、それが、UARTポートの状態を繰り返し読み確認する POLLING操作と、UARTポートへの直接書き込み・読み出し操作だけで簡単に実現 できたというのも、このアプローチがとれた背景ではあります。

まあ、現行プログラムの機能アップを狙い、シリアル通信を割り込み処理にして、 リングバッファー使用するようにしようとしても、比較的簡単にPUREなC言語で 実現できます。

ただ、avrmonのターゲットに ATmega32u4も加えようとしたら、USB関連の複雑な処理をどうするのかで 迷いました。

進むべき方向を探す参考にとPUREなC言語で書かれた、カスタムキーボード ファームウエアーのQMK Firmware を見てみると、USB関連の複雑な処理に LUFA を利用しています。LUFAは、USB AVRの各種ブートローダーソースや、 アプリケーションのファームウエアーをPUREなC言語環境で書く際に使える USBデバイス関連のライブラリーや、さらに多くの例示アプリケーション ソースとてんこ盛りです。素晴らしい内容ですが、大きすぎて食傷ぎみな ので、まずは将来の課題としておきます。

比較的コンパクトなATmega32u4を対象としたPUREなC言語でのプログラム 関連情報を探し他の参考情報源を調べました。

以上の観察から、avrmonの拡張は、 まずは、旧teensyのデモコードをベースにするのが良さそうです。 ただ、最近の開発環境に合わせてアップデートされていないので一部「const」 の追加等のタッチアップが必要です。 ArduinoのFAQ を参考にしてください。

ただ、将来はLUFA を利用すべきでしょう。その時はLUFA自体や AVR USB Devices and Programming 等を参考にします。

USB AVRのシリーズ

末尾の数字がデバイスの世代、その前の数桁の数字がフラッシュのKBサイズ

世代

サイズ

              Flash  page     SRAM   コメント
AT90USB82       8KB  128B   0.5 KB   PS/2とUSBの兼用端子
AT90USB162     16KB  128B   0.5 KB   PS/2とUSBの兼用端子
ATmega16u4     16KB  128B   1.25KB   Arduino Uno (USB変換部分)
ATmega32u4     32KB  128B   2.5 KB   Leonaldo, micro, teensy2.0、すべてHWB端子を接地
AT90USB646     64KB  256B   4   KB
AT90USB1286   128KB  256B   8   KB   teensy2.0++
Previous Post Top Next Post