使用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的软件为主要目的。
目录
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 <avr/io.h> #include <util/delay.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 avrdude
C库的手册在 /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.hex
2.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则用 -p m8 。
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 <util/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<<RXEN0) | (1<<TXEN0); UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);
启用内部上拉电阻,在D0(RX),来降低线路噪声:
DDRD &= ~_BV(PIND0); PORTD |= _BV(PIND0);
4 使用ICSP烧写Bootloader
本节针对你的设备是空的,没有Bootloader。已经有Arduino Bootloader的可以直接跳过不看。一个简单的检查是否有Bootloader的方法是复位后PIN13的等会闪3次。
4.1 什么是Bootloader
Bootloader是一种在特定存储区域的程序(bootloader区),其基本任务是接收新的固件,并存储到AVR的Flash存储器(程序存储器)。每个Bootloader都是针对特定设备的,使用特殊的协议。所有这些配置参数必须与主机编程器匹配(avrdude)。avrdude可以用多种类型的协议,支持多种连接(串口、并口、USB、...)。
一个例子是ATmega168在16MHz,stk500v1协议,19200-8N1串口的Bootloader:http://www.javiervalcarce.eu/pub/avr/ATmegaBOOT_168_ng.hex 。
按照如下步骤来烧写到AVR设备。更换其他操作系统,如Windows就是将 /dev/parport0 替换为LPT1,并安装giveio.sys即可。
-
(解释如何编译Bootloader,而不是提供预编译的)
-
连接到并口编程器dapa和ICSP,然后供电:
$ # write the following fuse bits: efuse=0x00, hfuse=0xdd, lfuse=0xff $ # write the following fuse bits: lock=0x3f (unlock boot section) $ avrdude -c dapa -p m168 -P /dev/parport0 115000 -U flash:w:ATmegaBOOT_168_ng.hex $ # write the following fuse bits: lock=0x0f (lock boot section)
在烧写镜像之前,先把熔丝设置成:使用外部晶振、禁用时钟分频、最大化Bootloader段等。然后烧写ATmegaBOOT_168_ng.hex到AVR。对于熔丝位,参考手册。
要访问并口,必须在 lp 组,修改 /etc/group 并退出会话来让改变生效。
4.2 读取熔丝位
$ avrdude -c dapa -p m168 -P /dev/parport0 115000 -U efuse:r:-:h #read efuse $ avrdude -c dapa -p m168 -P /dev/parport0 115000 -U hfuse:r:-:h #read hfuse $ avrdude -c dapa -p m168 -P /dev/parport0 115000 -U lfuse:r:-:h #read lfuse $ avrdude -c dapa -p m168 -P /dev/parport0 115000 -U signature:r:-:h #读取设备签名
最后一个命令仅用于确认数据线正确连接。ATmega168的签名是0x1e, 0x94, 0x06。
4.3 写入熔丝位
$ avrdude -c dapa -p m168 -P /dev/parport0 115000 -U efuse:w:0xff:m #写0xff到efuse $ avrdude -c dapa -p m168 -P /dev/parport0 115000 -U hfuse:w:0xff:m #写0xff到hfuse $ avrdude -c dapa -p m168 -P /dev/parport0 115000 -U lfuse:w:0xff:m #写0xff到lfuse
5 译者补充
-
对于较新的Arduino,常用的芯片ATmega328P对应的器件名字叫"atmega328p"
-
avrdude烧写时的编程器为"arduino",波特率为57600,即完整命令:
avrdude -c arduino -p atmega328p -P /dev/tty.SLAB_USBtoUART -b 57600 -F -u -U flash:xxx.hex
相关推荐
中断 频率可变pwm波 占空比可变pwn波 矩阵键盘 定时器
AVR是受欢迎的微控制器家族,例如在项目中使用。 当前版本 GCC 9.3.0- default ,以avr-gcc或avr-gcc@9 GCC 8.4.0-作为avr-gcc@8 GCC 10.2.0-作为avr-gcc@10 Binutils 2.35.1-作为avr-binutils AVR Libc 2.0.0-...
Arduino的AVR工具链这是使用的AVR工具链。 Atmel推出,我们将提取源代码,并用一些用户贡献的补丁对其进行修补,并通过交付。 因此,生成的二进制文件可能与Atmel的二进制文件有显着差异。 如果事情没有按预期运行,...
为我写这些东西的最初动力是我有几个来自的 ATSHA204 分线板,我想在 Arduino 之外使用它们,只使用 avr-gcc 和 ,在一些带有 ATMEL 芯片的 USB 记忆棒上。 这是其中两个的照片: 和 matrixstorm 的与相同的 Spark
从AVR-GCC 10.1.0创建的MyIDE(工作方式类似于WINAVR) 这是MyIDE的Beta版,适用于高级Arduino-IDE 用户。 MyIDE不能替代WINAVR。 这只是一种新方法。 MyIDE包含适用于Windows 64位的AVR-GCC 10.1.0 程序员的记事本2...
使用 Atmel Studio 6 在 AVR-GCC 中编程。 组件: 框架:Q450 电机:Turnigy D2836/9 950Kv 螺旋桨:10x4.5 ESC:Turnigy Plus 30A 微控制器:Atmega2560 (ArduinoMega) IMU:MPU6050 TWI 电平转换器特征: 首先,...
这个包里包含了离线安抓Digispark的所有文件,包括驱动
电视剧适用于Akafugu 7段TWI显示的固件,Arduino库和avr-gcc库。 有关更多详细信息,请参页面。Arduino库Arduino库位于TWIDisplay子目录中。 要使用此库,您首先需要Arduino IDE。 在获取它。 为了使用该库,您必须...
用于 Atmel ATTiny84a mcu 的 SDI-12 协议,专为仅在 AVR-GCC 代码中工作而构建。 这是一个基于项目的端口,最初由 StroudCenter 开发。 该项目的重点是将 StroudCenter 的 SDI-12 实现移植到 ATTiny84a 的非 ...
AVR-以太网-W5100 适用于AVR ATMega设备的Wiznet 5100库特征兼容Arduino硬件(已通过Arduino Uno和Arduino以太网屏蔽测试) 小代码量(Arduino 1.6.5 Web服务器示例使用12576字节的程序存储空间,570字节的内存)。...
Arduino飞控相关资料,包括ArduPilot-Arduino-1.0.3-gcc-4.8.2-windows、How to Build Ardupilot with Arduino开发文档、MHV_AVR_Tools_20131101,所有资料均来自于ardupilot官网
S avr-gcc avr-libc avrdude python-pip Ubuntu sudo apt-get install binutils gcc-avr avr-libc avrdude python3-pip操作系统,或者如果您不想安装系统软件包,则可以使用Arduino IDE附带的二进制文件。...
nrf24l01 准骨AVR nRF24L01 +驱动程序,为avr-gcc编写。 该库的设计规模很小: 故意省略便利功能(例如... 不使用Arduino库(例如SPI)。 已在ATmega328p上进行了测试。 可能需要进行修改才能针对其他AVR MCU进行编译。
AVR-编码器和按钮 为读取的正面按钮和编码器而编写的 AVR 代码。...代码使用arduino板,但代码是用AVR C为avr-gcc编写的。 编译: avr-gcc.exe -Wall -mmcu=atmega328p -DF_CPU=16000000UL -Os -I"path_to_avr/incl
ArduPilot-Arduino-1.0.3-gcc-4.7.2-windows,MHV_AVR_Tools_20121007,MissionPlanner-1.3.38,Git-1.8.4-preview20130916,ArduPilot-Arduino-1.0.3-windows,arduino-ide_nightly-20230527_Windows_64bit,JRE - ...
使用较新的avr-gcc版本,例如9.xx ? 使用一个很棒的从cli编译并上传您的代码? 如果您对以上任一回答是肯定的,那么这个就是您想要的! :) 你得到什么 根据我们从中学到的知识,此存储库将使您能够: 离开...
一个 ATMega32u4(或任何带有内置 USB 的 AVR)微控制器(Arduino Leonardo 或中国仿冒品) 连接到 AVR 的 16 MHz 时钟。(这是Arduinos的标准) WinAVR 或带有 avr-gcc 的 unix。 要编程运行 make 并通过 avrdude ...
中断驱动的USART(RS232)库,用于AVR微控制器,支持多个硬件UART,使用环形缓冲区进行接收/发送。 专为资源有限的实时或高吞吐量应用而设计。 特征 最多支持4个USART的可选支持 多达255个字节的FIFO 除每个已实现...
与avr-gcc一起使用的一组摇动构建动作,作为Atmel微控制器的项目构建工具(特别是那些基于“ AVR”指令集的动作,其中包括原始Arduino使用的“ ATmega”系列)。 基本部分可能适用于任何GCC设置,但实际上并不十分...
不使用Arduino IDE / API,而直接使用avr-as / avr-gcc / avrdude。 开发环境: 操作系统:CentOS7 汇编程序:avr-as C编译器:avr-gcc 程序员:avrdude 硬件:Arduino Uno R3 更加艰难地学习Arduino。 从头...