|
发表于 2005-10-18 20:35:01
|
显示全部楼层
CONST定义的变量会放在FLASH和ram中。
使用下面这个加FLASH,就可以编译过去。
/*
********************************************************************************************
头部文件名: MCU_C_Macro_Data_Define.h
头部文件名称: 嵌入式微处理器C程序的数据类型和常用指令宏定义的头部文件
适用器件芯片类型: 嵌入式微处理器
文件版本: 1.0
文件功能:
本文件是对嵌入式微处理器C程序的数据类型、在编程中一些常用操作和指令及位操作进行
宏定义的头部文件。
文件说明:
在使用本文件前,必须首先使用全局预定义字符来对C编译系统进行定义!
对各种C编译系统规定使用的全局预定义字符如下(中括号里面的字符):
①.IAR Embedded Workbench for Atmel AVR ------ [_IAR_EW_AVR_]
②.ICCAVR ------------------------------------ [_ICC_AVR_]
③.CodeVision AVR ---------------------------- [_CodeVision_AVR_]
编译工具软件:
链接文件:
编作者:
编作者 E-Mail: PTZSW@163.COM
编制日期: 2005年8月18日
----------------------------------------------------------------------------------------
头部文件版本历史:
2005年8月18日 -------- 版本 1.0 :发行版本
********************************************************************************************
*/
/*==========================================================================================
下面两条指令是本头部文件条件编译的预处理指令,用于防止本头部文件被其他文件重复引用。
==========================================================================================*/
#ifndef MCU_C_MACRO_DATA_DEFINE_H // "MCU_C_MACRO_DATA_DEFINE_H" 条件编译开始
#define MCU_C_MACRO_DATA_DEFINE_H
/*==========================================================================================
下面这三条指令是用于区分编译系统为 C++ 或 C 的预处理指令。
"__cplusplus" 为 C++ 预处理器名字,这三条指令表明接在其下面的那些指令为 C 程序特征。
==========================================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
/*==========================================================================================
定义系统处理的数据位字长度大小:
==========================================================================================*/
#define SYSDATA_BITNUM 8 // 定义系统数据位的字长数
/*==========================================================================================
为了做到较好的软件可移植性,推荐用户在编程时使用下面定义的数据类型大小
==========================================================================================*/
typedef unsigned char BOOLEAN; // 定义【布尔(逻辑)】数据类型
typedef char char8; // char8 代表【有符号字符】数据类型
typedef unsigned char Uchar8; // Uchar8 代表【无符号字符】数据类型
typedef int int16; // int16 代表【有符号整数】数据类型
typedef unsigned int Uint16; // Uint16 代表【无符号整数】数据类型
typedef long int int32; // int32 代表【有符号长整数】数据类型
typedef unsigned long int Uint32; // Uint32 代表【无符号长整数】数据类型
typedef float float32; // float32 代表【单精度浮点数】数据类型
/*==========================================================================================
位操作定义(用于变量中某一位的直接置位/清除位),推荐置位/清除位的语句为:
①.变量名称 |= BITn; 置位操作(将变量与下面的位定义值进行按位或运算)
②.变量名称 &= ~BITn; 清除位操作(将变量与下面的位定义值的非值进行按位与运算)
==========================================================================================*/
#define BIT0 0x01 // BIT0 = (1<<1) = 0b00000001
#define BIT1 0x02 // BIT1 = (1<<2) = 0b00000010
#define BIT2 0x04 // BIT2 = (1<<3) = 0b00000100
#define BIT3 0x08 // BIT3 = (1<<4) = 0b00001000
#define BIT4 0x10 // BIT4 = (1<<5) = 0b00010000
#define BIT5 0x20 // BIT5 = (1<<6) = 0b00100000
#define BIT6 0x40 // BIT6 = (1<<7) = 0b01000000
#define BIT7 0x80 // BIT7 = (1<<8) = 0b10000000
#define BIT_HIGH BIT7 // BIT7 = (1<<8) = 0b10000000
#define BIT_LOW BIT0 // BIT0 = (1<<1) = 0b00000001
/*
********************************************************************************************
AVR单片机常用操作和指令宏的定义
********************************************************************************************
*/
/*--------------------------------------------------------------------------------------
位操作指令的宏定义:
①.对存储在地址中的数据变量执行置位操作指令: SET_BIT(ADDRESS,BIT)
②.对存储在地址中的数据变量执行清位操作指令: CLEAR_BIT(ADDRESS,BIT)
③.测试存储在地址中的数据变量某一位数值的指令:TEST_BIT(ADDRESS,BIT)
其中:ADDRESS ----- 变量存储地址
BIT --------- 位数(阿拉伯数字)
--------------------------------------------------------------------------------------*/
#if defined(_IAR_EW_AVR_) || defined(_ICC_AVR_) || defined(_CodeVision_AVR_)
#define SET_BIT(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
#define CLEAR_BIT(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT)))
#define TEST_BIT(ADDRESS,BIT) ((ADDRESS) & (1<<(BIT)))
#endif
/*--------------------------------------------------------------------------------------
IAR Embedded Workbench for AVR 编译器对16位的寄存器进行读写操作指令的宏定义:
①.对16位的寄存器进行写入的操作指令:OUT_WORD(ADDRESS,VAL)
②.读取16位的寄存器中内容的操作指令:IN_WORD(ADDRESS,VAL)
其中:ADDRESS ----- 寄存器的存储地址
VAL --------- 位数(阿拉伯数字)
--------------------------------------------------------------------------------------*/
#if defined(_IAR_EW_AVR_) // "IAR Embedded Workbench AVR " 条件编译开始
#define OUT_WORD(ADDRESS,VAL) \
{\
__disable_interrupt();\
(ADDRESS) = (VAL);\
__enable_interrupt();\
}
#define IN_WORD(ADDRESS,VAL) \
{\
__disable_interrupt();\
(VAL) = (ADDRESS);\
__enable_interrupt();\
}
#endif // "defined(_IAR_EW_AVR_)" 条件编译结束
/*--------------------------------------------------------------------------------------
在编程中一些常用操作和指令宏的定义:
①.WDR() -------- 看门狗定时器复位指令
②.SEI() -------- 使能全局中断指令
③.CLI() -------- 禁止全局中断指令
④.SLEEP() ------ MCU进入休眠状态指令
⑤.NOP() -------- 空操作指令
--------------------------------------------------------------------------------------*/
#if defined(_IAR_EW_AVR_) || defined(_ICC_AVR_) || defined(_CodeVision_AVR_)
#define WDR() asm("wdr") // 看门狗定时器复位
#define SEI() asm("sei") // 使能全局中断
#define CLI() asm("cli") // 禁止全局中断
#define SLEEP() asm("sleep") // MCU进入休眠状态
#define NOP() asm("nop") // 空操作
#endif
/*--------------------------------------------------------------------------------------
EEPROM存储器扩展的操作和指令宏的定义:
①.eeprom ----------------------------- 指向 EEPROM 存储器的关键字
②.EEPROM_WRITE(ADDRESS, DATA) -------- 写入数据到 EEPROM 存储器中某一个具体地址的指令
③.EEPROM_READ(DATA, ADDRESS) --------- 从 EEPROM 存储器中某一个具体地址读取数据的指令
其中:ADDRESS --------- 访问 EEPROM 存储器的具体地址
DATA ------------ 对 EEPROM 存储器执行操作的数据
--------------------------------------------------------------------------------------*/
#if defined(_IAR_EW_AVR_) // "IAR Embedded Workbench AVR " 条件编译开始
#define eeprom __eeprom // 定义指向 EEPROM 存储器的关键字
#ifndef EEPROM_WRITE
#define EEPROM_WRITE(ADDRESS, DATA) __EEPUT(ADDRESS, DATA)
#endif
#ifndef EEPROM_READ
#define EEPROM_READ(DATA, ADDRESS) __EEGET(DATA, ADDRESS)
#endif
#ifndef _EEPUT
#define _EEPUT(V,A) __EEPUT(V,A)
#endif
#ifndef _EEGET
#define _EEGET(V,A) __EEGET(V,A)
#endif
#ifdef __HAS_EEPROM__ // "__HAS_EEPROM__"条件编译开始
#define __EEPUT(ADDRESS, DATA) (*((unsigned char __eeprom *)ADDRESS) = DATA)
#define __EEGET(DATA, ADDRESS) (DATA = *((unsigned char __eeprom *)ADDRESS))
#else
#define __EEPUT(ADDRESS, DATA) { \
while (EECR & 0x02); \
EEAR = (ADDRESS); \
EEDR = (DATA); \
EECR = 0x04; \
EECR = 0x02; \
}
#define __EEGET(DATA, ADDRESS) { \
while (EECR & 0x02); \
EEAR = (ADDRESS); \
EECR = 0x01; \
(DATA) = EEDR; \
}
#endif // "__HAS_EEPROM__" 条件编译结束
#endif // "defined(_IAR_EW_AVR_)" 条件编译结束
#if defined(_CodeVision_AVR_) // "CodeVision AVR 编译器"条件编译开始
#define EEPROM_WRITE(ADDRESS, DATA) (eeprom *((volatile unsigned char *)ADDRESS) = DATA)
#define EEPROM_READ(DATA, ADDRESS) (DATA = eeprom *((volatile unsigned char *)ADDRESS))
#endif // "_CodeVision_AVR_" 条件编译结束
#if defined(_ICC_AVR_) // "ICC AVR 编译器"条件编译开始
#endif // "_ICC_AVR_" 条件编译结束
/*
********************************************************************************************
AVR单片机各编译系统的字符不同而操作功能相同的扩展关键字,为彼此之间相至兼容而定义的宏字符
********************************************************************************************
*/
/*==========================================================================================
IAR Embedded Workbench for AVR 头部文件“comp_a90.h”中的兼容性宏定义
==========================================================================================*/
#if defined(_IAR_EW_AVR_) // "IAR Embedded Workbench AVR " 条件编译开始
#ifndef __COMP_A90_H // "__COMP_A90_H" 条件编译开始
#define __COMP_A90_H
#define tiny __tiny
#define near __near
#define far __far
#define huge __huge
#define flash const __flash
#define farflash const __farflash
#define nearfunc __nearfunc
#define farfunc __farfunc
#define sfrb int int int Cannot use sfrb keyword in iccAVR;
#define sfrw int int int Cannot use sfrw keyword in iccAVR;
#define monitor __monitor
#define C_task __C_task
#define no_init __no_init
#ifndef _CLI
#define _CLI() __disable_interrupt()
#endif
#ifndef disable_interrupt
#define disable_interrupt() __disable_interrupt()
#endif
#ifndef _SEI
#define _SEI() __enable_interrupt()
#endif
#ifndef enable_interrupt
#define enable_interrupt() __enable_interrupt()
#endif
#ifndef _NOP
#define _NOP() __no_operation()
#endif
#ifndef _SLEEP
#define _SLEEP() __sleep()
#endif
#ifndef _LPM
#define _LPM(ADDR) __load_program_memory(ADDR)
#endif
#ifdef __HAS_ELPM__
#ifndef _ELPM
#define _ELPM(ADDR) __extended_load_program_memory(ADDR)
#endif
#endif
#ifndef _WDR
#define _WDR() __watchdog_reset()
#endif
#ifndef _OPC
#define _OPC(opCode) __insert_opcode(opCode)
#endif
#endif // "__COMP_A90_H" 条件编译结束
#endif // "defined(_IAR_EW_AVR_)" 条件编译结束
/*==========================================================================================
IAR Embedded Workbench for AVR 头部文件“INAVR.H”中的兼容性宏定义
==========================================================================================*/
#if defined(_IAR_EW_AVR_) // "IAR Embedded Workbench AVR " 条件编译开始
#ifndef __INAVR_H // "__INAVR_H" 条件编译开始
#define __INAVR_H
__intrinsic void __no_operation(void);
__intrinsic void __enable_interrupt(void);
__intrinsic void __disable_interrupt(void);
__intrinsic void __sleep(void);
__intrinsic void __watchdog_reset(void);
#define __clear_watchdog_timer() __watchdog_reset()
#pragma language=extended
__intrinsic unsigned char __load_program_memory(const unsigned char __flash *);
#ifdef __HAS_ELPM__
__intrinsic unsigned char __extended_load_program_memory(const unsigned char __farflash *);
#endif
#pragma language=default
__intrinsic void __insert_opcode(unsigned short op);
#if __MEMORY_MODEL__ == 4
#if __CPU__ < 2
#define __STR_MATTR__ __flash
#else
#define __STR_MATTR__ __hugeflash
#endif
#else
#define __STR_MATTR__
#endif
__intrinsic void __require(void *);
__intrinsic void __delay_cycles(unsigned long);
__intrinsic unsigned char __save_interrupt(void);
#define __get_interrupt_state() __save_interrupt()
__intrinsic void __restore_interrupt(unsigned char);
#define __set_interrupt_state(STATE) __restore_interrupt(STATE)
__intrinsic unsigned char __swap_nibbles(unsigned char);
__intrinsic void __indirect_jump_to(unsigned long);
/*--------------------------------------------------------------------------------------
增强型核心指令集的内在函数定义
--------------------------------------------------------------------------------------*/
#ifdef __HAS_ENHANCED_CORE__
#ifdef __HAS_MUL__
__intrinsic unsigned int __multiply_unsigned(unsigned char, unsigned char);
__intrinsic signed int __multiply_signed(signed char, signed char);
__intrinsic signed int __multiply_signed_with_unsigned(signed char, unsigned char);
__intrinsic unsigned int __fractional_multiply_unsigned(unsigned char, unsigned char);
__intrinsic signed int __fractional_multiply_signed(signed char, signed char);
__intrinsic signed int __fractional_multiply_signed_with_unsigned(signed char, signed char);
#endif
#pragma language=extended
/* SPM */
__intrinsic void __DataToR0ByteToSPMCR_SPM(unsigned char data,
unsigned char byte);
__intrinsic void __AddrToZByteToSPMCR_SPM(void __flash* addr,
unsigned char byte);
__intrinsic void __AddrToZWordToR1R0ByteToSPMCR_SPM(void __flash* addr,
unsigned short word,
unsigned char byte);
#define _SPM_LOCKBITS(Data) __DataToR0ByteToSPMCR_SPM((Data), 0x09)
#define _SPM_ERASE(Addr) __AddrToZByteToSPMCR_SPM((void __flash*)(Addr), 0x03)
#define _SPM_FILLTEMP(Addr,Data) \
__AddrToZWordToR1R0ByteToSPMCR_SPM((void __flash*)(Addr), (Data), 0x01)
#define _SPM_PAGEWRITE(Addr) __AddrToZByteToSPMCR_SPM((void __flash*)(Addr), (0x05))
__intrinsic unsigned char __AddrToZByteToSPMCR_LPM(void __flash* addr,
unsigned char byte);
#define _SPM_GET_LOCKBITS() __AddrToZByteToSPMCR_LPM((void __flash*)0x0001, 0x09)
#define _SPM_GET_FUSEBITS() __AddrToZByteToSPMCR_LPM((void __flash*)0x0000, 0x09)
#ifdef __HAS_ELPM__
__intrinsic void __AddrToZ24ByteToSPMCR_SPM(void __farflash* addr,
unsigned char byte);
__intrinsic void __AddrToZ24WordToR1R0ByteToSPMCR_SPM(void __farflash* addr,
unsigned short word,
unsigned char byte);
#define _SPM_24_ERASE(Addr) __AddrToZ24ByteToSPMCR_SPM((void __farflash*)(Addr), 0x03)
#define _SPM_24_FILLTEMP(Addr,Data) \
__AddrToZ24WordToR1R0ByteToSPMCR_SPM((void __farflash*)(Addr), (Data), 0x01)
#define _SPM_24_PAGEWRITE(Addr) __AddrToZ24ByteToSPMCR_SPM((void __farflash*)(Addr), (0x05))
__intrinsic unsigned char __AddrToZ24ByteToSPMCR_ELPM(void __farflash* addr,
unsigned char byte);
#endif
#pragma language=default
#endif //__HAS_ENHANCED_CORE__
/* PORT is a sfrb defined variable */
#define input(PORT) (PORT)
#define output(PORT,VAL) ((PORT)=(VAL))
#define input_block_dec(PORT,ADDRESS,COUNT)\
{ \
unsigned char i;\
unsigned char *addr=(ADDRESS);\
for(i=0;i<(COUNT);i++)\
*addr--=(PORT);\
}
#define input_block_inc(PORT,ADDRESS,COUNT)\
{ \
unsigned char i;\
unsigned char *addr=(ADDRESS);\
for(i=0;i<(COUNT);i++)\
*addr++=(PORT);\
}
#define output_block_dec(PORT,ADDRESS,COUNT)\
{ \
unsigned char i;\
unsigned char *addr=(ADDRESS);\
for(i=0;i<(COUNT);i++)\
(PORT)=*addr--;\
}
#define output_block_inc(PORT,ADDRESS,COUNT)\
{ \
unsigned char i;\
unsigned char *addr=(ADDRESS);\
for(i=0;i<(COUNT);i++)\
(PORT)=*addr++;\
}
/*--------------------------------------------------------------------------------------
一些常用的宏定义
--------------------------------------------------------------------------------------*/
#define __out_word(BaseName, value)\
{\
unsigned char _tH=(value) >> 8;\
unsigned char _tL=(value) & 0xFF;\
BaseName ## H = _tH;\
BaseName ## L = _tL;\
}
#define __out_word_atomic(BaseName, value)\
{\
unsigned char _t=__save_interrupt();\
__disable_interrupt();\
__out_word(BaseName,value);\
__restore_interrupt(_t);\
}
#define __in_word(BaseName, value)\
{\
(value) = (BaseName ## L);\
(value) |= (unsigned short)BaseName ## H << 8;\
}
#define __in_word_atomic(BaseName, value)\
{\
unsigned char _t=__save_interrupt();\
__disable_interrupt();\
__in_word(BaseName, value);\
__restore_interrupt(_t);\
}
#endif // "__INAVR_H" 条件编译结束
#endif // "defined(_IAR_EW_AVR_)" 条件编译结束
/*==========================================================================================
下面这三条指令是用于与上面三条区分编译系统为 C++ 或 C 的预处理指令相对应。用于指定
extern "C" 链接指示符作用域,此处的"}"与上面的"{"相对应,为链接指示符作用结束符。
==========================================================================================*/
#ifdef __cplusplus
}
#endif
#endif // "MCU_C_MACRO_DATA_DEFINE_H" 条件编译结束
/*
********************************************************************************************
本头部文件到此结束
********************************************************************************************
*/ |
|