沁恒的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);
热门产品 :
CH585: 集成高速USB和NFC的蓝牙MCU