#ifndef DRV_GPIO_H #define DRV_GPIO_H #include "cmsdk_cm0.h" #include "clkctrl_define.h" #include "stdbool.h" /*************************************************** * * * ***************** GPIO *********************** * * ****************************************************/ #define GPIO0_BASE (0x40010000) #define GPIO1_BASE (0x40011000) #define GPIO_MODE_IN 0 #define GPIO_MODE_OUT 1 #define GPIO_MODE_AF 2 #define GPIO_GP56_MODE_REG7_POS (29) #define GPIO_GP56_MODE_REG7_MASK (1<DATA >> pin) & 0x01ul); } /** * @brief enable gpio pins output. * @param group: GPIO0 or GPIO1 * @param pin: pin num * @retval null */ __forceinline void drv_gpio_enable_out(drv_gpio_pin_e pin) { CMSDK_GPIO0->OUTENABLESET |= (1 << pin); } /** * @brief disable gpio pin out enable * @param group: GPIO0 or GPIO1 * @param pin: pin num * @retval null */ __forceinline void drv_gpio_disable_out(drv_gpio_pin_e pin) { CMSDK_GPIO0->OUTENABLECLR = (1 << pin); } /* * @brief set gp pin value * @param group: GPIO group * @param pin: pin num * @param value: 0 for low, 1 for high * @retval null */ __forceinline void drv_gpio_write(drv_gpio_pin_e pin, uint8_t value) { if(value) { CMSDK_GPIO0->DATAOUT |= (1 << pin); } else { CMSDK_GPIO0->DATAOUT &= ~(1 << pin); } } ///* //* @brief set gp pin func //* @param //* @param //* @param value: //* @retval null //*/ //void drv_gpio_pin_func(uint8_t pin, uint8_t func) //{ // REG_CLKCTRL_PIN_MUL_SET->word |= (func << (pin << 1)); //} /** * @brief enable gpio pin interruptable * @param group: GPIO0 or GPIO1 * @param pin: pin num * @retval null */ __forceinline void drv_gpio_enable_int(drv_gpio_pin_e pin) { CMSDK_GPIO0->INTENSET = (1 << pin); } /** * @brief disable gpio pin interruptable * @param group: GPIO0 or GPIO1 * @param pin: pin num * @retval null */ __forceinline void drv_gpio_disable_int(drv_gpio_pin_e pin) { CMSDK_GPIO0->INTENCLR = (1 << pin); } /** * @brief set gpio pin rising edge trigger interrupt * @param group: GPIO0 or GPIO1 * @param pin: pin num * @retval null */ __forceinline void drv_gpio_set_risingedge_int(drv_gpio_pin_e pin) { CMSDK_GPIO0->INTTYPESET |= (1 << pin); CMSDK_GPIO0->INTPOLSET |= (1 << pin); } /** * @brief set gpio pin falling edge trigger interrupt * @param group: GPIO0 or GPIO1 * @param pin: pin num * @retval null */ __forceinline void drv_gpio_set_fallingedge_int(drv_gpio_pin_e pin) { CMSDK_GPIO0->INTTYPESET |= (1 << pin); CMSDK_GPIO0->INTPOLCLR |= (1 << pin); } /** * @brief set gpio pin high level trigger interrupt * @param group: GPIO0 or GPIO1 * @param pin: pin num * @retval null */ __forceinline void drv_gpio_set_highlevel_int(drv_gpio_pin_e pin) { CMSDK_GPIO0->INTTYPECLR |= (1 << pin); CMSDK_GPIO0->INTPOLSET |= (1 << pin); } /** * @brief set gpio pin low level trigger interrupt * @param group: GPIO0 or GPIO1 * @param pin: pin num * @retval null */ __forceinline void drv_gpio_set_lowlevel_int(drv_gpio_pin_e pin) { CMSDK_GPIO0->INTTYPECLR |= (1 << pin); CMSDK_GPIO0->INTPOLCLR |= (1 << pin); } /** * @brief clear gpio pin interrupt flag * @param group: GPIO0 or GPIO1 * @param pin: pin num * @retval interrupt status */ __forceinline uint32_t drv_gpio_clear_intflag(drv_gpio_pin_e pin) { CMSDK_GPIO0->INTCLEAR |= (1 << pin); return CMSDK_GPIO0->INTSTATUS; } __forceinline void drv_gpio_clear_group_intflag(drv_gpio_group_e group) { CMSDK_GPIO0->INTCLEAR |= CMSDK_GPIO0->INTSTATUS; } __forceinline uint32_t drv_gpio_get_intflag(void) { return CMSDK_GPIO0->INTSTATUS; } /** * @brief enable gpio pin alternate function * @param group: GPIO0 or GPIO1 * @param pin: pin num * @retval null */ __forceinline void drv_gpio_enable_altfunc(drv_gpio_pin_e pin) { CMSDK_GPIO0->ALTFUNCSET |= (1 << pin); } /** * @brief disable gpio pin alternate function * @param group: GPIO0 or GPIO1 * @param pin: pin num * @retval null */ __forceinline void drv_gpio_disable_altfunc(drv_gpio_pin_e pin) { CMSDK_GPIO0->ALTFUNCCLR |= (1 << pin); } #endif