色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          AVR單片機(jī)GCC編程

          作者: 時(shí)間:2004-12-28 來(lái)源:網(wǎng)絡(luò) 收藏

          [Illustration]

          摘要:

          Atmel公司的 8位RISC是一種非常普通的.它是一個(gè)具有電擦寫(xiě)可只讀存儲(chǔ)器(EEPROM),隨機(jī)訪問(wèn)存儲(chǔ)器(RAM),模數(shù)轉(zhuǎn)換器,大量的輸入和輸出線路,計(jì)時(shí)器,RS-232通訊接口UART以及其他很多功能的單片集成電路.

          最好的莫過(guò)于在Linux下具有一個(gè)可供利用的完整環(huán)境:你可以采用對(duì)這種進(jìn)行C語(yǔ)言.本文我將向你講述如何安裝和使用.我也將向你講述如何把軟件載入單片機(jī).你所需要的只是一塊AT90S4433單片機(jī),一個(gè)4Mhz的晶震,一些電纜和少量其它便宜的部件.

          這篇文章只是一個(gè)簡(jiǎn)單介紹.在以后的文章種我們將會(huì)制作一個(gè)具有少數(shù)按鍵的LCD顯示屏,模數(shù)輸入,硬件狗和一些LED.我們的想法是做一個(gè)普通的Linux服務(wù)器的控制面板,不過(guò)我們先要學(xué)習(xí)怎么配置編程環(huán)境,這也是本文的主要內(nèi)容.

          軟件安裝:哪些是你所需要的

          采用GNU C語(yǔ)言開(kāi)發(fā)環(huán)境你需要下列軟件:

          binutils-2.11.2.tar.bz2可以從:
          ftp://ftp.informatik.rwth-aachen.de/pub/gnu/binutils/
          或者
          ftp://gatekeeper.dec.com/pub/GNU/binutils/下載
          gcc-core-3.0.3.tar.gz可以從: ftp://ftp.informatik.rwth-aachen.de/pub/gnu/gcc/
          或者
          ftp://gatekeeper.dec.com/pub/GNU/gcc/下載
          avr-libc-20020106 .tar.gz這個(gè) C語(yǔ)言庫(kù)可以從: http://www.amelek.gda.pl/avr/libc/ 也可以從這個(gè)服務(wù)器下載:下載主頁(yè)
          uisp-20011025.tar.gz編程器可以從: http://www.amelek.gda.pl/avr/libc/ 也可以從這臺(tái)服務(wù)器下載: 下載主頁(yè)
          我們把所有這些程序安裝到/usr/local/atmel下. 這是為了使這些程序和普通Linux C語(yǔ)言編譯器分開(kāi). 用下面的命令建立這個(gè)目錄:

          mkdir /usr/local/atmel

          軟件安裝:GNU binutils

          這個(gè)binutils軟件包提供建立目標(biāo)文件所需要的所有低級(jí)工具.它包括一個(gè)AVR匯編器(avr-as),連接器(avr-ld),庫(kù)處理工具(avr-ranlib,avr-ar),生成可載入單片機(jī)EEPROM目標(biāo)文件的程序(avr-objcopy),反匯編器(avr-objdump)和象avr-strip和avr-size這類的工具軟件.

          運(yùn)行下列命令編譯安裝binutils:

          bunzip2 -c binutils-2.11.2.tar.bz2 | tar xvf -
          cd binutils-2.11.2
          ./configure --target=avr --prefix=/usr/local/atmel
          make
          make install

          添加/usr/local/atml/lib這行到/etc/ld.so.conf文件里面,運(yùn)行/sbin/ldconfig命令重建連接器緩存.

          軟件安裝:AVR 編譯器

          avr-gcc將是我們的C語(yǔ)言編譯器.

          運(yùn)行下列命令編譯安裝這個(gè)編譯器:

          tar zxvf gcc-core-3.0.3.tar.gz
          cd gcc-core-3.0.3
          ./configure --target=avr --prefix=/usr/local/atmel --disable-nls --enable-language=c
          make
          make install

          軟件安裝:AVR C語(yǔ)言庫(kù)

          這個(gè)C語(yǔ)言庫(kù)仍在開(kāi)發(fā)中.安裝過(guò)程可能版本與版本之間有些細(xì)微的差別.如果你想照著本文一步一步做的話我推薦采用上表列出的版本.上表中的軟件我已經(jīng)做過(guò)測(cè)試了,本文中我們所寫(xiě)的程序和后面的文章中的程序都在上面這個(gè)版本上工作得很好.

          設(shè)置一些環(huán)境變量(bash語(yǔ)法):
          export CC=avr-gcc
          export AS=avr-as
          export AR=avr-ar
          export RANLIB=avr-ranlib
          export PATH=/usr/local/atmel/bin:${PATH}

          ./configure --prefix=/usr/local/atmel/avr --target=avr --enable-languages=c --host=avr
          make
          make install

          軟件安裝:編程器

          這個(gè)編程器將指定的準(zhǔn)備好的目標(biāo)代碼載入到我們單片機(jī)的EEPROM中.

          這個(gè)Linux下的uisp是一個(gè)非常好的編程器.可以直接用在Makefile里面.你只要添加"make load"規(guī)則,這樣你就可以編譯載入軟件一次完成.

          uisp按照下面這樣安裝:

          tar zxvf uisp-20011025.tar.gz
          cd uisp-20011025/src
          make
          cp uisp /usr/local/atmel/bin

          一個(gè)小的測(cè)試工程

          我們將以一個(gè)小的測(cè)試電路開(kāi)始.這個(gè)測(cè)試電路的目的僅僅是測(cè)試我們的開(kāi)發(fā)環(huán)境.我們用它來(lái)編譯,下載以及測(cè)試一個(gè)小程序.這個(gè)測(cè)試程序僅僅是引起LED閃爍.

          我建議給這個(gè)單片機(jī)弄一個(gè)小的印刷電路板.以后你就可以在這塊電路板的區(qū)域做你自己的試驗(yàn).一個(gè)好辦法是用一個(gè)模擬板當(dāng)作這個(gè).你無(wú)論如何也不能嘗試著把AVR和它的4MHz晶震直接放在模擬板上.更好的辦法是用少量的短線把輸入和輸出腳與模擬板相連,因?yàn)檫@樣的模擬板不是為快速數(shù)字電路制作的. 4Mhz的晶震和電容器在物理上應(yīng)該非常靠近單片機(jī).
          [circuit diagram]
          在我們這個(gè)例子里編程器的連接器電阻實(shí)際上是不必要的.只有在你打算把port-B 輸入輸出腳用于其他目的時(shí)才需要.

          需要的硬件

          你需要的部件列在下表中.所有的這些都非常普通,便宜,只是單片機(jī)貴點(diǎn),大概7.5歐元.盡管它是非常普通的單片機(jī),它也不是隨便在那家當(dāng)?shù)氐臒o(wú)線電商店就能買(mǎi)到的,象那些大的電子部件銷售商例如:(www.reichelt.de(德國(guó)),www.conrad.de(德國(guó)),www.selectronic.fr(法國(guó))等等........,可能在你的國(guó)家這些類似的站點(diǎn))的倉(cāng)庫(kù)里才有全部的部件.
          [avr] 1 x AT90S4433, Atmel 8 位AVR RISC處理器.
          [socket] 2 x 14腳 IC插槽
          或者
          1 x 28 腳 7.5mm IC插槽
          這種28腳插槽要找到有點(diǎn)點(diǎn)困難,通常28腳插槽是14mm寬的,但是我們需要的是7.5mm的插槽.
          [resistor crystal capacitor] 1 x 10K 電阻 (顏色代碼: 棕,黑,橙)
          3 x 470 歐姆 電阻(顏色代碼:黃,紫,棕)
          1 x 1K 電阻 (顏色代碼: 棕,黑,紅)
          1 x 220 歐姆 電阻 (顏色代碼:紅,紅,棕)
          1 x 4Mhz 晶震
          2 x 27pf 陶電容
          [connector] 用于編譯器的任意種類的5腳插頭/插座.我們通常買(mǎi)些連接器條,然后5個(gè)折成一段.
          [matrix board] 聚酯板.
          [db25] 1 x DB25 連接器 用于插到并口.
          [led] 1 x LED
          [beardboard] 一塊模擬板. 我們?cè)谶@里不用,但是如果你想做將來(lái)的AVR實(shí)驗(yàn)這是非重有用的.我建議你把微控制器與晶震和電容集中在聚酯板上,然后通過(guò)短電纜把它們的輸入/輸出腳連接到模擬板.
          除開(kāi)上面的這些,還需要提供一個(gè)穩(wěn)定的5V直流電源,你也可以采用4.5V的電池作為電源供應(yīng).

          安裝編程器硬件

          AT90S4433支持在線編程(ISP). [AVR programmer]
          簡(jiǎn)單說(shuō)就是:你沒(méi)有必要為了給單片機(jī)編程而移動(dòng)單片機(jī)模塊.你會(huì)看到可以用50-150歐元買(mǎi)到做好的編程器硬件,但沒(méi)有必要為一個(gè)編程器更多地投資.采用Linux,uisp軟件和免費(fèi)的并口你就可以建立起一個(gè)非常好的簡(jiǎn)單的AVR編程器,也就采用一根簡(jiǎn)單的電纜連接而已.編程器電纜的線必須符合下列要求:
          AVR端針腳并口端針腳
          SCK (19)Strobe (1)
          MISO (18)Busy (11)
          MOSI (17)D0 (2)
          Reset (1)Init (16)
          GNDGND (18)

          電纜長(zhǎng)度不超過(guò)70cm.

          寫(xiě)入軟件

          在GCC的幫助下AT90S4433可以用一般的C語(yǔ)言編程. 了解一些AVR匯編很有用,但也不是非要不可.AVR C語(yǔ)言庫(kù)的avr-libc-reference 講述了libc的大部分函數(shù). Harald Leitner寫(xiě)了一個(gè)關(guān)于如何使用AVR和GCC的帶有大量有用的例子的文檔(haraleit.pdf, 286Kb, 原作 http://www.avrfreaks.net/AVRGCC/). 從Atmel公司的網(wǎng)頁(yè), (www.atmel.com, 找到: avr products -> 8 bit risc-> Datasheets), 你可以下載完整的數(shù)據(jù)資料 (復(fù)制到本地: avr4433.pdf, 2361Kb) . 它描述了所有的寄存器以及如何使用CPU.

          使用4433的時(shí)候有一點(diǎn)要注意的是它只有128字節(jié)的RAM和4K字節(jié)的EEPROM.這就意味著你不能定義大的數(shù)據(jù)結(jié)構(gòu)和字符串.程序中不能采用深入的嵌套調(diào)用或者是遞歸調(diào)用. 就像寫(xiě)
          char string[90];
          這樣一行就已經(jīng)太大了. 一個(gè)整數(shù)是16bit,如果需要一個(gè)小的整數(shù)你可以采用
          unsigned char i; /* 0-255 */
          你將非常驚訝你的程序是多么大.它真是一個(gè)強(qiáng)大的處理器.

          理論不如實(shí)踐,我們將寫(xiě)一個(gè)程序讓我們的LED每隔0.5秒閃爍一次.雖然不是很有用不過(guò)也是一個(gè)非常好的開(kāi)頭,而且可以用來(lái)測(cè)試我們的開(kāi)發(fā)環(huán)境和編程器.

          void main(void)
          {
          /* enable PD5 as output */
          sbi(DDRD,PD5);
          while (1) {
          /* led on, pin=0 */
          cbi(PORTD,PD5);
          delay_ms(500);
          /* set output to 5V, LED off */
          sbi(PORTD,PD5);
          delay_ms(500);
          }
          }

          上面的例子可以看出用它寫(xiě)個(gè)程序是多么簡(jiǎn)單.你看到的僅僅是主程序,delay_ms函數(shù)包含在全部的清單(avrledtest.c)中. PD5腳用作輸出的話,你必須在數(shù)據(jù)寄存器中為D端口(DDRD)設(shè)置PD5位.然后就能用cbi*(PORTD,PD5)函數(shù)給PD5設(shè)置0V電壓(清除PD5)或者用sbi(PORT,PD5)設(shè)置5V電壓(設(shè)置PD5)."PD5"值的定義包含在通過(guò)io.h包含的io4433.h中.你不用擔(dān)心這點(diǎn). 如果你曾經(jīng)在象Linux這樣的多用戶多任務(wù)系統(tǒng)下寫(xiě)過(guò)程序的話你就知道絕不要寫(xiě)一個(gè)非模塊化的無(wú)窮的循環(huán).這會(huì)浪費(fèi)CPU時(shí)間,減慢系統(tǒng)速度.在AVR上就不一樣了,我們沒(méi)有多個(gè)任務(wù),也沒(méi)有其他程序在運(yùn)行,這甚至不是一個(gè)操作系統(tǒng),在這上面運(yùn)用無(wú)窮循環(huán)顯得很普遍.

          編譯和載入

          在開(kāi)始之前確認(rèn)一下PATH中包含了/usr/local/atmel/bin路徑,必要的話編輯你的.bash_profile或者.tcshrc,添加如下內(nèi)容:

          export PATH=/usr/local/atmel/bin:${PATH} (for bash)
          setenv PATH /usr/local/atmel/bin:${PATH} (for tcsh)

          我們用并口和uisp來(lái)為AVR編程.uisp使用內(nèi)核的ppdev接口,因此你必須已經(jīng)載入了下列內(nèi)核模塊:

          # /sbin/lsmod
          parport_pc
          ppdev
          parport

          用/sbin/lsmod命令檢查是否已經(jīng)載入,如果沒(méi)有就以root用戶載入它們.

          modeprobe parport
          modeprobe parport_pc
          modeprobe ppdev

          一個(gè)比較好的辦法是在啟動(dòng)的時(shí)候就自動(dòng)執(zhí)行這些命令.你可以把這些命令添加倒rc腳本中(例如:Redhat下的/etc/rc.d/rc.local).
          為了給普通用戶ppdev接口寫(xiě)權(quán)限,運(yùn)行一次下面的命令:

          chmod 666 /dev/parport0

          確保沒(méi)有在并口上的打印守護(hù)進(jìn)程運(yùn)行.如果你運(yùn)行了就要在你連接編程器電纜前停止這個(gè)進(jìn)程.現(xiàn)在編譯和單片機(jī)編程的所有準(zhǔn)備工作都做好了.

          我們的測(cè)試程序包(avrledtest-0.1.tar.gz) 里面有個(gè)編譯工程文件文件.你要做的只是輸入:
          make
          make load
          T這樣就編譯和載入軟件了.我并不想詳細(xì)描述所有的命令. 你可以打開(kāi)那個(gè) Makefile 查看,它們都是一樣的.我自己都不能把它們完全記下來(lái).我只是知道我只需要做"make load".如果你想寫(xiě)不同的程序你只要把Makefile中所有出現(xiàn)avrledtest的地方用你的程序名字替換就行了.

          一些有趣的binutils

          比實(shí)際編譯過(guò)程更有趣的是一些小工具軟件.

          avr-objdump -h avrledtest.out

          S顯示程序的不同段的大小..text是調(diào)入falsh EEPROM的指令代碼,.data是象
          static char str[]="hello";
          這類的初始化數(shù)據(jù)..bss是非初始化全局?jǐn)?shù)據(jù),在我們這個(gè)里面全是零..eeprom用于存儲(chǔ)倒eeprom的變量,我從沒(méi)有用過(guò)這個(gè)..stab和.stabstr是調(diào)試信息,不會(huì)載入AVR的.
          avrledtest.out:     file format elf32-avrSections:Idx Name          Size      VMA       LMA       File off  Algn0 .text         0000008c  00000000  00000000  00000094  2**0CONTENTS, ALLOC, LOAD, READONLY, CODE1 .data         00000000  00800060  0000008c  00000120  2**0CONTENTS, ALLOC, LOAD, DATA2 .bss          00000000  00800060  0000008c  00000120  2**0ALLOC3 .eeprom       00000000  00810000  00810000  00000120  2**0CONTENTS4 .stab         00000750  00000000  00000000  00000120  2**2CONTENTS, READONLY, DEBUGGING5 .stabstr      000005f4  00000000  00000000  00000870  2**0CONTENTS, READONLY, DEBUGGING
          你也可以用avr-size命令得到一個(gè)更精簡(jiǎn)的形式:

          avr-size avrledtest.out

             text    data     bss     dec     hex filename140       0       0     140      8c avrledtest.out
          在AVR上工作你必須特別注意.text+data+bss不超過(guò)4K,data+bss+stack(你可以不考慮stack的大小,它取決于有多少嵌套調(diào)用)不能超過(guò)128字節(jié).

          下面這個(gè)命令也非常有意思:

          avr-objdump -S avrledtest.out

          它會(huì)生成你的代碼的匯編列表.

          結(jié)論

          現(xiàn)在你已經(jīng)了解到足以開(kāi)始我們的工程的AVR硬件和GCC方面的知識(shí).LinuxFocus將來(lái)會(huì)有更多更復(fù)雜的,更有趣的關(guān)于硬件這方面的文章.

          參考文獻(xiàn)

          • Libc and uisp: /www.amelek.gda.pl/avr/libc/
          • GCC and binutils: ftp://gatekeeper.dec.com/pub/GNU/
          • avrfreaks (watch out some people on that site are still using windows !?): http://www.avrfreaks.net/
          • the tavrasm assembler for Linux: www.tavrasm.org
          • AVR webring: R.webring.com/hub?ring=avrlist
          • Pre-compiled versions of gcc: combio.de/avr/
          • All software and documents mentioned in this article
          • The atmel website: www.atmel.com/


          關(guān)鍵詞: 編程 GCC 單片機(jī) AVR

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