#ifndef __DEFINES__H #define __DEFINES__H //******************************************************************** #ifdef __CORTEX_M //数据类型定义 typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef unsigned short INT16U; typedef signed short INT16S; typedef unsigned int INT32U; typedef signed int INT32S; typedef unsigned long long INT64U; typedef signed long long INT64S; //存放在FLASH的数据定义 #define __FLASH const //空操作 #define NOP() __NOP() //中断操作 #define IRQ_Enable() __set_PRIMASK(0) //禁止中断屏蔽 #define IRQ_Disable() __set_PRIMASK(1) //中断屏蔽 #define IRQ_Status() (__get_PRIMASK() == 0) //中断屏蔽状态 #endif //******************************************************************** #ifndef __CORTEX_M #ifndef _C51 #define _C51 #endif #endif #ifdef _C51_ //数据类型定义 typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef unsigned short int INT16U; typedef signed short int INT16S; typedef unsigned long INT32U; typedef signed long INT32S; //typedef unsigned long long INT64U; //typedef signed long long INT64S; //存放在FLASH的数据定义 #define __FLASH code //空操作 #define NOP() _nop_() //中断操作 #define IRQ_Enable() SetBit(IE,7) #define IRQ_Disable() ClrBit(IE,7) #define IRQ_Status() DetBit(IE,7) #endif //******************************************************************** //原子操作 #define ATOMIC_Start() do{ \ _Reg<<=1UL; \ if(IRQ_Status()) _Reg|=1UL; \ else _Reg&=~1UL; \ IRQ_Disable(); \ }while(0) //恢复中断设置 #define ATOMIC_Stop() do{ \ if(_Reg&1UL) IRQ_Enable(); \ else IRQ_Disable(); \ _Reg>>=1; \ }while(0) //备份中断设置,设置全局中断 #define NOATOMIC_Start() do{ \ _Reg<<=1UL; \ if(IRQ_Status()) _Reg|=1UL; \ else _Reg&=~1UL; \ IRQ_Enable(); \ }while(0) //恢复中断设置 #define NOATOMIC_Stop() do{ \ if(_Reg&1UL) IRQ_Enable(); \ else IRQ_Disable(); \ _Reg>>=1UL; \ }while(0) //******************************************************************** //位置1 #define SetBit(var,bits) ((var)|=(1<<(bits))) //位清除0 #define ClrBit(var,bits) ((var)&=(~(1<<(bits)))) //读取位 #define ReadBit(var,bits) (((var)&(1<<(bits)))?1:0) //测试位 #define DetBit(var,bits) (((var)&(1<<(bits)))) //翻转位 #define TurnBit(var,bits) ((var)^=((1<(y))?(x):(y)) //求最小数 #define Min(x,y) (((x)<(y))?(x):(y)) //求差值 #define Diff(x,y) (((x)>(y))?((x)-(y)):((y)-(x))) //检查x是否超出y设定的公差范围, #define RangOut(x,y,tol) (((x) > ((y)+(tol))) || ((y) > ((x)+(tol)))) //得到一个field在结构体(struct)中的偏移量 #define Fpos(type,field) ((INT32U)&((type *)0)->filed) //得到一个结构体中field所占用的字节数 #define Fsize(type,field) sizeof(((type *)0)->field) //将一个字母转换为大写 #define Upcase(c) (((c)>='a'&&(c)<='z')?((c)-0x20):(c)) //半字大小端转换 #define BigEnd2Byte(ptr) (((*ptr) >> 8) & 0x00ff) | (((*ptr) << 8) & 0xff00) //字大小端转换 #define BigEnd4Byte(ptr) ((((*ptr)>>24)&0xff) | (((*ptr)>>8)&0xff00) | (((*ptr)<<8)&0xff0000) | (((*ptr)<<24)&0xff000000)) // //数据拼接 #ifdef __CORTEX_M #define Byte2HalfWord(ptrs) ((((INT16U)ptrs[0]) << 0) | (((INT16U)ptrs[1]) << 8)) #else #define Byte2HalfWord(ptrs) ((((INT16U)ptrs[0]) << 8) | (((INT16U)ptrs[1]) << 0)) #endif enum{ ON = 1, OFF = 0, #ifndef __CORTEX_M ENABLE = 1, DISABLE = 0, #endif TRUE = 1, FALSE = 0, }; //*********************************************************************************** typedef union{ INT8U BYTES; struct{ INT8U BIT0:1; INT8U BIT1:1; INT8U BIT2:1; INT8U BIT3:1; INT8U BIT4:1; INT8U BIT5:1; INT8U BIT6:1; INT8U BIT7:1; }BITS; }INT8U_Str; typedef union{ INT16U HALFWORDS; INT8U BYTES[2]; struct{ INT8U BIT0:1; INT8U BIT1:1; INT8U BIT2:1; INT8U BIT3:1; INT8U BIT4:1; INT8U BIT5:1; INT8U BIT6:1; INT8U BIT7:1; INT8U BIT8:1; INT8U BIT9:1; INT8U BIT10:1; INT8U BIT11:1; INT8U BIT12:1; INT8U BIT13:1; INT8U BIT14:1; INT8U BIT15:1; }BITS; }INT16U_Str; typedef union{ INT32U WORDS; INT16U HALFWORDS[2]; INT8U BYTES[4]; struct{ INT8U BIT0:1; INT8U BIT1:1; INT8U BIT2:1; INT8U BIT3:1; INT8U BIT4:1; INT8U BIT5:1; INT8U BIT6:1; INT8U BIT7:1; INT8U BIT8:1; INT8U BIT9:1; INT8U BIT10:1; INT8U BIT11:1; INT8U BIT12:1; INT8U BIT13:1; INT8U BIT14:1; INT8U BIT15:1; INT8U BIT16:1; INT8U BIT17:1; INT8U BIT18:1; INT8U BIT19:1; INT8U BIT20:1; INT8U BIT21:1; INT8U BIT22:1; INT8U BIT23:1; INT8U BIT24:1; INT8U BIT25:1; INT8U BIT26:1; INT8U BIT27:1; INT8U BIT28:1; INT8U BIT29:1; INT8U BIT30:1; INT8U BIT31:1; }BITS; }INT32U_Str; #endif