你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

IAR里面的头文件求助

[复制链接]
...路上... 提问时间:2017-12-8 08:50 /
如题,用的是STM8S003F3,里面的io_macros.h有这么段代码,不知道什么意思,请大家解答下。
  1. /*---------------------------------------------
  2. * Define NAME as an I/O reg with bit access
  3. * Access of 8 bit reg:  NAME
  4. * Access of bit(s):     NAME_bit.noXX
  5. *--------------------------------------------*/
  6. #define __IO_REG8_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT)       \
  7.                       __near __no_init volatile ATTRIBUTE union   \
  8.                         {                                         \
  9.                           unsigned char NAME;                     \
  10.                           BIT_STRUCT NAME ## _bit;                \
  11.                         } @ ADDRESS;
复制代码


收藏 评论3 发布时间:2017-12-8 08:50

举报

3个回答
随风飘扬 回答时间:2017-12-8 11:12:16
NAME应该是一个寄存器的名字,
ADDRESS应该是该寄存器的地址,
ATTRIBUTE不知道,没用过STM8S
BIT_STRUCT应该是已经定义好的一个结构体,大致形式如下
typedef struct
{
    uint8_t no0:1;
        uint8_t no1:1;
        ...
        uint8_t no7:1;
}BIT_STRUCT;

如果想按位访问一个8位寄存器,则首先调用该宏定义,该宏定义会定义一个联合体
union
{
        uint8_t name;
        BIT_STRUCT name_bit;
}

调用之后,就可以按位访问了。例如我也访问GPIOA中的位,加上GPIOA寄存器地址为0x1122,
首先调用__IO_REG8_BIT(GPIOA, 0x1122, ATTRIBUTE, BIT_STRUCT)
之后我想访问第1个IO口,则GPIOA_bit.no1 = 1
...路上... 回答时间:2017-12-8 15:13:47
yu0405jie 发表于 2017-12-8 11:12
NAME应该是一个寄存器的名字,
ADDRESS应该是该寄存器的地址,
ATTRIBUTE不知道,没用过STM8S

那我如果对NAME赋值是不是就相当于对BIT_STRUCT里面的全部成员赋值了,在BIT_STRUCT都是8个成员的情况下
随风飘扬 回答时间:2017-12-8 17:00:40
...路上... 发表于 2017-12-8 15:13
那我如果对NAME赋值是不是就相当于对BIT_STRUCT里面的全部成员赋值了,在BIT_STRUCT都是8个成员的情况下 ...

是的,没有错,你对一个寄存器整体赋值,也就等于对寄存器中每一位进行了赋值

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版