结构体位定义—操作GPIO
实现思路:使用结构体的位定义,再用指针赋值
代码:
typedef struct{
u32 bit0:1;
u32 bit1:1;
u32 bit2:1;
u32 bit3:1;
u32 bit4:1;
u32 bit5:1;
u32 bit6:1;
u32 bit7:1;
u32 bit8:1;
u32 bit9:1;
u32 bit10:1;
u32 bit11:1;
u32 bit12:1;
u32 bit13:1;
u32 bit14:1;
u32 bit15:1;
u32 bit16TO32:16;
}OUTDR;
OUTDR * PA=(OUTDR *)&GPIOA->OUTDR;
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure={0};
Delay_Init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while(1)
{
PA->bit1 =0;
Delay_Ms(1000);
PA->bit1 =1;
Delay_Ms(1000);
}
}
代码执行效率:
While1里的反汇编代码

位操作对应的汇编代码意思是:首先将OUTDR寄存器读到a5,a5进行与或操作,进行对应位的写1和清零操作,然后写回OUTDR寄存器。执行效率还可以。
其他用法:由于定义太多u8类型flag会浪费RAM,可以将它们打包一起放在一个u8里。
浙公网安备 33010602011771号