STM8 IAR中实现类似 位带操作【兼容库函数】

STM8 IAR中实现类似 位带操作【兼容库函数】

用了STM8有一段时间了,发现STM8用IAR自带的"iostm8xxx.h" 和ST的标准库不能共存,
于是结合IAR的库以及仿照 正点原子STM32 例程里面的"sys.h",写个"stm8_sys.h",方便自己,也方便其他人。谢谢支持!

代码如下:

/************************************************************************
  * 文件 :stm8_sys.h
  * 作者 :QinYUN575
  * 版本 :V1.0
  * 时间 :2017年11月5日 17:11:10
  * 描述 :STM8实现位带操作
  * 注意&示例:
  * 将PA.0置高: PAout(0) = HIGHT_LEVEL 或者 PAout(0) = 1;
  * 读取PA.0引脚电平: bit = PAin(0);
  ***********************************************************************/
#ifndef __SYS_H_
#define __SYS_H_
#include "stm8s.h"

#define HIGHT_LEVEL	1;	/*定义高电平*/
#define LOW_LEVEL	0;	/*定义低电平*/

#define __READ_WRITE		/*可读写*/
#define __READ     const	/*只读*/

/*---------------------------------------------
 * 将NAME定义成有按位访问I/O口寄存器权限的联合体类型
 * 访问8位的寄存器: NAME
 * 访问位: NAME_bit.noXX
 *--------------------------------------------*/
#define __IO_REG8_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT)			\
						__near __no_init volatile ATTRIBUTE union	\
							{										\
								unsigned char NAME;					\
                                BIT_STRUCT NAME ## _bit;            \
							} @ADDRESS;

/*-------------------------------------------------------------------------
 *      端口寄存器定义
 *-----------------------------------------------------------------------*/
/* 端口数据输出寄存器 */
typedef struct
{
  unsigned char ODR0        : 1;
  unsigned char ODR1        : 1;
  unsigned char ODR2        : 1;
  unsigned char ODR3        : 1;
  unsigned char ODR4        : 1;
  unsigned char ODR5        : 1;
  unsigned char ODR6        : 1;
  unsigned char ODR7        : 1;
} __BITS_ODR;

/* 输入引脚寄存器 */
typedef struct
{
  unsigned char IDR0        : 1;
  unsigned char IDR1        : 1;
  unsigned char IDR2        : 1;
  unsigned char IDR3        : 1;
  unsigned char IDR4        : 1;
  unsigned char IDR5        : 1;
  unsigned char IDR6        : 1;
  unsigned char IDR7        : 1;
} __BITS_IDR;

/* 端口模式寄存器 */
typedef struct
{
  unsigned char DDR0        : 1;
  unsigned char DDR1        : 1;
  unsigned char DDR2        : 1;
  unsigned char DDR3        : 1;
  unsigned char DDR4        : 1;
  unsigned char DDR5        : 1;
  unsigned char DDR6        : 1;
  unsigned char DDR7        : 1;
} __BITS_DDR;

/* 端口控制寄存器1 */
typedef struct
{
  unsigned char C10         : 1;
  unsigned char C11         : 1;
  unsigned char C12         : 1;
  unsigned char C13         : 1;
  unsigned char C14         : 1;
  unsigned char C15         : 1;
  unsigned char C16         : 1;
  unsigned char C17         : 1;
} __BITS_CR1;

/* 端口控制寄存器2 */
typedef struct
{
  unsigned char C20         : 1;
  unsigned char C21         : 1;
  unsigned char C22         : 1;
  unsigned char C23         : 1;
  unsigned char C24         : 1;
  unsigned char C25         : 1;
  unsigned char C26         : 1;
  unsigned char C27         : 1;
} __BITS_CR2;


/*-------------------------------------------------------------------------
 *      端口地址结构体[联合体]定义
 *-----------------------------------------------------------------------*/
/* 端口输出地址定义 */
__IO_REG8_BIT(PA_ODR,      0x5000, __READ_WRITE, __BITS_ODR);	//PA输出口 
__IO_REG8_BIT(PB_ODR,      0x5005, __READ_WRITE, __BITS_ODR);	//PB输出口 
__IO_REG8_BIT(PC_ODR,      0x500A, __READ_WRITE, __BITS_ODR);	//PC输出口 
__IO_REG8_BIT(PD_ODR,      0x500F, __READ_WRITE, __BITS_ODR);	//PD输出口 
__IO_REG8_BIT(PE_ODR,      0x5014, __READ_WRITE, __BITS_ODR);	//PE输出口 
__IO_REG8_BIT(PF_ODR,      0x5019, __READ_WRITE, __BITS_ODR);	//PF输出口 
__IO_REG8_BIT(PG_ODR,      0x501E, __READ_WRITE, __BITS_ODR);	//PG输出口 
__IO_REG8_BIT(PH_ODR,      0x5023, __READ_WRITE, __BITS_ODR);	//PH输出口 
__IO_REG8_BIT(PI_ODR,      0x5028, __READ_WRITE, __BITS_ODR);	//PI输出口 

