初嘗Linux下的AVR單片機(jī)開(kāi)發(fā)
Posted on 2009/04/02 by PT — 7 Comments ↓
原帖地址:
此前接觸過(guò)AVR單片機(jī),發(fā)現(xiàn)無(wú)論是書(shū)店里面的教材,還是網(wǎng)上一大堆的中文資料,無(wú)一例外都是說(shuō)windows下使用WinAVR、ICCAVR之類的,Linux方面的簡(jiǎn)直只字不提,難道這就是傳說(shuō)中的中國(guó)國(guó)情?外國(guó)情況可很不一樣,玩單片機(jī)的Geek一般都很哈Linux,做單片機(jī)開(kāi)發(fā)的軟件一應(yīng)俱全,當(dāng)然還是開(kāi)源的。
昨天從淘寶重新買(mǎi)了條USB的下載線,回來(lái)一看是USBasp的設(shè)計(jì),附送的光盤(pán)當(dāng)然也是win下的驅(qū)動(dòng)和說(shuō)明了,忽略。
插上下載器,lsusb,認(rèn)倒是認(rèn)出來(lái)了,叫做VOIT,那怎么用呢?上網(wǎng)一搜,原來(lái)USBasp是德國(guó)人的設(shè)計(jì),GPL的,其中提到AVRDUDE支持USBasp,當(dāng)然也有源碼下載。不過(guò)我用的是Ubuntu,發(fā)揮超級(jí)牛力的時(shí)候到了:sudo apt-get install avrdude,恩,幾秒鐘搞定,讓他們?nèi)ゾ幾g吧!
Linux下做單片機(jī)開(kāi)發(fā)當(dāng)然首選GCC,就如這些英文教程說(shuō)的,下載源碼?No,No,APT has Super Cow Powers,繼續(xù)sudo apt-get install gcc-avr binutils-avr avr-libc
幾分鐘裝完,很好,估計(jì)那些下載源碼回來(lái)編譯的同學(xué)要去喝兩個(gè)小時(shí)茶才能用了。
萬(wàn)事俱全,先寫(xiě)個(gè)單片機(jī)的HelloWorld,借用micahcarrick的源碼:
#define F_CPU 1000000UL /* 1 MHz CPU clock */
#include
....保存為toggle_led.c
命令時(shí)間:
avr-gcc -mmcu=atmega48 -Wall -Os -o toggle_led.o toggle_led.c是不是似曾相識(shí)?平時(shí)用gcc就這么用的,這里除了把gcc改成avr-gcc,沒(méi)多大區(qū)別。-mmcu定義了目標(biāo)CPU的類型,我用的是atmega48;-Os是優(yōu)化選項(xiàng),減少程序的大小。這就是傳說(shuō)中的交叉編譯。
接著把目標(biāo)代碼翻譯成可以燒錄到芯片上的hex文件:
avr-objcopy -j .text -j .data -O ihex toggle_led.o toggle_led.hexavr-objcopy的-j參數(shù)限定轉(zhuǎn)換的程序段,-O設(shè)定hex的輸出格式,ihex即Intel Hex file
[Update: 本例子中,-j .data這個(gè)選項(xiàng)沒(méi)作用,因?yàn)?data區(qū)根本沒(méi)有數(shù)據(jù);.data是存放初始化數(shù)組、字符串等數(shù)據(jù)的段,如果程序用到了,記得加上]
搞定,開(kāi)燒:
sudo avrdude -p m48 -c usbasp -e -U flash:w:toggle_led.hex因?yàn)橹苯幼x寫(xiě)USB接口,所以不給權(quán)限的話會(huì)提示找不到編程器,當(dāng)然配置USB權(quán)限最好,這里暫時(shí)用sudo。avrdude的-p指定目標(biāo)CPU,-c指定下載器,如果不知道所用的下載器是什么型號(hào),敲avrdude -c會(huì)列出所有支持的下載器型號(hào)及其描述。-e即燒錄前清空,-U參數(shù)指定刷寫(xiě)類型以及刷寫(xiě)文件。
[Update:可參考virtualbox使用usb的配置,把當(dāng)前用戶加入usbfs組,就可以直接使用avrdude了]
回車(chē)后下載器的指示燈閃了下,跟著單片機(jī)上的小燈開(kāi)始閃爍,Hi, Hello World.
當(dāng)然問(wèn)題不是完全沒(méi)有,我用avrdude下載完后默認(rèn)的校驗(yàn)老是無(wú)法通過(guò),說(shuō)讀取錯(cuò)誤,只好加個(gè)-V來(lái)跳過(guò)校驗(yàn)。可能跟個(gè)別機(jī)器有關(guān)。
當(dāng)然實(shí)際開(kāi)發(fā)很少這樣敲一大堆命令來(lái)編譯程序,一般都用Make搞定。
對(duì)比起Win下滿是GUI的程序,我第一次接觸WinAVR都搞了半天,如何如何配置一個(gè)Project,哇那個(gè)屬性窗口真讓人眼花繚亂,使用gcc來(lái)開(kāi)發(fā),則可以循序漸進(jìn),未了解到的參數(shù)就不用,簡(jiǎn)潔,明了,但不失其功能強(qiáng)大。
資源:
USBasp主頁(yè):
AVR-GCC Programming Guide:
Linux Atmel AVR Tutorial:
Micah Carrick -- AVR(非常推薦,但是需要翻墻) :
AVR Libc User ManualLib Reference:
評(píng)論