历史上的今天
返回首页

历史上的今天

今天是:2025年03月17日(星期一)

正在发生

2020年03月17日 | 初尝Linux下的AVR单片机开发

2020-03-17 来源:eefocus

此前接触过AVR单片机,发现无论是书店里面的教材,还是网上一大堆的中文资料,无一例外都是说windows下使用WinAVR、ICCAVR之类的,Linux方面的简直只字不提,难道这就是传说中的中国国情?外国情况可很不一样,玩单片机的Geek一般都很哈Linux,做单片机开发的软件一应俱全,当然还是开源的。


昨天从淘宝重新买了条USB的下载线,回来一看是USBasp的设计,附送的光盘当然也是win下的驱动和说明了,忽略。


插上下载器,lsusb,认倒是认出来了,叫做VOIT,那怎么用呢?上网一搜,原来USBasp是德国人的设计http://www.fischl.de/usbasp/,GPL的,其中提到AVRDUDE支持USBasp,当然也有源码下载。不过我用的是Ubuntu,发挥超级牛力的时候到了:sudo apt-get install avrdude,恩,几秒钟搞定,让他们去编译吧!


Linux下做单片机开发当然首选GCC,就如这些英文教程说的,下载源码?No,No,APT has Super Cow Powers,继续sudo apt-get install gcc-avr binutils-avr avr-libc


几分钟装完,很好,估计那些下载源码回来编译的同学要去喝两个小时茶才能用了。


万事俱全,先写个单片机的HelloWorld,借用micahcarrick的源码:



#define F_CPU 1000000UL  /* 1 MHz CPU clock */

 

#include

#include

 

int

main (void)

{

        DDRC = _BV (PC0);               /* PC0 is digital output */

 

        while (1)                       /* loop forever */

        {

                /* set PC0 on PORTC (digital high) and delay for 500mS */

                PORTC &= ~_BV(PC0);                

                _delay_ms(500);

 

                /*  PC0 on PORTC (digital 0) and delay for 500mS */

                PORTC |= _BV(PC0);

                _delay_ms(500);

        }

 

        return (0);

}



....保存为toggle_led.c


命令时间:


 avr-gcc -mmcu=atmega48 -Wall -Os -o toggle_led.o toggle_led.c

是不是似曾相识?平时用gcc就这么用的,这里除了把gcc改成avr-gcc,没多大区别。-mmcu定义了目标CPU的类型,我用的是atmega48;-Os是优化选项,减少程序的大小。这就是传说中的交叉编译。


接着把目标代码翻译成可以烧录到芯片上的hex文件:


 avr-objcopy -j .text -j .data -O ihex toggle_led.o toggle_led.hex

avr-objcopy的-j参数限定转换的程序段,-O设定hex的输出格式,ihex即Intel Hex file


[Update: 本例子中,-j .data这个选项没作用,因为.data区根本没有数据;.data是存放初始化数组、字符串等数据的段,如果程序用到了,记得加上]


搞定,开烧:


 sudo avrdude -p m48 -c usbasp -e -U flash:w:toggle_led.hex

因为直接读写USB接口,所以不给权限的话会提示找不到编程器,当然配置USB权限最好,这里暂时用sudo。avrdude的-p指定目标CPU,-c指定下载器,如果不知道所用的下载器是什么型号,敲avrdude -c会列出所有支持的下载器型号及其描述。-e即烧录前清空,-U参数指定刷写类型以及刷写文件。


[Update:可参考virtualbox使用usb的配置,把当前用户加入usbfs组,就可以直接使用avrdude了]


回车后下载器的指示灯闪了下,跟着单片机上的小灯开始闪烁,Hi, Hello World.


当然问题不是完全没有,我用avrdude下载完后默认的校验老是无法通过,说读取错误,只好加个-V来跳过校验。可能跟个别机器有关。


当然实际开发很少这样敲一大堆命令来编译程序,一般都用Make搞定。


对比起Win下满是GUI的程序,我第一次接触WinAVR都搞了半天,如何如何配置一个Project,哇那个属性窗口真让人眼花缭乱,使用gcc来开发,则可以循序渐进,未了解到的参数就不用,简洁,明了,但不失其功能强大。


资源:


USBasp主页:http://www.fischl.de/usbasp/

AVR-GCC Programming Guide:http://electrons.psychogenic.com/modules/arms/art/3/AVRGCCProgrammingGuide.php

Linux Atmel AVR Tutorial:http://paul.graysonfamily.org/thoughts/avrlinux/

Micah Carrick -- AVR(非常推荐,但是需要翻墙) :http://www.micahcarrick.com/category/avr-microcontrollers

AVR Libc User ManualLib Reference: http://www.nongnu.org/avr-libc/user-manual/index.html


推荐阅读

史海拾趣

Crameda Intersys公司的发展小趣事

Crameda Intersys公司非常重视人才的培养和引进。公司建立了完善的人才培养机制,通过内部培训和外部引进相结合的方式,不断提升员工的专业技能和创新能力。同时,公司还积极营造创新氛围,鼓励员工提出新的想法和解决方案。这些措施有效地激发了员工的创新热情,为公司的发展提供了源源不断的人才支持。

