ICCAVR 與 GCCAVR 是最常用的兩個AVR單片機程序,有時候資料不是自己期望的,需要自己移植,掌握一些移植的技巧大有裨益。
他們都是C語言,所以移植非常方便,但是采用不同的編譯器,又有眾多不同。
1、單片機型號頭文件包含
ICCAVR : #include <ioxxxv.h> 如 #include <iom16v.h>
GCCAVR : #include <avr/io.h> 再通過工程的makefile文件包含正確的芯片頭文件。
在確認程序是ICCAVR和GCCAVR之間任意一種編譯器所寫時,這可以作為一種判斷依據(jù)。
2、中斷函數(shù)
ICCAVR : 函數(shù)獨立存在,使用#pragma interrupt_handler functions:n functions為函數(shù)名 n為中斷向量號
//例如比較匹配中斷
#pragma interrupt_handler timer0_comp_isr:20
void timer0_comp_isr(void)
{
//compare occured TCNT0=OCR0
if(OCR0==0x7D) //調(diào)整0x7D
{
OCR0=0x7F;
}
else
{
OCR0=0x7D;
}
PORTA ^= 0x01; //PA0取反
}
GCCAVR: 包含 #include <avr/interrupt.h> 頭文件,然后使用 ISR(n) n為中斷向量號,多個中斷處理,就多個ISR函數(shù)(其實是宏),在早期的版本中還有 SIGNAL(n) 和 INTERRUPT(n)的寫法。GCCAVR中斷的例子如下:
INTERRUPT(SIG_INTERRUPT1) //INT1中斷服務程序
{
//硬件自動清除INTF1標志位
//這里全局中斷被打開,將允許其他中斷嵌套執(zhí)行
_delay_ms(10);
if ((PIND&(1<<EXT_INT1))==0)
LED1_ON(); //點亮LED1
loop_until_bit_is_set(PIND,EXT_INT1);
_delay_ms(10);
}
3、EEPROM讀寫函數(shù)
GCCAVR和ICCAVR都內(nèi)置了EEPROM讀寫函數(shù),但是他們的命名不同,另外他們的寫字串和讀字串函數(shù)的地址和數(shù)據(jù)兩個參數(shù)位置反了。
ICCAVR例子:
EEPROM_WRITE(0x20,"abcdefg"); /*寫字符串到0x20*/
EEPROMwrite(0x10,'a'); /*單字符寫入到0x10,注意是單引號*/
GCCAVR例子:
void eeprom_wb(uint16_t addr, uint8_t val); 將8位數(shù)據(jù)val寫入地址為addr的EEPROM存儲器里
4、其他一些頭文件的差異
ICCAVR常包含的文件 #include <macros.h> GCCAVR里面是沒有的。
GCC中的#include<avr/delay.h> 內(nèi)置的精確(要定義正確的晶振,并選中優(yōu)化才能準確)軟件延時函數(shù),ICCAVR下沒有
GCCAVR有wdt.h 非常通用,ICCAVR沒有,這個可以移植過去!
等編程過程中遇到 再寫給大家。