官方的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);
熱門產(chǎn)品 :
CH394: 以太網(wǎng)協(xié)議棧芯片