历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2020年04月22日 | STM8 IAR中实现类似 位带操作【兼容库函数】

2020-04-22 来源:eefocus

用了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

推荐阅读

史海拾趣

大毅科技公司的发展小趣事

大毅科技于1989年成立,是台湾的一家新兴企业。在公司成立的初期,大毅科技就专注于晶片电阻的研发与生产,这在当时是一个相对新兴且竞争激烈的领域。创始人凭借对技术的深刻理解和敏锐的市场洞察力,带领公司逐步在市场中站稳脚跟。通过不断的技术创新和产品优化,大毅科技逐渐获得了客户的认可,并在行业中树立了自己的品牌。

Elma Electronic Inc公司的发展小趣事

Elma对产品质量的追求是显而易见的。通过对所有员工的培训以及遵循认证的ISO标准的系统程序,Elma达到了行业领先的质量水平。这种对质量的承诺不仅体现在产品制造过程中,更贯穿于整个公司的运营和管理中。

Fractus公司的发展小趣事

随着技术的不断成熟和产品的市场推广,Fractus逐渐获得了业界的广泛认可。公司在多个国际展会上展示了其创新的天线技术,并赢得了多项重要奖项,包括欧洲联盟IST奖项的特等奖等。这些荣誉不仅提升了Fractus的品牌知名度,也进一步巩固了其在天线技术领域的领先地位。

国产公司的发展小趣事
对于功率较大的放大器,需要采用高效的散热措施来确保电路的稳定运行和长寿命。
DAYA公司的发展小趣事

在环保意识日益增强的今天,大雅智能积极响应国家节能减排政策,推动绿色环保生产。通过采用环保材料和节能技术,大雅智能有效降低了产品生产和使用过程中的能耗和排放。同时,大雅智能还积极参与环保公益活动,倡导绿色消费理念。这些举措不仅提高了大雅智能的社会责任感形象,也为其可持续发展奠定了坚实基础。

以上五个故事均基于虚构的DAYA公司(大雅智能)在电子行业中的发展经历,旨在展示一个电子科技公司可能面临的市场挑战、机遇以及发展策略。这些故事虽然并非真实事件,但其中蕴含的商业逻辑和发展趋势对于电子行业的其他公司也具有一定的借鉴意义。

Computer Conversions Corp公司的发展小趣事

随着公司技术的成熟和知名度的提升,Computer Conversions Corp开始将目光投向国际市场。公司派出专业的市场拓展团队,深入欧洲、亚洲等多个地区进行市场调研。经过一系列精准的市场分析和产品定位,公司成功地将产品推向了全球市场。这一过程中,他们不仅赢得了众多国际客户的信赖,还通过与当地企业的合作,进一步提升了品牌的影响力和市场份额。

问答坊 | AI 解惑

EMI_的诊断与抑制的几点建议

EMI_的诊断与抑制的几点建议…

查看全部问答>

pe导出函数问题

大家好:     根据导出函数表找到了addressofrunction的数组地址,并且根据addressofnameordinal和addressofname找到了相应的索引,但是有句代码我看不太懂,就是:                 ...…

查看全部问答>

如何 用单片机做USB 接口的 显示器?

主机是8051单片机,要求使用USB 连接一个显示器 显示器可以是LED 也可以是液晶的! 请问一下 现在有没有这样的技术? 有做过的指导一下!…

查看全部问答>

基于GMS段信服务的 设备监控,如何做?

基于GMS段信服务的 设备监控,如何做? 假如我现在 有几台交换机,将它们连成一串,那怎么去监控它们连通状态呢? 给点思路吧…

查看全部问答>

为什么我WINCE6。0 做 OSDesign时候没有 Emulator 啊?

我安装了: 1.vs2005 + vs2005sp1           2.wince 6.0 + pb sp1           3.device emulator 2.0           4.virtual machine connection 在 ...…

查看全部问答>

lm3s8962使用之UART篇

intmain(void){    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |                   SYSCTL_XTAL_8MHZ);&nb ...…

查看全部问答>

st7build

我连接一个C程序,出现错误:----------- Project modebox - ST7 Cosmic - Configuration Debug -------------Compiling interrupt_vector.c...cxst7 +modm +debug -pxp&nb ...…

查看全部问答>

请教一个问题

一个数组,比如 int iii[200]。缺省情况下,是分配到.data段还是.bss段。一个数组算不算initiated? 谢谢!…

查看全部问答>

关于单片机设计小游戏的问题

单片机设计的推箱子程序和Proteus仿真都弄好了。就是游戏界面太丑。。能帮我美观一下么。。谢谢啦。…

查看全部问答>

求各位前辈 空间电压矢量画法 急急急

各位前辈 这个空间电压矢量是怎么画出来的啊 看不懂啊   知道了开关状态怎么画 两相的电压矢量怎么画啊…

查看全部问答>