分享一个自己写的GPIO操作库

沁恒的GPIO分A和B口,不管是初始化还是读写都要调用A口和B口的对应函数,如果调整一个io从A口到B口,要把程序中所有的相关函数由A口改成B口,容易错和漏,我自己写了个库,将IO封装成结构体,如下:


typedef enum
{
    PORT_A=0,
    PORT_B,
}port_type;

typedef struct
{
    port_type port;
    uint32_t pin;
    uint8_t status;
}IO_type;

void IO_mode(IO_type _io,GPIOModeTypeDef mode) //其初始化
{
    if (_io.port==PORT_A) {
        GPIOA_ModeCfg( _io.pin, mode);
    }else{
        GPIOB_ModeCfg( _io.pin, mode);
    }
}
void IO_digital_write(IO_type _io,uint8_t value) //写函数
{
    if (_io.port==PORT_A) {
        if(value){
            GPIOA_SetBits(_io.pin);
            _io.status=1;
        }else{
            GPIOA_ResetBits(_io.pin);
            _io.status=0;
        }
    }else{
        if(value){
            GPIOB_SetBits(_io.pin);
            _io.status=1;
        }else{
            GPIOB_ResetBits(_io.pin);
            _io.status=0;
        }
    }
}
uint8_t IO_digital_read(IO_type _io) //读函数
{
    if (_io.port==PORT_A) {
        _io.status=GPIOA_ReadPortPin(_io.pin)?1:0;
    }else{
        _io.status=GPIOB_ReadPortPin(_io.pin)?1:0;
    }
    return _io.status;
}

这样定义后不管初始化还是读写端口都是A/B口没关系了,只需要在定义的时候更改一次就可以了

定义IO的时候如下:

IO_type IO_VAVLE_STEAM=  {PORT_B,GPIO_Pin_8,FALSE};
IO_type IO_VAVLE_BREW=  {PORT_B,GPIO_Pin_17,FALSE};
IO_type IO_BUMP=     {PORT_B,GPIO_Pin_6,FALSE};
IO_type IO_IMPULSE=    {PORT_B,GPIO_Pin_15,FALSE};
IO_type IO_BREW_SWITCH=  {PORT_B,GPIO_Pin_14,FALSE};
IO_type IO_LOW=      {PORT_B,GPIO_Pin_13,FALSE};
IO_type IO_HIGH=     {PORT_B,GPIO_Pin_12,FALSE};
IO_type IO_SSR=     {PORT_B,GPIO_Pin_9,FALSE};

初始化为这样的:

void GPIO_int()
{
    IO_mode(IO_VAVLE_STEAM,GPIO_ModeOut_PP_20mA);
    IO_mode(IO_VAVLE_BREW,GPIO_ModeOut_PP_20mA);
    IO_mode(IO_IMPULSE,GPIO_ModeOut_PP_20mA);
    IO_mode(IO_BREW_SWITCH,GPIO_ModeIN_Floating);
    IO_mode(IO_LOW,GPIO_ModeIN_Floating);
    IO_mode(IO_HIGH,GPIO_ModeIN_Floating);
}

写函数

    IO_digital_write(IO_VAVLE_STEAM, 0);
    IO_digital_write(IO_VAVLE_BREW, 0);
    IO_digital_write(IO_IMPULSE, 0);

读函数

    uint8_t low=IO_digital_read(IO_LOW);
    uint8_t high=IO_digital_read(IO_HIGH);


感谢。怎么热心分享的人都没人留言支持一下。勿以善小而不为


代码虽然简单,但是很实用。


只有登录才能回复,可以选择微信账号登录