产品
有人云 — 物联网云平台 零编程,组态拖拽即可实现远程监控。同时支持私有部署,拥有属于自己的软硬件一体化方案
200
+
私有云项目
数据本地化
业务个性化
10
+
万 公有云注册用户
80%公有云功能免费
付费VIP享自定义品牌服务
有人云官网
有人智造 — ODM/EMS 依托自动化、智能化、柔性化、透明化的智能工厂,
提供代研、代料、代工一站式OEM/ODM服务
有人智造官网
有人智能 — 解决方案 打包提供云、管、边、端整体解决方案
从问题诊断、方案设计,到实施落地、系统运维
有人智能官网
新闻资讯
ICCAVR 与 GCCAVR 程序移植
2010-09-19


ICCAVR 与 GCCAVR 是最常用的两个AVR单片机程序,有时候资料不是自己期望的,需要自己移植,掌握一些移植的技巧大有裨益。

他们都是C语言,所以移植非常方便,但是采用不同的编译器,又有众多不同。

1、单片机型号头文件包含

ICCAVR : #include <ioxxxv.h>#include <iom16v.h>

GCCAVR :  #include <avr/io.h> 再通过工程的makefile文件包含正确的芯片头文件。

在确认程序是ICCAVR和GCCAVR之间任意一种编译器所写时,这可以作为一种判断依据。

2、中断函数

ICCAVR : 函数独立存在,使用#pragma interrupt_handler functions:n   functions为函数名 n为中断向量号

//例如比较匹配中断
#pragma interrupt_handler timer0_comp_isr:20
void timer0_comp_isr(void)
{
//compare occured TCNT0=OCR0
if(OCR0==0x7D) //调整0x7D
{
OCR0=0x7F;
}
else
{
OCR0=0x7D;
}
PORTA ^= 0x01; //PA0取反
}

GCCAVR: 包含 #include <avr/interrupt.h> 头文件,然后使用 ISR(n) n为中断向量号,多个中断处理,就多个ISR函数(其实是宏),在早期的版本中还有 SIGNAL(n) 和 INTERRUPT(n)的写法。GCCAVR中断的例子如下:

INTERRUPT(SIG_INTERRUPT1) //INT1中断服务程序
{
//硬件自动清除INTF1标志位
//这里全局中断被打开,将允许其他中断嵌套执行
_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读写函数

GCCAVR和ICCAVR都内置了EEPROM读写函数,但是他们的命名不同,另外他们的写字串和读字串函数的地址和数据两个参数位置反了。

ICCAVR例子:

EEPROM_WRITE(0x20,"abcdefg");                               /*写字符串到0x20*/
EEPROMwrite(0x10,'a');                                      /*单字符写入到0x10,注意是单引号*/


GCCAVR例子:

void eeprom_wb(uint16_t addr, uint8_t val);  将8位数据val写入地址为addr的EEPROM存储器里

4、其他一些头文件的差异

ICCAVR常包含的文件 #include <macros.h> GCCAVR里面是没有的。
GCC中的#include<avr/delay.h> 内置的精确(要定义正确的晶振,并选中优化才能准确)软件延时函数,ICCAVR下没有
GCCAVR有wdt.h 非常通用,ICCAVR没有,这个可以移植过去!

等编程过程中遇到 再写给大家。

工作日每天: 14:00~17:00
抖音、天猫 "有人旗舰店"

关注有人微信公众号
了解更多信息