我最近有一个 AVRISmkII AVR 编程器,我有一个 ATtiny85 和 ATmega328。我想知道如何(使用程序员)对这些芯片进行编程,但是当我尝试获取 Atmel Studio 6 时,它仅适用于 Windows。有没有一种方法可以在 Linux(特别是 Ubuntu)中使用?蚂蚁建议?谢谢!
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
- 第二步是创建一个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
编辑生成文件;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
但需要操作系统识别程序员的一些特定信息。
你好世界
让我加入一个“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
- 制作闪光
完毕。
您可以将 AVR GNU 工具用作 linux 中的独立软件包。其中包括 avr-gcc、avr-binutils 和 avr-libc。这就是所谓的工具链。
一旦你建立了一个 hex 文件并且你希望将它闪存到你的芯片上,你可以使用 avrdude。
所有这些都可以在 Linux 上免费且容易地获得,并且配置起来一起工作并不难。
LadyAda对整个过程有一个坚实的分步教程。
在 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
文件的同一目录中。
编辑生成文件:
# 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
在控制台中输入并回车即可。
使用 avrdude 将指令上传到 AVR
在控制台中使用命令为:(假设您使用的程序员是 usbasp、google 或查看手册了解其他选项)
$avrdude -c m16 -p usbasp -U flash:w:hello_world.hex