使用AVR-GCC编程Arduino原文标题:Program Arduino with AVR-GCC作者:Javier Valcarce译者:gashero日期:2013-09-16地址:http://www.javiervalcarce.eu/wiki/Program_Arduino_with_AVR-GCC本文展示如何在Arduino IDE以外使用AVR-GCC给Arduino写程序,包括烧写引导器和设置熔丝。译者注:Arduino给新手提供了很大便利,但是稍微深入的应用,如定时器和详细硬件控制就很麻烦了。可同时Arduino的硬件做的是很不错的。所以本文以使用Arduino的硬件,但不使用Arduino的软件为主要目的。目录1 闪耀LED例子2 编译和上传2.1 通过Bootloader上传2.2 不通过Bootloader,而是用并口编程器2.3 不通过Bootloader,而是用AVR ISP MK-II编程器3 注意4 使用ICSP烧写Bootloader4.1 什么是Bootloader4.2 读取熔丝位4.3 写入熔丝位5 译者补充Arduino是IDE和硬件平台,IDE以Java编写,并使用Processing语言。这对新手是个好主意,因为简化了开发,但是也比C要弱:C有准确的执行时间,没有隐藏代码,写什么就执行什么C更容易访问硬件和中断便于在多种MCU之间移植本文编译和上传一个简单的纯C程序(使用avr-libc),而不用Arduino IDE。只需要终端、文本编辑器、AVR-GCC工具链。1 闪耀LED例子从让Arduino引脚13的LED闪耀开始(实际是闪耀PORTB的所有位)。创建个文件夹来存放项目,并创建文件blink.c#include
io.h>
#include <utildelay.h>
int main(void) {
unsigned char counter;
DDRB=0xff; //设置PORTB输出
while(1) {
PORTB=0xff; //设置PORTB为高
counter=0;
while(counter!=50) {
_delay_loop_2(30000);
counter++;
}
PORTB=0x00;
counter=0;
while(counter!=50) {
_delay_loop_2(30000);
counter++;
}
}
return 1;
}2 编译和上传将Arduino连接到USB口之后,Linux-2.6会自动载入FTDI驱动ftdi_sio.ko$ dmesg
...
usb 3-2: FTDI USB Serial Device converter now attached to ttyUSB0
usbcore: registered new interface driver ftdi_sio
drivers/usb/serial/ftdi_sio.c: v1.4.3:USB FTDI Serial Converters Driver工具链(编译器/连接器/汇编器、标准C库和编程工具)包含在三个包中:$ apt-get install gcc-avr avr-libc avrdudeC库的手册在/usr/share/doc/avr-libc/avr-libc-user-manual/index.html。建议仔细看看file:///usr/share/doc/avr-libc/avr-libc-user-manual/group__demo__project.html。其末尾有个Makefile,可供定制到自己所需。改变程序名到 blink 并编译:$ make这会生成blink.hex,也就是要上传的镜像。有两种凡是可供上传到Arduino:ICSP(In-Circuit Serial Programming)使用Bootloader,消耗2KB的程序存储器第二个选项并不严格要求。实际上,第一个选项也并没有绝对优势。除非你只需要一个USB线,而不是两个。2.1 通过Bootloader上传此时AVR程序存储器已经包含了Bootloader,烧写blink.hex。确保熔丝的BOOTRST=0,如果不是,Bootloader在复位后不会启动。$ avrdude -p m168 -P /dev/ttyUSB0 -c stk500v1 -b 19200 -F -u -U flash:w:blink.hex2.2 不通过Bootloader,而是用并口编程器如果不用Bootloader,直接烧写blink.hex,通过并口编程器。要确保熔丝的BOOTRST=1,如果不是,程序在复位后不会执行(后面章节会解释如何设置熔丝):$ avrdude -p m168 -P /dev/parport0 -c dapa -b 115000 -F -u -U flash:w:blink.hex如果你使用ATmega8则用-pm8。2.3 不通过Bootloader,而是用AVR ISP MK-II编程器要使用这种方法,你需要一个mkII编程器(约30欧元),并连接到Arduino,通过ICSP连接器。在AVR Studio IDE,通过 [Tool]=>[Program AVR]=>[Connect ...] 来选择AVR ISP mkII编程器,USB连接,并选择Flash镜像,最后点击 [Program] 按钮。3 注意使用的引脚号与Arduino的定义不同要使用AVR-GCC的术语访问端口和其他硬件,参考datasheet的SFR(特殊功能寄存器),一些ATmega8的不同于ATmega168/328p如果你使用其他零件(ATmega8、ATmega168、ATmega328等),注意修改Makefile的MCU变量最近Arduino转到ATmega328了,兼容ATmega168,但有更多程序空间,而avr-libc@2009-01-01并不支持ATmeag328,编程工具的串口也不工作:#define BAUD 19200
#include
setbaud.h>
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
#if USE_2X
UCSR0A |= (1<<U2X0);
#else
UCSR0A &= ~(1<<U2X0);
#endif你应该替换为:#define BAUD_RATE 19200
UBRR0L = (uint8_t)(F_CPU(BAUD_RATE*16L)-1);
UBRR0H = (F_CPU/(BAUD_RATE*16L)-1)>>8;
UCSR0B = (1<
<<<>这里<<-参与讨论ITeye推荐—软件人才免语言低担保 赴美带薪读研!—