GardTec Inc公司的发展小趣事

背景:GardTec Inc公司,成立于1987年(也有资料显示为1985年),自创立之初便确立了成为全球风扇配件产品第一供应商的目标。这一明确的定位为公司后续的发展奠定了坚实的基础。

发展:在创立初期,GardTec专注于风扇配件的研发与生产,通过技术创新和品质提升,逐渐在行业内崭露头角。公司利用现代化的制造和工程设施,不断突破设计与材料的限制,推出了一系列具有创新性的风扇配件产品。

影响:随着产品质量的提升和市场份额的扩大,GardTec逐渐在电子行业中建立了良好的口碑,为后续的快速发展奠定了基础。

Diconex公司的发展小趣事

在电子行业中,Diconex公司始终坚持以客户需求为导向的市场定位策略。公司深入调研市场需求,针对不同客户群体推出定制化解决方案。这种精准的市场定位使得Diconex的产品能够更好地满足客户需求,赢得了客户的信任和忠诚。同时,公司还积极拓展国际市场,与全球知名企业建立了长期稳定的合作关系。

Acmelux Taiwan Inc公司的发展小趣事

在电子产品市场竞争激烈的今天,品质成为企业生存和发展的关键。Acmelux Taiwan Inc公司始终坚持品质至上的原则,从原材料采购、生产制造到产品测试,每一个环节都严格把关,确保产品的稳定性和可靠性。正是这种对品质的执着追求,使得Acmelux的产品在市场上赢得了良好的口碑,成为众多客户的首选品牌。

Belden Wire and Cable公司的发展小趣事

在第二次世界大战期间,Belden公司积极响应国家号召,将生产重心转向战争材料。其产品被广泛应用于坦克、飞机、移动无线电、潜艇、船舶、吉普车等各种军事机械中,为战争的胜利做出了重要贡献。这一时期的生产转型不仅展现了公司的社会责任感,也进一步提升了其在行业内的地位和影响力。

高创科技(gotrend)公司的发展小趣事

随着全球化的深入发展,Belden公司开始积极拓展国际市场。通过在全球范围内设立分支机构和工厂,百通不仅提升了自身的产能和效率,也更好地满足了全球客户的需求。同时,公司还不断推出新产品和新技术,拓展在工控线缆、音视频线缆和计算机网络等领域的市场份额。如今,Belden已经成为全球最大的综合布线及专业线缆制造商之一,其产品和服务遍布全球各地。

这五个故事只是Belden Wire and Cable公司发展历程中的一部分,但它们都客观地反映了公司在电子行业里不断发展、创新和壮大的事实。通过这些故事,我们可以看到一个企业通过不断创新和拓展市场,逐渐成长为行业领导者的过程。

问答坊 | AI 解惑

关于水温控制系统的问题

我现在正在做水温控制系统,要用到继电器,不知道用什么型号好, 有经验的朋友,指点一下吧,谢谢…

查看全部问答>

自家院子,选择什么样的报警装置?

村子里,最近听说周围邻居老是让人偷。想自己安装个报警,不知道用什么的好。 请大家指点。…

查看全部问答>

电路请教

我不接lm324的时候接个电阻电路能稳压到5.1V,但是接上lm324以后电压输出就掉到3.5V左右了,何解? …

查看全部问答>

求助软件mcu_ideV3.0

谁有mcu_ideV3.0,(装上去之后自带工具链,如keil c51,一共四种,就是有2KB代码限制的哪个版本) 官网上下的没有工具链,…

查看全部问答>

(急!!!)ds18b20时序问题

帮我调下ARM+DS18b20时序,我调了半天调不出来。晶振11.0592。控制器LPC2131,串口和中断不用看了。谢谢! 程序: #include \"..\\\\basescr\\\\config.h\" #include \"stdio.h\" #define DS1820_DQ 10;k--); } void DelayNl (uint32 dly) { ...…

查看全部问答>

大家有去过培训机构参加培训吗?

打算换工作,可是越来越觉得自己还有好多东西不懂,想去系统的培训一下。我在网上看了一下,比较中意凌阳(没有在这样做广告的意思),大家有参加过它的嵌入式Linux实战培训班吗?怎么样?或者你有更不错的嵌入式培训学校推荐,越详细越好。…

查看全部问答>

不太急,附件,翻译,,,问下

问下 白纸黑字的单页   实验产品免责声明   关于 第三个 方框中 要求 3 个工作日内 交回的签名 ,   可以给个该页的中文简介?    我不能够 无歧义 的 完整的理解 它。基本意思 有点懂。…

查看全部问答>

pic ad转换精度问题

如果用来检测外部500V对应到an0口的电压是1V,如果电压的基准是5V,ad是10位的话,那么他的精度就是500V/(1024/5)对吗?如果我把送到AN0的1V电压在程序中放大5倍,是不是精度就变了呢?是提高5倍还是不变?请解答,谢谢…

查看全部问答>

请推荐好的Linux应用开发视频教程

本人做过android,现在想学linux应用开发,为节约时间,请各位推荐好的Linux应用开发视频教程,谢谢!…

查看全部问答>