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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版