GNU/Linux >> Linux の 問題 >  >> Linux

AVR - Linux で AVR チップをプログラムする方法

完全な説明をする時間はありませんが、Linux ボックスで AVR をプログラムするために使用するコマンドをクックブック形式で紹介できます。

準備

  • Ubuntu では、必要なパッケージがいくつかインストールされていることを確認してください:sudo apt-get install avr-libc avrdude binutils-avr gcc-avr srecord 必要に応じて gdb-avr simulavr をスローします デバッグとシミュレーション用
  • すべての ATtiny プロジェクトがホームとなるディレクトリの作成を開始しました:mkdir ~/attiny: cd ~/attiny
  • プロジェクトごとに専用のサブフォルダーを作成します (長い名前は気にしません):mkdir waveShare4digit8segmentDisplay; cd waveShare4digit8segmentDisplay

ソースを作成

  • お気に入りのテキスト エディタでソース ファイルを編集します:vi project.cpp

設定

以下のコマンドは、メンテナンスを容易にするために、環境変数に大きく依存しています。

  • 使用/作成されたファイルのベース名:src=project
  • 一般的なコンパイラ フラグ:cflags="-g -DF_CPU=${avrFreq} -Wall -Os - Werror -Wextra"

以下の変数は、使用する正確なプログラマーに応じて変更する必要がある場合があります。 man を参照してください 詳細についてはページをご覧ください。

  • baud=19200 プログラマーが PC と通信するボーレート:
  • programmerDev=/dev/ttyUSB003 プログラマーが配置されているデバイス名。 dmesgをチェック 詳細については出力してください。
  • programmerType=avrisp これは、正確なプログラマーによって異なる場合があります。

以下の変数は、プログラムするコントローラによって異なります:

  • avrType=attiny2313 avrdude -c $programmerTypeをチェック
  • avrFreq=1000000 デフォルトのクロックについては、コントローラのデータシートを確認してください。

コンパイル

  • 最初のステップは、オブジェクト ファイルを作成することです:avr-gcc ${cflags) -mmcu=${avrType) -Wa,-ahlmns=${src).lst -c -o ${src).o ${src).cpp
  • 2 番目のステップは、ELF ファイルを作成することです:avr-gcc ${cflags) -mmcu=${avrType) -o ${src).elf ${src).o
  • 3 番目のステップは、Intel Hex ファイルを作成することです。これは、実際にプログラマーに送信されるファイルです:avr-objcopy -j .text -j .data -O ihex ${src).elf ${src).flash.hex

プログラミング

  • 最後のステップは、デバイスをプログラムすることです:avrdude -p${avrType} -c${programmerType} -P${programmerDev} -b${baud} -v -U flash:w:${src}.flash.hex

メイクファイル

コマンドを覚える代わりに、個人的な好みに合わせてメイクファイルを作成しました。Makefile という名前で保存できます。 (大文字の M に注意してください )。次のように機能します:

  • make makefile makefile を編集します。
  • make edit ソース ファイルを編集します。
  • make flash デバイスのフラッシュ メモリをプログラムします。
  • make help 他のコマンドを挙げてください。

メイクファイルは次のとおりです:

baud=19200
src=project
avrType=attiny2313
avrFreq=4000000 # 4MHz for accurate baudrate timing
programmerDev=/dev/ttyUSB003
programmerType=arduino

cflags=-g -DF_CPU=$(avrFreq) -Wall -Os -Werror -Wextra

memoryTypes=calibration eeprom efuse flash fuse hfuse lfuse lock signature application apptable boot prodsig usersig

.PHONY: backup clean disassemble dumpelf edit eeprom elf flash fuses help hex makefile object program

help:
    @echo 'backup       Read all known memory types from controller and write it into a file. Available memory types: $(memoryTypes)'
    @echo 'clean        Delete automatically created files.'
    @echo 'disassemble  Compile source code, then disassemble object file to mnemonics.'
    @echo 'dumpelf      Dump the contents of the .elf file. Useful for information purposes only.'
    @echo 'edit     Edit the .cpp source file.'
    @echo 'eeprom       Extract EEPROM data from .elf file and program the device with it.'
    @echo 'elf      Create $(src).elf'
    @echo 'flash        Program $(src).hex to controller flash memory.'
    @echo 'fuses        Extract FUSES data from .elf file and program the device with it.'
    @echo 'help     Show this text.'
    @echo 'hex      Create all hex files for flash, eeprom and fuses.'
    @echo 'object       Create $(src).o'
    @echo 'program      Do all programming to controller.'

