歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

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