...路上... 发表于 2017-12-8 08:50:34

IAR里面的头文件求助

如题,用的是STM8S003F3,里面的io_macros.h有这么段代码,不知道什么意思,请大家解答下。/*---------------------------------------------
* Define NAME as an I/O reg with bit access
* Access of 8 bit reg:NAME
* Access of bit(s):   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;

yu0405jie 发表于 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个成员的情况下

yu0405jie 发表于 2017-12-8 17:00:40

...路上... 发表于 2017-12-8 15:13
那我如果对NAME赋值是不是就相当于对BIT_STRUCT里面的全部成员赋值了,在BIT_STRUCT都是8个成员的情况下 ...

是的,没有错,你对一个寄存器整体赋值,也就等于对寄存器中每一位进行了赋值
页: [1]
查看完整版本: IAR里面的头文件求助