分享一個(gè)自己寫的GPIO操作庫

沁恒的GPIO分A和B口,不管是初始化還是讀寫都要調(diào)用A口和B口的對應(yīng)函數(shù),如果調(diào)整一個(gè)io從A口到B口,要把程序中所有的相關(guān)函數(shù)由A口改成B口,容易錯(cuò)和漏,我自己寫了個(gè)庫,將IO封裝成結(jié)構(gòu)體,如下:


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)?//寫函數(shù)
{
????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)?//讀函數(shù)
{
????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口沒關(guān)系了,只需要在定義的時(shí)候更改一次就可以了

定義IO的時(shí)候如下:

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);
}

寫函數(shù)

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

讀函數(shù)

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


感謝。怎么熱心分享的人都沒人留言支持一下。勿以善小而不為


代碼雖然簡單,但是很實(shí)用。


感謝!和樓主說一聲拿走了



我比較喜歡用使用宏定義替換(下面為偽代碼,僅參考)
#define?NSS_PIN_H?GPIOA_SetBits(PIN_XX)
#define?NSS_PIN_L?GPIOA_ResetBits(PIN_XX)
#define?CLK_PIN_H?GPIOB->ODR?|=?(1?<<?12)
#define?CLK_PIN_L?GPIOB->ODR?&=?~(1?<<?12)
宏可以用庫也可以用寄存器,比較方便優(yōu)化

對,宏定義才是正道。

某些人不用說什么“勿以善小而不為”,樓主的分享精神很好,但這確實(shí)會(huì)誤導(dǎo)新人,響應(yīng)不熱烈才是“善”。


程序最重要的是易讀性和易維護(hù)性,這樣寫雖多一點(diǎn)點(diǎn)軟件開銷,但易讀性和易維護(hù)性會(huì)大大提升,


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频