官方的SDK里面操作GPIOA和GPIOB的接口都是分開(kāi)的兩套API,比如IO置1分為GPIOA_SetBits和GPIOB_SetBits。操作起來(lái)比較麻煩。其實(shí)只需要重新宏定義一下就能合并成一套,做成類似STM32的接口:

#define?_GPIO_SetBits(GPIO,?pin)????????????(R32_##GPIO##_OUT?|=?pin)
#define?_GPIO_ResetBits(GPIO,?pin)??????????(R32_##GPIO##_CLR?|=?pin)
#define?_GPIO_InverseBits(GPIO,?pin)????????(R32_##GPIO##_OUT?^=?pin)
#define?_GPIO_ReadPortPin(GPIO,?pin)????????(R32_##GPIO##_PIN?&?(pin))
#define?GPIO_SetBits(GPIO,?pin)?????????????_GPIO_SetBits(GPIO,?pin)
#define?GPIO_ResetBits(GPIO,?pin)???????????_GPIO_ResetBits(GPIO,?pin)
#define?GPIO_InverseBits(GPIO,?pin)?????????_GPIO_InverseBits(GPIO,?pin)
#define?GPIO_ReadPortPin(GPIO,?pin)?????????_GPIO_ReadPortPin(GPIO,?pin)
/*********************************************************************
?*?@fn??????GPIO_ModeCfg
?*
?*?@brief???GPIO端口引腳模式配置
?*
?*?@param???pin?????-?PA0-PA15?PB0-PB15
?*?@param???mode????-?輸入輸出類型
?*
?*?@return??none
?*/
#define?_GPIO_ModeCfg(GPIO,?pin,?mode)???????\
????do?{?\
????????switch(mode)?\
????????{?\
????????????case?GPIO_ModeIN_Floating:?\
????????????????R32_##GPIO##_PD_DRV?&=?~pin;?\
????????????????R32_##GPIO##_PU?&=?~pin;?\
????????????????R32_##GPIO##_DIR?&=?~pin;?\
????????????????break;?\
????????????case?GPIO_ModeIN_PU:?\
????????????????R32_##GPIO##_PD_DRV?&=?~pin;?\
????????????????R32_##GPIO##_PU?|=?pin;?\
????????????????R32_##GPIO##_DIR?&=?~pin;?\
????????????????break;?\
????????????case?GPIO_ModeIN_PD:?\
????????????????R32_##GPIO##_PD_DRV?|=?pin;?\
????????????????R32_##GPIO##_PU?&=?~pin;?\
????????????????R32_##GPIO##_DIR?&=?~pin;?\
????????????????break;?\
????????????case?GPIO_ModeOut_PP_5mA:?\
????????????????R32_##GPIO##_PD_DRV?&=?~pin;?\
????????????????R32_##GPIO##_DIR?|=?pin;?\
????????????????break;?\
????????????case?GPIO_ModeOut_PP_20mA:?\
????????????????R32_##GPIO##_PD_DRV?|=?pin;?\
????????????????R32_##GPIO##_DIR?|=?pin;?\
????????????????break;?\
????????????default:?\
????????????????break;?\
????????}?\
????}?while?(0)
#define?GPIO_ModeCfg(GPIO,?pin,?mode)???_GPIO_ModeCfg(GPIO,?pin,?mode)
/*********************************************************************
?*?@fn??????GPIO_ITModeCfg
?*
?*?@brief???GPIO引腳中斷模式配置
?*
?*?@param???pin?????-?PA0-PA15、PB0-PB15
?*?@param???mode????-?觸發(fā)類型
?*
?*?@return??none
?*/
#define?_GPIO_ITModeCfg(GPIO,?pin,?mode)???????\
????do?{\
????????switch(mode)\
????????{\
????????????case?GPIO_ITMode_LowLevel:?\
????????????????R16_##GPIO##_INT_MODE?&=?~pin;\
????????????????R32_##GPIO##_CLR?|=?pin;\
????????????????break;\
????????????case?GPIO_ITMode_HighLevel:?\
????????????????R16_##GPIO##_INT_MODE?&=?~pin;\
????????????????R32_##GPIO##_OUT?|=?pin;\
????????????????break;\
????????????case?GPIO_ITMode_FallEdge:?\
????????????????R16_##GPIO##_INT_MODE?|=?pin;\
????????????????R32_##GPIO##_CLR?|=?pin;\
????????????????break;\
????????????case?GPIO_ITMode_RiseEdge:\
????????????????R16_##GPIO##_INT_MODE?|=?pin;\
????????????????R32_##GPIO##_OUT?|=?pin;\
????????????????break;\
????????????default:\
????????????????break;\
????????}\
????????R16_##GPIO##_INT_IF?=?pin;\
????????R16_##GPIO##_INT_EN?|=?pin;\
????}while?(0)
#define?GPIO_ITModeCfg(GPIO,?pin,?mode)?????_GPIO_ITModeCfg(GPIO,?pin,?mode)


調(diào)用示例:

GPIO_ModeCfg(PA, GPIO_Pin_5, GPIO_ModeOut_PP_5mA);

GPIO_SetBits(PA, GPIO_Pin_5);


icon_rar.gifch58x_gpio_def.rar