歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux下的MCU開發之AVR系列1-avr系列的編譯燒錄調試方法

Linux下的MCU開發之AVR系列1-avr系列的編譯燒錄調試方法

日期:2017/3/1 10:22:10   编辑:Linux編程

附件內容: 程序源碼,Makefile模板,相關文檔。

附件下載地址:

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2012年資料/5月/25日/Linux下的MCU開發之AVR系列1-avr系列的編譯燒錄調試方法/

系列說明:LINUX下程序開發具有一定的成熟性,包括大部分的MCU,FPGA,DSP甚至PCB制圖等都是可行的。本系列將針對AVR系列的MCU,而後的系列將會對Linux下的其他方面內容進行探討。

本文環境如下:

OS系統:Ubuntu 12.04(原為10.04最近升級了)

編譯器 :avr-gcc

燒錄軟件 :avrdude

調試軟件:avarice ,GDB和ddd (可視界面)

開發板:

1. xplain(xmega128a1)無法調試,只能燒錄,因為官方沒有公開其調試的協議。

2. Mega16開發板。

仿真器or燒錄器:dragon和usbasp(使用較多)

程序編寫:Vim(升級版的記事本,很好用,很推薦)

關於使用前的准備和說明

至於為什麼要使用linux下開發avr,原因主要是因為比較有趣。其次便是win下的環境用起來其實並不是很方便。IAR是付費軟件(但是的確好用),Avr-studio雖然是免費版,不過優缺點是太過龐大,並且是以vc2010為基礎開發,這個也就算不上真正的免費了。至於win-avr其實蠻不錯的。win下也可以搭建如下環境。

准備:

軟件安裝,軟件安裝建議使用ubuntu的軟件中心,比較方便。需要avr-gcc,avrdude,avarice,gdb,ddd即可了。文本編輯什麼都行。可以集成在codeblocks和eclipse裡面。Codeblocks如此做用起來感覺不錯,eclipse需要配置,但原理都是一樣的。

對於命令行可以如下安裝

  1. sudo apt-get install gcc-avrbinuilts-avr avr-libc
  2. sudo apt-get installvim
  3. sudo apt-get installavrdude

強烈建議順便安上手冊

  1. sudo apt-get installavrdude-doc
  2. sudo apt-get installavarice
  3. sudo apt-get installgdb
  4. sudo apt-get installddd

然後就都安裝完畢了。下一步就可以開始了。

開始之前需要先寫一個.c的程序

代碼會在文章最後和附件裡提出。這是一個很簡單讓一個led亮的程序。

之後介紹一個makefile的東西,此物是簡化操作流程的一個東西。讓敲好多行命令才能完成的只需簡單的一句話就行了。附件裡會包含一個makefile的模板,是winavr下模板改的可用版。具體的內容是如何實現的,可以翻閱官方makefile手冊和百度,谷歌。

簡單介紹Makefile裡面的幾個命令,有過經驗可以無視

  1. AVRDUDE_PROGRAMMER = usbasp
  2. #dragon_jtag
  3. AVRDUDE_PORT = usb # programmer connected to serial device
  4. AVRDUDE_WRITE_FLASH = -Uflash:w:$(TARGET).hex
  5. AVRDUDE_FLAGS = -p $(MCU) -P$(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
  6. AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
  7. AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
  8. AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)

上面這些都是定義變量,makefile裡的

  1. program: $(TARGET).hex $(TARGET).eep
  2. $(AVRDUDE)$(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)

當我們輸入make program時就會執行上面這句之前的都不用關心了。翻譯過來就變成了(如果叫main.hex)

  1. avrdude -P usb -p m16 -c usbasp -U flash:w:main.hex

就是說用usb下的usbasp燒錄m16的flash,內容為main.hex

如果用dragon的話一般用jtag就是-c dragon_jtag。具體可以查看avrdude手冊。

了解之後先打開終端,找到.c文件目錄下。Makefile文件放在同一目錄下

根據需要更改其內容

輸入make

便會輸出一些信息,最後會有提示編譯成功

之後就可以燒錄了

燒錄之前看一下燒錄器是否在

輸入lsusb

顯然,usbasp存在。那麼輸入sudo make program

會在很快的時間內燒錄成功,比win快的多。最後提示你燒錄成功

至於debug,usbasp沒有這個功能。需要用dragon的jtag。

住:Debug其實不是很推薦使用,雖然比較高效,建議利用串口的信息輸入輸出(以後會介紹),這是因為在進入系統的嵌入後,常規的debug經常會無法使用。

實際的命令會是

  1. avarice -g -j usb --erase --program --filemain.hex :4242

不過如果makefile裡已經寫好的話直接輸入sudo make debug就可以了

下面為命令的結果

現在屬於等待GDB,可視化的話就是DDD的狀態中了

比如在gdb.conf中添加

file main.elf

target remotelocalhost:4242

啟動DDD

ddd–-debugger “avr-gdb -x gdb.conf”

也可以手起動,然後配置,ui界面比較友好。

還有一句話。makefile裡面已經把上步驟都做好了~當然會根據需求要求更改的。尤其是debug的時候。

總結:本文所說有些簡略了,Linux開發的困難主要在於搭建環境,因此需要多看一下相關的官方手冊。

測試代碼:

main.c

  1. // avr-gcc application builder : 2011-11-1
  2. // Target : M16
  3. // Crystal: 12.000Mhz
  4. #include <avr/io.h>
  5. #include <util/delay.h>
  6. #define SET(a,b) a|(1<<b)
  7. #define CLR(a,b) a &~(1<<b)
  8. void port_init(void)
  9. {
  10. DDRA = 0xff;//將PA0定義為輸出
  11. PORTA = 0xff;
  12. PORTB = 0x00;
  13. DDRB = 0x00;
  14. PORTC = 0x00; //m103 output only
  15. DDRC = 0x00;
  16. PORTD = 0x00;
  17. DDRD = 0x00;
  18. }
  19. //call this routine to initialize all peripherals
  20. void init_devices(void)
  21. {
  22. //stop errant interrupts until set up
  23. //CLI(); //disable all interrupts
  24. port_init();
  25. MCUCR = 0x00;
  26. GICR = 0x00;
  27. TIMSK = 0x00; //timer interrupt sources
  28. // SEI(); //re-enable interrupts
  29. //all peripherals are now initialized
  30. }
  31. //
  32. void main(void)
  33. {
  34. init_devices();
  35. //insert your functional code here...
  36. PORTA = CLR(PORTA,3);
  37. while(1); //程序掛起
  38. }
Copyright © Linux教程網 All Rights Reserved