如题,用的是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;
复制代码
|
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
那我如果对NAME赋值是不是就相当于对BIT_STRUCT里面的全部成员赋值了,在BIT_STRUCT都是8个成员的情况下
是的,没有错,你对一个寄存器整体赋值,也就等于对寄存器中每一位进行了赋值