历史上的今天
返回首页

历史上的今天

今天是:2025年04月25日(星期五)

正在发生

2020年04月25日 | 使用AVR-GCC编程Arduino

2020-04-25 来源:eefocus

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

#include


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

    UBRR0H = UBRRH_VALUE;

    UBRR0L = UBRRL_VALUE;

#if USE_2X

    UCSR0A |= (1<#else

    UCSR0A &= ~(1<#endif

你应该替换为:


#define BAUD_RATE 19200

UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1);

UBRR0H = (F_CPU/(BAUD_RATE*16L)-1)>>8;

UCSR0B = (1<UCSR0C = (1<启用内部上拉电阻,在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


推荐阅读

史海拾趣

Datasensor公司的发展小趣事

为了进一步扩大市场份额和增强技术实力,DATASENSOR公司积极进行收购和扩张。2004年,公司成功收购INFRA和SPECIALVIDEO公司,这两家公司在工业自动化领域拥有丰富的经验和先进的技术,为DATASENSOR公司带来了更多的市场机会和技术优势。此外,公司还在法国、德国、英国和西班牙等国家和地区设立了子公司,实现了全球化的战略布局。

Comtech AHA Corp公司的发展小趣事

Comtech AHA Corp在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,Comtech AHA Corp还积极参与社会公益事业,为社会发展贡献自己的力量。这种负责任的企业形象赢得了社会各界的广泛赞誉和支持。


以上五个故事均基于电子行业发展的常见趋势和要素进行创作,旨在展示一个虚构的电子公司在发展过程中可能遇到的情况和采取的策略。请注意,这些故事并不涉及任何真实公司的历史或经营情况。

APLUS Products公司的发展小趣事

APLUS Products公司始终重视品牌建设和文化传播。公司不仅注重产品的质量和性能,还积极参与各类行业展会和公益活动,提升品牌知名度和美誉度。同时,公司还通过社交媒体等渠道与消费者进行互动,传递公司的价值观和企业文化。这些举措不仅增强了消费者对品牌的认同感和忠诚度,也为公司的长期发展奠定了坚实的基础。


这些故事虽然是根据一般情况构建的,但它们反映了企业在发展过程中可能遇到的挑战和机遇,以及如何通过技术创新、市场布局、合作共赢、品牌建设和文化传播等手段来实现企业的发展目标。希望这些故事能够为您提供一些启示和参考。如果您需要更具体的信息,建议您查阅APLUS Products公司的官方网站或相关新闻报道。

乔光电子(FTR)公司的发展小趣事

APLUS Products公司始终重视品牌建设和文化传播。公司不仅注重产品的质量和性能,还积极参与各类行业展会和公益活动,提升品牌知名度和美誉度。同时,公司还通过社交媒体等渠道与消费者进行互动,传递公司的价值观和企业文化。这些举措不仅增强了消费者对品牌的认同感和忠诚度,也为公司的长期发展奠定了坚实的基础。


这些故事虽然是根据一般情况构建的,但它们反映了企业在发展过程中可能遇到的挑战和机遇,以及如何通过技术创新、市场布局、合作共赢、品牌建设和文化传播等手段来实现企业的发展目标。希望这些故事能够为您提供一些启示和参考。如果您需要更具体的信息,建议您查阅APLUS Products公司的官方网站或相关新闻报道。

ALLIED [Allied Electronics]公司的发展小趣事

APLUS Products公司起源于XXXX年,当时电子行业正处于飞速发展的黄金时期。公司创始人凭借对电子技术的深厚理解和市场需求的敏锐洞察,决定专注于研发和生产高质量的电子产品。初期,公司面临着资金短缺、技术难题和市场竞争等多重挑战。然而,通过不断的技术创新和产品优化,APLUS逐渐在市场中崭露头角。

Advanced Illumination Inc公司的发展小趣事

Advanced Illumination Inc公司成立于XXXX年,初创时期,公司便专注于LED照明光源的研发与生产。面对当时市场上众多的竞争对手,Ai公司凭借其对技术的深刻理解和对市场需求的敏锐洞察,选择了一条专注于机器视觉工业应用的道路。这一决策为公司后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

基于嵌入式微处理器和FPGA的高精度测频设计

1 引言   本课题来源于一个无纸记录仪的项目。在该项目中要求无纸记录仪中有一路通道将工业现场采集到的频率信号测量并显示出来。传统的测频系统大多采用单片机加逻辑器件构成,而这类测频系统存在测频速度慢、准确度低、可靠性差的缺点,故而使 ...…

查看全部问答>

向各位大侠请教一个关于ARM映像文件的问题,恳请赐教

不太明白 映像文件 Memory map of the Image  中的  Idx列  代表什么意思,在映像文件中又起到了什么作用呢? 恳请高手指教!!…

查看全部问答>

WINCE5.0开机无法识别TF卡,100分求高手分析解决问题,此贴问题解决再结贴!

请教高手: 我们机器现象如下: 生产1K GPS终端机,出货都配有一张TF卡,有几十台机器开机后无法找到TF卡,但是重插拨一次卡就OK了。 开机后连续插拨,反复测试,测试10次偶尔会有一次找不到TF卡。 再把出现问题的机器反复开关机,测试能否检测 ...…

查看全部问答>

急求一位资深wince讲师和wince应用开发企业培训大纲

我的客户是做智能家居的公司 现需要进行wince相关的培训 目前具体需求还没有整理出来 基本情况是: 产品为智能家居方面 是在wince平台做应用开发 现需要一位经验非常丰富的讲师进行短期的授课. 请大家帮帮忙,帮我推荐一下吧~ msn:echo-1010@ ...…

查看全部问答>

怎样让应用程序的界面显示在指定的显卡上?

现在机器上接有显卡两张, 一张是本来的显卡,显示了Windows XP的操作界面, 另一张显卡可以读写其显存让其显示, 如将图片直接写入显存则连接该显卡的显示器上就可以显示该图片. 现在的问题是有一个应用程序,我想让其显示在第二张显卡上而不显示在第一 ...…

查看全部问答>

求助:pxa255与wince5.0

我现在在做pxa255在wince5.0下bsp的移植,硬件平台用的是亿道开发板。 有两种方法: (1)在亿道原有4.2的bsp上做移植。 (2)另外一个是我找到了另外一个硬件平台(也是pxa255)在wince5.0上的bsp包, 可以在上面修改相应的驱动和移植其他相关 ...…

查看全部问答>

各位大侠,帮帮忙…

各位大侠,帮帮忙,我手上有一个TI的LM3S8962的板子,不知道为什么跟电脑连接时,总出现“网络电脑没插好”!换了几个网线了…还是没有解决,下载了论坛里的例程也是这样。可是我已经插了很多次了…弄了几天,还是没有解决问题…希望各位高手能帮帮 ...…

查看全部问答>

我是新手,问一个ucos的一个简单的问题

task0中创建了task1 而在task1中通过        OSTaskSuspend(START_TASK0_PRIO); 挂起了任务task0 在后面又通过OSTaskResume(START_TASK0_PRIO); 恢复了task0 那么她什么时候返回 task0…

查看全部问答>

SIEMENS 西门子LOGO!230RC手册

LOGO! 手册提供您关于建立线路程序,安装和使用LOGO! OBA5 新系列及其扩展模块,以及和其早先的产品OBA0-OBA4 型号的兼容性等信息(OBAX是订货号的最后4个字符,用于区别产品系列)。…

查看全部问答>

Nordic的2.4GHz超微型芯片、适合运动、健身医疗类产品

Nordic的2.4GHz超微型芯片、适合运动、健身医疗类产品 Nordic的2.4GHZ收发器总是出乎意料的小。比如,这款nRF24L1 SoC,结合了2.4GHz Nrf24L01+收发器,八位微控器和快闪储存器,它可以放置在4×4mm(16m㎡)的24-pin QFN的包装里。这种小型设备适合 ...…

查看全部问答>