AVR單片機(jī)GCC編程
摘要:
Atmel公司的AVR 8位RISC單片機(jī)是一種非常普通的單片機(jī).它是一個具有電擦寫可編程只讀存儲器(EEPROM),隨機(jī)訪問存儲器(RAM),模數(shù)轉(zhuǎn)換器,大量的輸入和輸出線路,計時器,RS-232通訊接口UART以及其他很多功能的單片集成電路.
最好的莫過于在Linux下具有一個可供利用的完整編程環(huán)境:你可以采用GCC對這種單片機(jī)進(jìn)行C語言編程.本文我將向你講述如何安裝和使用GCC.我也將向你講述如何把軟件載入單片機(jī).你所需要的只是一塊AT90S4433單片機(jī),一個4Mhz的晶震,一些電纜和少量其它便宜的部件.
這篇文章只是一個簡單介紹.在以后的文章種我們將會制作一個具有少數(shù)按鍵的LCD顯示屏,模數(shù)輸入,硬件狗和一些LED.我們的想法是做一個普通的Linux服務(wù)器的控制面板,不過我們先要學(xué)習(xí)怎么配置編程環(huán)境,這也是本文的主要內(nèi)容.
軟件安裝:哪些是你所需要的
采用GNU C語言開發(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 | 這個AVR C語言庫可以從: http://www.amelek.gda.pl/avr/libc/ 也可以從這個服務(wù)器下載:下載主頁 |
uisp-20011025.tar.gz | AVR編程器可以從: http://www.amelek.gda.pl/avr/libc/ 也可以從這臺服務(wù)器下載: 下載主頁 |
mkdir /usr/local/atmel
軟件安裝:GNU binutils
這個binutils軟件包提供建立目標(biāo)文件所需要的所有低級工具.它包括一個AVR匯編器(avr-as),連接器(avr-ld),庫處理工具(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
軟件安裝:AVR GCC編譯器
avr-gcc將是我們的C語言編譯器.運(yùn)行下列命令編譯安裝這個編譯器:
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語言庫
這個C語言庫仍在開發(fā)中.安裝過程可能版本與版本之間有些細(xì)微的差別.如果你想照著本文一步一步做的話我推薦采用上表列出的版本.上表中的軟件我已經(jīng)做過測試了,本文中我們所寫的程序和后面的文章中的程序都在上面這個版本上工作得很好.設(shè)置一些環(huán)境變量(bash語法):
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
軟件安裝:編程器
這個編程器將指定的準(zhǔn)備好的目標(biāo)代碼載入到我們單片機(jī)的EEPROM中.這個Linux下的uisp是一個非常好的編程器.可以直接用在Makefile里面.你只要添加"make load"規(guī)則,這樣你就可以編譯載入軟件一次完成.
uisp按照下面這樣安裝:
tar zxvf uisp-20011025.tar.gz
cd uisp-20011025/src
make
cp uisp /usr/local/atmel/bin
一個小的測試工程
我們將以一個小的測試電路開始.這個測試電路的目的僅僅是測試我們的開發(fā)環(huán)境.我們用它來編譯,下載以及測試一個小程序.這個測試程序僅僅是引起LED閃爍.我建議給這個單片機(jī)弄一個小的印刷電路板.以后你就可以在這塊電路板的區(qū)域做你自己的試驗(yàn).一個好辦法是用一個模擬板當(dāng)作這個.你無論如何也不能嘗試著把AVR和它的4MHz晶震直接放在模擬板上.更好的辦法是用少量的短線把輸入和輸出腳與模擬板相連,因?yàn)檫@樣的模擬板不是為快速數(shù)字電路制作的. 4Mhz的晶震和電容器在物理上應(yīng)該非??拷鼏纹瑱C(jī).
在我們這個例子里編程器的連接器電阻實(shí)際上是不必要的.只有在你打算把port-B 輸入輸出腳用于其他目的時才需要.
需要的硬件
你需要的部件列在下表中.所有的這些都非常普通,便宜,只是單片機(jī)貴點(diǎn),大概7.5歐元.盡管它是非常普通的單片機(jī),它也不是隨便在那家當(dāng)?shù)氐臒o線電商店就能買到的,象那些大的電子部件銷售商例如:(www.reichelt.de(德國),www.conrad.de(德國),www.selectronic.fr(法國)等等........,可能在你的國家這些類似的站點(diǎn))的倉庫里才有全部的部件.1 x AT90S4433, Atmel 8 位AVR RISC處理器. | |
2 x 14腳 IC插槽 或者 1 x 28 腳 7.5mm IC插槽 這種28腳插槽要找到有點(diǎn)點(diǎn)困難,通常28腳插槽是14mm寬的,但是我們需要的是7.5mm的插槽. | |
1 x 10K 電阻 (顏色代碼: 棕,黑,橙) 3 x 470 歐姆 電阻(顏色代碼:黃,紫,棕) 1 x 1K 電阻 (顏色代碼: 棕,黑,紅) 1 x 220 歐姆 電阻 (顏色代碼:紅,紅,棕) 1 x 4Mhz 晶震 2 x 27pf 陶電容 | |
用于編譯器的任意種類的5腳插頭/插座.我們通常買些連接器條,然后5個折成一段. | |
聚酯板. | |
1 x DB25 連接器 用于插到并口. | |
1 x LED | |
一塊模擬板. 我們在這里不用,但是如果你想做將來的AVR實(shí)驗(yàn)這是非重有用的.我建議你把微控制器與晶震和電容集中在聚酯板上,然后通過短電纜把它們的輸入/輸出腳連接到模擬板. |
安裝編程器硬件
AT90S4433支持在線編程(ISP).簡單說就是:你沒有必要為了給單片機(jī)編程而移動單片機(jī)模塊.你會看到可以用50-150歐元買到做好的編程器硬件,但沒有必要為一個編程器更多地投資.采用Linux,uisp軟件和免費(fèi)的并口你就可以建立起一個非常好的簡單的AVR編程器,也就采用一根簡單的電纜連接而已.編程器電纜的線必須符合下列要求:
AVR端針腳 | 并口端針腳 |
---|---|
SCK (19) | Strobe (1) |
MISO (18) | Busy (11) |
MOSI (17) | D0 (2) |
Reset (1) | Init (16) |
GND | GND (18) |
電纜長度不超過70cm.
寫入軟件
在GCC的幫助下AT90S4433可以用一般的C語言編程. 了解一些AVR匯編很有用,但也不是非要不可.AVR C語言庫的avr-libc-reference 講述了libc的大部分函數(shù). Harald Leitner寫了一個關(guān)于如何使用AVR和GCC的帶有大量有用的例子的文檔(haraleit.pdf, 286Kb, 原作 http://www.avrfreaks.net/AVRGCC/). 從Atmel公司的網(wǎng)頁, (www.atmel.com, 找到: avr products -> 8 bit risc-> Datasheets), 你可以下載完整的數(shù)據(jù)資料 (復(fù)制到本地: avr4433.pdf, 2361Kb) . 它描述了所有的寄存器以及如何使用CPU.使用4433的時候有一點(diǎn)要注意的是它只有128字節(jié)的RAM和4K字節(jié)的EEPROM.這就意味著你不能定義大的數(shù)據(jù)結(jié)構(gòu)和字符串.程序中不能采用深入的嵌套調(diào)用或者是遞歸調(diào)用. 就像寫
char string[90];
這樣一行就已經(jīng)太大了. 一個整數(shù)是16bit,如果需要一個小的整數(shù)你可以采用
unsigned char i; /* 0-255 */
你將非常驚訝你的程序是多么大.它真是一個強(qiáng)大的處理器.
理論不如實(shí)踐,我們將寫一個程序讓我們的LED每隔0.5秒閃爍一次.雖然不是很有用不過也是一個非常好的開頭,而且可以用來測試我們的開發(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);
}
}
編譯和載入
在開始之前確認(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)
# /sbin/lsmod
parport_pc
ppdev
parport
modeprobe parport
modeprobe parport_pc
modeprobe ppdev
為了給普通用戶ppdev接口寫權(quán)限,運(yùn)行一次下面的命令:
chmod 666 /dev/parport0
確保沒有在并口上的打印守護(hù)進(jìn)程運(yùn)行.如果你運(yùn)行了就要在你連接編程器電纜前停止這個進(jìn)程.現(xiàn)在編譯和單片機(jī)編程的所有準(zhǔn)備工作都做好了.我們的測試程序包(avrledtest-0.1.tar.gz) 里面有個編譯工程文件文件.你要做的只是輸入:
make
make load
T這樣就編譯和載入軟件了.我并不想詳細(xì)描述所有的命令. 你可以打開那個 Makefile 查看,它們都是一樣的.我自己都不能把它們完全記下來.我只是知道我只需要做"make load".如果你想寫不同的程序你只要把Makefile中所有出現(xiàn)avrledtest的地方用你的程序名字替換就行了.
一些有趣的binutils
比實(shí)際編譯過程更有趣的是一些小工具軟件.avr-objdump -h avrledtest.out
S顯示程序的不同段的大小..text是調(diào)入falsh EEPROM的指令代碼,.data是象static char str[]="hello";
這類的初始化數(shù)據(jù)..bss是非初始化全局?jǐn)?shù)據(jù),在我們這個里面全是零..eeprom用于存儲倒eeprom的變量,我從沒有用過這個..stab和.stabstr是調(diào)試信息,不會載入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命令得到一個更精簡的形式:
avr-size avrledtest.out
text data bss dec hex filename140 0 0 140 8c avrledtest.out在AVR上工作你必須特別注意.text+data+bss不超過4K,data+bss+stack(你可以不考慮stack的大小,它取決于有多少嵌套調(diào)用)不能超過128字節(jié).
下面這個命令也非常有意思:
avr-objdump -S avrledtest.out
它會生成你的代碼的匯編列表.結(jié)論
現(xiàn)在你已經(jīng)了解到足以開始我們的工程的AVR硬件和GCC方面的知識.LinuxFocus將來會有更多更復(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/
評論