`
gashero
  • 浏览: 962727 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用AVR-GCC编程Arduino

阅读更多

使用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要弱:

  1. C有准确的执行时间,没有隐藏代码,写什么就执行什么
  2. C更容易访问硬件和中断
  3. 便于在多种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:

  1. ICSP(In-Circuit Serial Programming)
  2. 使用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   注意

  1. 使用的引脚号与Arduino的定义不同

  2. 要使用AVR-GCC的术语访问端口和其他硬件,参考datasheet的SFR(特殊功能寄存器),一些ATmega8的不同于ATmega168/328p

  3. 如果你使用其他零件(ATmega8、ATmega168、ATmega328等),注意修改Makefile的MCU变量

  4. 最近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即可。

  1. (解释如何编译Bootloader,而不是提供预编译的)

  2. 连接到并口编程器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   译者补充

  1. 对于较新的Arduino,常用的芯片ATmega328P对应的器件名字叫"atmega328p"

  2. avrdude烧写时的编程器为"arduino",波特率为57600,即完整命令:

    avrdude -c arduino -p atmega328p -P /dev/tty.SLAB_USBtoUART -b 57600 -F -u -U flash:xxx.hex
0
3
分享到:
评论
3 楼 piedgogo 2014-03-25  
好吧,从你另一个博客追过来的。。。比我做的还乱的前辈啊,求指点啊,软硬都碰的该怎么混啊啊啊
2 楼 gashero 2013-09-17  
ray_linn 写道
。。。任何一本介绍Arduino的书都有这些,不用费老大力翻译了。


好吧,我对AVR是很熟,Arduino一直不太了解,看来做无用功了。
1 楼 ray_linn 2013-09-17  
。。。任何一本介绍Arduino的书都有这些,不用费老大力翻译了。

相关推荐

    AVR-GCC.rar_AVR-GCC_avr g_avr gcc_avr gcc编_gcc avr

    5. **编程与烧录**:编译生成的.hex文件需要通过编程器或调试器(如Arduino IDE中的USB转串口模块)烧录到AVR芯片。AVRDUDE是一个常用的烧录工具,它可以与AVR-GCC一起使用。 6. **优化与大小控制**:由于AVR微控制...

    AVR-GCC学习手记.rar_avr_mcu

    这份手记对于初学者来说,是一个很好的起点,可以帮助他们理解AVR-GCC的使用方法,进一步掌握AVR微控制器的编程技术。对于有经验的开发者,它也可以作为一个参考,帮助解决特定问题或回顾基础知识。通过深入学习和...

    oled-51-avr-430-arduino-stm32-pic程序

    标题中的“oled-51-avr-430-arduino-stm32-pic程序”揭示了这个压缩包涉及的主要内容,即使用OLED显示模块在几种不同的微控制器平台上实现SPI通信的程序。OLED(有机发光二极管)显示器是一种高效、高对比度的显示屏...

    gcc-avr 程序包

    `gcc-avr`程序包是为AVR...在实际项目中,开发者需要结合这些知识点,使用`gcc-avr`编译器编写程序,配置AVR微控制器的各种功能,实现特定的应用需求。通过理解这些概念和实践,可以有效地进行嵌入式系统的开发和调试。

    avr系列单片机gcc免费编译软件

    GCC是全球最广泛使用的编译器之一,支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada和Go等,而在AVR领域,它主要用于C和C++。 AVR单片机是由Atmel公司(现已被Microchip Technology收购)开发的一系列高...

    avr单片机与gcc编程

    在AVR单片机开发中,我们通常使用GCC的AVR版本,即AVR-GCC,来将高级语言代码转换为AVR单片机可以执行的机器码。 AVR单片机与GCC编程涉及到以下几个核心知识点: 1. **AVR汇编语言**:虽然AVR-GCC支持高级语言编程...

    homebrew-avr:Homebrew AVR工具链

    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-...

    AVR-Assistant:Bash 脚本,用于帮助使用 avr-gcc 和 avrdude 编译和上传您的 AVR-C

    5. **集成开发环境(IDE)支持**:虽然 AVR-Assistant 是一个独立的脚本工具,但它可以与常见的 AVR 开发 IDE(如 Atmel Studio、Eclipse 或 Arduino IDE)结合使用,提供更强大的功能。通过将 AVR-Assistant 集成到...

    2021-AVR-IDE-GCC-10:MyIDE替代WINAVR。 欢迎希望从Arduino-IDE转向纯C ++的用户

    从AVR-GCC 10.1.0创建的MyIDE(工作方式类似于WINAVR) 这是MyIDE的Beta版,适用于高级Arduino-IDE 用户。 MyIDE不能替代WINAVR。 这只是一种新方法。 MyIDE包含适用于Windows 64位的AVR-GCC 10.1.0 程序员的记事本2...

    AVR-C-Programming:使用Arduino Uno R3进行AVR-C编程

    通过以上知识点的学习和实践,你可以熟练掌握使用Arduino Uno R3进行AVR-C编程,从而创建各种创新的嵌入式系统项目。记住,实践是提高技能的关键,不断尝试和解决问题将使你在这个领域更加精通。

    sha204_playground:通过 AVR 芯片(用于 Arduino 或纯 avr-gcc 的固件)+ python 脚本 a-la hashlet 与 ATSHA204 芯片交互

    为我写这些东西的最初动力是我有几个来自的 ATSHA204 分线板,我想在 Arduino 之外使用它们,只使用 avr-gcc 和 ,在一些带有 ATMEL 芯片的 USB 记忆棒上。 这是其中两个的照片: 和 matrixstorm 的与相同的 Spark

    AVR单片机GCC 程序设计/GCC AVR入门详解/GCC AVR入门源码

    AVR单片机GCC程序设计是嵌入式系统开发中的一个重要环节,主要涉及的是使用GNU Compiler Collection (GCC)工具链来编写、编译和调试针对AVR微控制器的C语言程序。GCC是一款强大的、开源的编译器,支持多种处理器架构...

    Quadcopter-Homemade:自制四轴飞行器 Atmega2560、IMU MPU6050、PID 控制和姿态计算 DCM 矩阵。 使用 Atmel Studio 6 在 AVR-GCC 中编程

    使用 Atmel Studio 6 在 AVR-GCC 中编程。 组件: 框架:Q450 电机:Turnigy D2836/9 950Kv 螺旋桨:10x4.5 ESC:Turnigy Plus 30A 微控制器:Atmega2560 (ArduinoMega) IMU:MPU6050 TWI 电平转换器特征: 首先,...

    arduino-1.8.13-windows

    它使用avr-gcc编译器,能检查代码语法错误和类型匹配问题。 4. **上传工具**:通过USB或串口连接Arduino板,IDE可以将编译后的固件安全地上传到板子上,无需手动配置复杂的命令行工具。 5. **板型选择**:支持多种...

    twidisplay:用于Akafugu 7段TWI显示的固件,Arduino库和AVR-GCC库

    电视剧适用于Akafugu 7段TWI显示的固件,Arduino库和avr-gcc库。 有关更多详细信息,请参页面。Arduino库Arduino库位于TWIDisplay子目录中。 要使用此库,您首先需要Arduino IDE。 在获取它。 为了使用该库,您必须...

    ArduinoCore-avr:官方 Arduino AVR 内核

    4. **工具链支持**:ArduinoCore-avr包含了编译和上传固件所需的工具链,如avr-gcc编译器、avr-libc库、avrdude编程工具等。这些工具负责将源代码编译成适合AVR微控制器执行的二进制文件,并通过USB或串口将其烧录到...

    Digispark Arduino IDE 安装环境

    5. **烧录固件**:使用 Arduino IDE 的 "上传" 功能,可以将编译后的程序烧录到 Digispark 的闪存中,实现对微控制器的编程。 6. **开发环境配置**:在 Arduino IDE 中,需要正确设置开发板类型(Board)为 ...

    ATmega8自烧录方法

    - **编程应用代码**:编写你的应用程序代码,同样使用AVR-GCC编译生成.hex文件。 - **上传应用代码**:使用AVRDUDE通过串口上传.hex文件到ATmega8,Bootloader会将新程序写入闪存。 5. **安全考虑**: 自烧录时...

    Linux下的MCU开发之AVR系列1_附件

    烧录阶段,我们需要使用AVR的编程器,如USBasp或Arduino作为ISP(In-system programmer)。在Linux下,可以使用avrdude工具来完成这个过程: ```bash avrdude -c usbtiny -p m328p -U flash:w:main.hex:i ``` 这里...

    SDI-12-ATTiny84a:用于 Atmel ATTiny84a mcu 的 SDI-12 协议,用于仅在 AVR-GCC 代码中工作

    用于 Atmel ATTiny84a mcu 的 SDI-12 协议,专为仅在 AVR-GCC 代码中工作而构建。 这是一个基于项目的端口,最初由 StroudCenter 开发。 该项目的重点是将 StroudCenter 的 SDI-12 实现移植到 ATTiny84a 的非 ...

Global site tag (gtag.js) - Google Analytics