官方的SDK里面操作GPIOA和GPIOB的接口都是分开的两套API,比如IO置1分为GPIOA_SetBits和GPIOB_SetBits。操作起来比较麻烦。其实只需要重新宏定义一下就能合并成一套,做成类似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 - 触发类型 * * @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)
调用示例:
GPIO_ModeCfg(PA, GPIO_Pin_5, GPIO_ModeOut_PP_5mA);
GPIO_SetBits(PA, GPIO_Pin_5);
热门产品 :
CH32L103: 32位PDUSB低功耗单片机