edit:
    vi $(src).cpp

makefile:
    vi Makefile

#all: object elf hex

clean: 
    rm $(src).elf $(src).eeprom.hex $(src).fuses.hex $(src).lfuse.hex $(src).hfuse.hex $(src).efuse.hex $(src).flash.hex $(src).o
    date

object:
    avr-gcc $(cflags) -mmcu=$(avrType) -Wa,-ahlmns=$(src).lst -c -o $(src).o $(src).cpp 

elf: object
    avr-gcc $(cflags) -mmcu=$(avrType) -o $(src).elf $(src).o
    chmod a-x $(src).elf 2>&1

hex:    elf
    avr-objcopy -j .text -j .data -O ihex $(src).elf $(src).flash.hex
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex $(src).elf $(src).eeprom.hex
    avr-objcopy -j .fuse -O ihex $(src).elf $(src).fuses.hex --change-section-lma .fuse=0
    srec_cat $(src).fuses.hex -Intel -crop 0x00 0x01 -offset  0x00 -O $(src).lfuse.hex -Intel
    srec_cat $(src).fuses.hex -Intel -crop 0x01 0x02 -offset -0x01 -O $(src).hfuse.hex -Intel
    srec_cat $(src).fuses.hex -Intel -crop 0x02 0x03 -offset -0x02 -O $(src).efuse.hex -Intel

disassemble: elf
    avr-objdump -s -j .fuse $(src).elf
    avr-objdump -C -d $(src).elf 2>&1

eeprom: hex
    #avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U eeprom:w:$(src).eeprom.hex
    date

fuses: hex
    avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U lfuse:w:$(src).lfuse.hex
    #avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U hfuse:w:$(src).hfuse.hex
    #avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U efuse:w:$(src).efuse.hex
    date

dumpelf: elf
    avr-objdump -s -h $(src).elf

program: flash eeprom fuses

flash: hex
    avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U flash:w:$(src).flash.hex
    date

backup:
    @for memory in $(memoryTypes); do \
        avrdude -p $(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U $$memory:r:./$(avrType).$$memory.hex:i; \
    done

avrdude を実行する必要があるように思われるかもしれません root として 、それが起こった場合、それ自体が質問を正当化します . udev で解決できます ただし、プログラマーがオペレーティング システムによってどのように認識されるかについて、少し具体的な情報が必要です。

ハローワールド

コントローラーのピン 2 (PB3) (例:ATtiny13、ATtiny45、ATtiny85) を 1Hz でトグルさせる 'Hello World' を投入します。 LED と直列抵抗をピンに接続すると、LED が点滅し始めます。

  • 編集する

i

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  DDRB = 0x08;

  while (1) {
    PORTB = 0x00; _delay_ms(500);
    PORTB = 0x08; _delay_ms(500);
  }
}

<ESC>:wq

  • フラッシュを作る

完了。


AVR GNU ツールを Linux のスタンドアロン パッケージとして使用できます。これらには、avr-gcc、avr-binutils、および avr-libc が含まれます。これがツールチェーンと呼ばれるものです。

16 進ファイルを作成し、それをチップにフラッシュしたい場合は、avrdude を使用できます。

これらはすべて Linux で無料ですぐに利用でき、連携するように構成するのはそれほど難しくありません。

LadyAda には、プロセス全体に関するしっかりとしたステップバイステップのチュートリアルがあります。


Linux
  1. LinuxでBusyBoxを使用する方法

  2. Linuxでcronを使用する方法

  3. Linuxで実行中のプロセスを再起動(またはリセット)する方法は?

  1. LinuxにPythonをインストールする方法

  2. Linux でスレッドを作成する方法 (C サンプル プログラムを使用)

  3. Linuxでプログラムがスタックしている場所を知る方法は?

  1. Ubuntu Linux でスタートアップ プログラムを管理する方法

  2. Linux .dts デバイス ツリー ファイルをプログラムする方法は?

  3. Linux で特定のプログラムのプロセス ID を設定する方法