AVR-如何在Linux中对AVR芯片进行编程


22

我最近有一个AVRISmkII AVR程序员,并且我有一个ATtiny85和ATmega328。我想知道如何(与程序员一起)对这些芯片进行编程,但是当我尝试获取Atmel Studio 6时,它仅适用于Windows。有什么方法可以在Linux(特别是Ubuntu)中使用吗?蚂蚁建议?谢谢!

Answers:


36

我没有时间进行全面的解释,但是我可以为您提供食谱风格的命令,这些命令是我在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
  • 第二步是创建一个ELF文件: avr-gcc ${cflags) -mmcu=${avrType) -o ${src).elf ${src).o
  • 第三步是创建一个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,您可以将其保存为名称Makefile(请注意大写M)。其工作方式如下:

  • make makefile 编辑makefile;
  • make edit 编辑源文件;
  • make flash 编程设备的闪存;
  • make help 列出其他命令。

这是makefile:

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但需要一些有关操作系统如何识别编程器的特定信息。

你好,世界

让我抛出一个“ Hello World”,它使控制器引脚2(PB3)(例如ATtiny13,ATtiny45,ATtiny85)以1Hz的频率切换。将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

  • 使闪光

做完了


2
明确的Hello World教程!
Vorac

11

您可以在Linux中将AVR GNU工具用作独立软件包。这些包括avr-gcc,avr-binutils和avr-libc。这就是所谓的工具链。

构建了十六进制文件并希望将其闪存到芯片上后,就可以使用avrdude了。

所有这些都可以在Linux上免费轻松获得,并且配置起来可以很容易地协同工作。

LadyAda 在整个过程中都有详尽的分步教程


0

要在Ubuntu中开发AVR,只需执行以下几个步骤:

安装工具链

sudo apt-get install gcc-avr binutils-avr gdb-avr avr-libc avrdude

创建一个Hello World代码并保存:

#include<avr/io.h>
#define F_CPU 8000000UL
#include<util/delay.h>
int main() {
    DDRB = 0xff; // make PORTB as O/P   
    PORTB = 0xFF;
    while(1) {
        PORTB |= (1 << 0);               
        _delay_ms(100); 
        PORTB &= ~(1 << 0);     
        _delay_ms(100); 
    }
}

下载临时文件Makefile 并保存在保存hello_world.c文件的目录中。

编辑Makefile

# MCU name (Specify the MCU you are using)
MCU = atmega16
# Processor frequency.
F_CPU = 8000000
# Target file name (without extension).
#in this case file name is hello_world
TARGET = main

建立目标

只需输入make控制台,然后按Enter。

使用avrdude将指令上传到AVR

在控制台中使用以下命令:(假设您使用的程序员是usbasp,google或其他手册,请参见手册)

$avrdude -c m16 -p usbasp -U flash:w:hello_world.hex
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.