官方的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);


icon_rar.gifch58x_gpio_def.rar