1. mcu 头文件
例如在 ICC AVR(以下简称 ICC)中使用 #include <iom16v.h>或#include <iom128v.h>,
要根据不同的 mcu 型号选择头文件。而在 Atmel Studio(以下简称 AS)中统一用#include
<avr/io.h>。
2. 头文件<macros.h>
在 ICC 中,头文件<macros.h>包含#include <AVRdef.h>。在 AVRdef.h 中,宏定义了一
些常用的汇编指令和一些不常用的函数。例如:(详细内容请参考 ICC 安装程序中
AVRdef.h)
#define WDR() asm("wdr")
#define SEI() asm("sei")
#define CLI() asm("cli")
#define NOP() asm("nop")
#define SLEEP() asm("sleep");
#define _WDR() asm("wdr")
#define _SEI() asm("sei")
#define _CLI() asm("cli")
#define _NOP() asm("nop")
#define _SLEEP() asm("sleep");
#define BIT(x) (1 << (x));
在 AS 中,你可以直接使用 asm("xxx")格式。
Ps:上述做法比较麻烦,我的做法是将这些宏命令添加到一个总的头文件(include.h)
中,所有 c 文件都引用 include.h,那么在移植过程中,将不需要修改代码。
3. 延时函数
在ICC中,delay延时函数,需要自己写,往往不准。而在AS中,只需要加载一个头文件
#include <util/delay.h>,就可以使用两个标准的延时函数,分别是_delay_ms(double
__ms)和_delay_us(double __us),虽然参数为double型,但可赋整型值。以后再也不
用担心延时不准导致时序错误了(想起了步步高点读机的广告:“以后妈妈再也不用担
心我的学习了”,哈哈)。比较讨厌的一点是,这两个延时函数是基于1MHz的晶振频率,
所赋给延时函数的参数值需乘以你所用的晶振频率。例如你用14.7456MHz的晶振,延时
10ms的函数为_delay_ms(10*14.7456)。我的选择是直接去修改util/delay.h,加入宏
定义#define F_CPU 14.7456E6,这样延时10ms的函数写为_delay_ms(10)。这两种方法
各有利弊,自己选择。
4. 中断函数
例如 T0 溢出中断,在 ICC 中如下定义:
#pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF
void timer0_ovf_isr(void)
{…}
timer0_ovf_isr 这个函数名是自定义的。
而在AS中,需加载头文件#include <avr/interrupt.h>,并且函数名为ISR,不可自定
义函数名,格式如下:
ISR( TIMER0_OVF_vect )
评论24