You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

273 lines
5.9 KiB

4 months ago
#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<<GPIO_GP56_MODE_REG7_POS)
#define GPIO_GP56_MODE_REG7_OD (0<<GPIO_GP56_MODE_REG7_POS)
#define GPIO_GP56_MODE_REG7_PP (1<<GPIO_GP56_MODE_REG7_POS)
#define GPIO_GP56_MODE_OD (0<<GPIO_GP56_MODE_REG7_POS)
#define GPIO_GP56_MODE_PP (1<<GPIO_GP56_MODE_REG7_POS) // open drain
#define GPIO_AF_P0_FODOV (0x01ul << 14)
#define GPIO_AF_P0_BUCKCP (0x01ul << 12)
#define GPIO_AF_P0_VINUV (0x01ul << 11)
#define GPIO_AF_P0_VINOV (0x01ul << 10)
#define GPIO_AF_P0_VREGOC (0x01ul << 9)
#define GPIO_AF_P0_OT (0x01ul << 8)
#define GPIO_AF_P1_MISO (0x01ul << 15)
#define GPIO_AF_P1_FODB (0x01ul << 7)
#define GPIO_AF_P1_FODA (0x01ul << 6)
#define GPIO_AF_P1_CLKDET (0x01ul << 5)
#define GPIO_AF_P1_UARTRX (0x01ul << 4)
#define GPIO_AF_P1_ASKBIOUT (0x01ul << 3)
#define GPIO_AF_P1_ASKBVOUT (0x01ul << 2)
#define GPIO_AF_P1_ASKAIOUT (0x01ul << 1)
#define GPIO_AF_P1_ASKAVOUT (0x01ul << 0)
typedef
enum drv_gpio_group_e
{
GPIO_GRP0 = 0, // group gpio0
GPIO_GRP1, // group gpio1
GPIO_GRP_MAX
} drv_gpio_group_e;
typedef
enum drv_gpio_pin_e
{
GPIO_PIN0 = 0,
GPIO_PIN1,
GPIO_PIN2,
GPIO_PIN3,
GPIO_PIN4,
GPIO_PIN5,
GPIO_PIN6,
GPIO_PIN7,
GPIO_PIN8,
GPIO_PIN9,
GPIO_PIN10,
GPIO_PIN11,
GPIO_PIN12,
GPIO_PIN13,
GPIO_PIN14,
GPIO_PIN15,
GPIO_PIN_MAX,
} drv_gpio_pin_e;
/*
* @brief get specificated gp pin input value
* @param pin number to be get
* @retval pin value
*/
__forceinline uint8_t drv_gpio_read(drv_gpio_pin_e pin)
{
return (uint8_t)((CMSDK_GPIO0->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