结构体位定义—操作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里。

 

posted @ 2023-03-13 11:25  WCH_CH32  阅读(374)  评论(0)    收藏  举报