本文隸屬於AVR單片機教程系列。
做了這么多准備,我們終於可以開始用開發板做點事了。
單片機編程與計算機編程有一些不同點。程序都要有零個或多個輸入、一個或多個輸出,這是兩者都有的,但是計算機編程的輸入輸出主要靠控制台,而單片機沒有。
單片機的英文是microcontroller,主要作控制用途,它對設備的控制就是它的輸出,從設備讀取的信息就是它的輸入。計算機編程中,提供了scanf、printf等函數來做輸入輸出,單片機雖然也有這一些函數,但它們往往是在串口上收發數據,最終還是在電腦上顯示的。單片機對它連接的設備的控制,主要通過對寄存器(register)的操作實現。對寄存器的直接操作涉及到許多底層知識,我已經用一些函數把這些底層的東西封裝好了,你只需要調用我編寫的庫中的函數就可以了。
用單片機來控制,最簡單的就是點亮LED了。這個程序沒有輸入,有一個輸出,就是讓LED亮起。但即使簡單,它也需要庫,請在這里下載。
庫下載完以后是不能直接用的,我們要把它放進編譯器的包含目錄下。
在EElib1.0.7z文件中有兩個目錄,分別是include和lib。打開Atmel Studio 7.0的安裝目錄,一路找toolchain→avr8→avr8-gnu-toolchain→avr,我是默認位置安裝的,找到的目錄就是C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\,這個目錄下也有include和lib兩個文件夾。把壓縮包里的文件夾放到這里來,對應文件夾合並,庫就放對位置了。
上述操作只需每次更新庫時執行一遍。
然后我們打開AS7,加載完成后,點擊菜單欄→File→New→Project...,也可以用快捷鍵Ctrl+Shifh+N,彈出新建項目的窗口:
選擇GCC C Executable Project,取個名字,選好路徑,點擊OK,會彈出設備選擇窗口:
右上角輸入“ATmega324PA”(大小寫無所謂),選擇ATmega324PA,點擊OK。稍等幾秒后,一個默認的項目創建好了:
這堆自動生成的代碼我們不用,全部刪掉。輸入以下代碼(建議敲一遍,不要復制):
1 #include <ee1/led.h> 2 3 int main() 4 { 5 led_init(); 6 led_set(LED_RED, LED_ON); 7 return 0; 8 }
敲代碼的時候你會發現IDE會提示代碼補全,按Tab或回車可以選擇。輸入好以后應該是這樣的:
下面來分析一下這段代碼:
#include <ee1/led.h> 用於包含庫的頭文件,有了這句代碼,后面才能調用庫函數。主版本號為1的庫都放在 ee1/ 下。
led_init(); 用於初始化所有LED,如果不初始化,LED是不能點亮的。
led_set(LED_RED, LED_ON); 用於點亮紅色LED。led_set 是一個庫函數,接受兩個參數,第一個表示要點亮哪個LED,第二個表示這個LED要亮還是不亮。詳見庫函數手冊。
最后的 return 0; 可以不寫,但加上是一個好習慣。
只寫代碼還不能讓開發板點亮LED。我們調用了庫函數,但是復制和 #include 還不足以把庫加入到我們的程序中,我們需要配置一下項目屬性:
在右邊的Solution Explorer中對項目右鍵,點擊最后的Properties,找到Toolchain→AVR/GNU Linker→Libraries,點擊右上角Add Item按鈕,輸入“libee1”,點擊OK,然后關閉選項卡,回到代碼界面。
我們的開發板不支持debug,而且release編譯出來的程序性能稍微好一點。在工具欄中選擇Release:
現在我們可以build項目了,之前配置過快捷鍵的話直接按F5就可以了,也可以點工具欄按鈕:
現在C語言代碼被轉換成了單片機能夠執行的代碼,它在項目目錄中的某處,我們現在不去關心這個。之前配置過的external tool可以把這個文件燒錄到單片機中去。如果之前配置過快捷鍵,按F6就可以,或者在菜單欄→Tools中點擊AVRDUDE。輸出結果應該是這樣的:
如果輸出結果不是這樣的,那肯定是下載器出了點問題,可能的輸出有:
“avrdude.exe: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'”:這是下載器的電源問題,保持下載器與開發板連接,拔下下載器后重新插上就能解決;
“avrdude.exe: error: program enable: target doesn't answer.”:這是下載器與開發板之間的連接問題,可能是因為沒有插緊。
如果燒寫成功,現在紅色LED就應該亮起了。