/* 端口输入地址定义 */
__IO_REG8_BIT(PA_IDR,      0x5001, __READ, __BITS_IDR);	//PA输入口 
__IO_REG8_BIT(PB_IDR,      0x5006, __READ, __BITS_IDR);	//PB输入口 
__IO_REG8_BIT(PC_IDR,      0x500B, __READ, __BITS_IDR);	//PC输入口 
__IO_REG8_BIT(PD_IDR,      0x5010, __READ, __BITS_IDR);	//PD输入口 
__IO_REG8_BIT(PE_IDR,      0x5015, __READ, __BITS_IDR);	//PE输入口 
__IO_REG8_BIT(PF_IDR,      0x501A, __READ, __BITS_IDR);	//PF输入口 
__IO_REG8_BIT(PG_IDR,      0x501F, __READ, __BITS_IDR);	//PG输入口 
__IO_REG8_BIT(PH_IDR,      0x5024, __READ, __BITS_IDR);	//PH输入口 
__IO_REG8_BIT(PI_IDR,      0x5029, __READ, __BITS_IDR);	//PI输入口 
/* 端口模式配置寄存器地址定义 */
__IO_REG8_BIT(PA_DDR,      0x5002, __READ_WRITE, __BITS_DDR);
__IO_REG8_BIT(PB_DDR,      0x5007, __READ_WRITE, __BITS_DDR);
__IO_REG8_BIT(PC_DDR,      0x500C, __READ_WRITE, __BITS_DDR);
__IO_REG8_BIT(PD_DDR,      0x5011, __READ_WRITE, __BITS_DDR);
__IO_REG8_BIT(PE_DDR,      0x5016, __READ_WRITE, __BITS_DDR);
__IO_REG8_BIT(PF_DDR,      0x501B, __READ_WRITE, __BITS_DDR);
__IO_REG8_BIT(PG_DDR,      0x5020, __READ_WRITE, __BITS_DDR);
__IO_REG8_BIT(PH_DDR,      0x5025, __READ_WRITE, __BITS_DDR);
__IO_REG8_BIT(PI_DDR,      0x502A, __READ_WRITE, __BITS_DDR);

/* 端口控制寄存器1地址定义 */
__IO_REG8_BIT(PA_CR1,      0x5003, __READ_WRITE, __BITS_CR1);
__IO_REG8_BIT(PB_CR1,      0x5008, __READ_WRITE, __BITS_CR1);
__IO_REG8_BIT(PC_CR1,      0x500D, __READ_WRITE, __BITS_CR1);
__IO_REG8_BIT(PD_CR1,      0x5012, __READ_WRITE, __BITS_CR1);
__IO_REG8_BIT(PE_CR1,      0x5017, __READ_WRITE, __BITS_CR1);
__IO_REG8_BIT(PF_CR1,      0x501C, __READ_WRITE, __BITS_CR1);
__IO_REG8_BIT(PG_CR1,      0x5021, __READ_WRITE, __BITS_CR1);
__IO_REG8_BIT(PH_CR1,      0x5026, __READ_WRITE, __BITS_CR1);
__IO_REG8_BIT(PI_CR1,      0x502B, __READ_WRITE, __BITS_CR1);

/* 端口控制寄存器2地址定义 */
__IO_REG8_BIT(PA_CR2,      0x5004, __READ_WRITE, __BITS_CR2);
__IO_REG8_BIT(PB_CR2,      0x5009, __READ_WRITE, __BITS_CR2);
__IO_REG8_BIT(PC_CR2,      0x500E, __READ_WRITE, __BITS_CR2);
__IO_REG8_BIT(PD_CR2,      0x5013, __READ_WRITE, __BITS_CR2);
__IO_REG8_BIT(PE_CR2,      0x5018, __READ_WRITE, __BITS_CR2);
__IO_REG8_BIT(PF_CR2,      0x501D, __READ_WRITE, __BITS_CR2);
__IO_REG8_BIT(PG_CR2,      0x5022, __READ_WRITE, __BITS_CR2);
__IO_REG8_BIT(PH_CR2,      0x5027, __READ_WRITE, __BITS_CR2);
__IO_REG8_BIT(PI_CR2,      0x502C, __READ_WRITE, __BITS_CR2);

/*-------------------------------------------------------------------------
 * 实现位带操作
 *-----------------------------------------------------------------------*/
#define PAout(n) PA_ODR_bit.ODR##n
#define PBout(n) PB_ODR_bit.ODR##n
#define PCout(n) PC_ODR_bit.ODR##n
#define PDout(n) PD_ODR_bit.ODR##n
#define PEout(n) PE_ODR_bit.ODR##n
#define PFout(n) PF_ODR_bit.ODR##n
#define PGout(n) PG_ODR_bit.ODR##n
#define PHout(n) PH_ODR_bit.ODR##n
#define PIout(n) PI_ODR_bit.ODR##n

#define PAin(n)  PA_IDR_bit.IDR##n
#define PBin(n)  PB_IDR_bit.IDR##n
#define PCin(n)  PC_IDR_bit.IDR##n
#define PDin(n)  PD_IDR_bit.IDR##n
#define PEin(n)  PE_IDR_bit.IDR##n
#define PFin(n)  PF_IDR_bit.IDR##n
#define PGin(n)  PG_IDR_bit.IDR##n
#define PHin(n)  PH_IDR_bit.IDR##n
#define PIin(n)  PI_IDR_bit.IDR##n

#endif


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值