2011年6月17日 星期五

WinAVR 初體驗

這篇簡介 WinAVR 並用一個簡單的例子示範 WinAVR 的使用方法。

WinAVR 簡介

WinAVR 是一套 Windows 平台的 AVR microcontrollers 韌體開發工具,它包含了許多開發 AVR 韌體所需的工具,包括 avr-gcc (GNU GCC C 與 C++ Compiler), avrlibc (C Library), avrdude (燒錄工具), avr-gdb (debugger) 以及可以自動產生 Makefile 的 MFile 等。

準備 WinAVR

你可以到官網下載最新版 WinAVR,然後按照指示安裝。

Arduino IDE 也使用 WinAVR 編譯與燒錄程式,如果你有在使用 Arduino,那麼就不用下載 WinAVR,因為 Arduino IDE 就有一份 WinAVR。你只要把底下幾個路徑加到 PATH 環境變數裏就行了:

C:\arduino-00xx\hardware\tools\avr\bin;
C:\arduino-00xx\hardware\tools\avr\utils\bin;
C:\arduino-00xx\hardware\tools\avr\etc

其中,arduino-00xx 是 Arduino IDE 的版本號碼,例如 arduino-0021。

編譯 Blink 範例

我們用一支簡單的程式示範如何使用 WinAVR 編譯程式,底下是 Blink.c 的程式碼:

關於 AVR 程式怎麼撰寫,不在本文的討論範圍。

接著下指令編譯程式:

avr-gcc -Os -DF_CPU=16000000 -mmcu=atmega328p -o Blink.o -c Blink.c
avr-gcc -Os -DF_CPU=16000000 -mmcu=atmega328p -o Blink.elf Blink.o
avr-objcopy -O ihex Blink.elf Blink.hex

其中,"-DF_CPU=16000000 -mmcu=atmega328p" 告訴 avr-gcc 所用的晶片是 atmega328p 晶片,振盪頻率為 16 MHz。我用的 AVR 晶片是 atmega328p (Arduino Duemilanove 及 UNO 所用的晶片),振盪器頻率是 16 MHz。

編譯完成後會產生 Blink.hex。

用 avrdude 燒錄韌體

接著就可以用 avrdude 把 blink.hex 燒錄到 Arduino 板子上:

avrdude -q -c stk500v1 -P com4 -b 57600 -p atmega328p -U flash:w:Blink.hex:i

當 Blink.hex 燒錄到板子上後,Arduino pin 13 上的 LED 就會開始閃爍。

我用的 Arduino 板子是 Duemilanove,接在 COM4 上,Duemilanove 用的燒錄 baud rate 是 57600 bps。你可能得根據的硬體和作業環境做適當的調整。

關於 avrdude 的使用方法,請參考「用 avrdude 燒錄 Arduino Sketch」一文。

延伸閱讀

3 意見:

GCY 提到...

馬大您這篇avr-gcc使用簡單易懂!

配合這篇 http://www.arduinodev.com/arduino-uploader/

我最近來寫個C++ + wxWidgets版本IDE把avr-tool打包當練習

GCY 提到...

不過用到Arduino的Library得要逐個compile在link

Cooper Maa 提到...

GCY 厲害唷!
對岸寫 Mediacoder, ArduGate 的 Stanley Huang 也很厲害

他做的 Codeblocks Arduino Edition 也挺有趣的