1.优化GPIO驱动编写方式,降低资源占用。

This commit is contained in:
MacRsh
2023-11-17 01:34:50 +08:00
parent 488d2f5394
commit 16c9848e61
8 changed files with 64 additions and 176 deletions

View File

@@ -14,7 +14,7 @@
#error "Please define at least one ADC macro like MR_USING_ADC1. Otherwise undefine MR_USING_ADC."
#else
static enum drv_adc_index
enum drv_adc_index
{
#ifdef MR_USING_ADC1
DRV_INDEX_ADC1,

View File

@@ -17,9 +17,7 @@
static struct drv_dac_data dac_drv_data[] =
{
#ifdef MR_USING_DAC1
{
RCC_APB1Periph_DAC,
}
{RCC_APB1Periph_DAC}
#endif /* MR_USING_DAC1 */
};

View File

@@ -57,203 +57,85 @@ static int gpio_irq_mask[] =
static struct drv_gpio_data gpio_drv_data[] =
{
#ifdef MR_USING_GPIOA
{GPIOA, GPIO_Pin_0},
{GPIOA, GPIO_Pin_1},
{GPIOA, GPIO_Pin_2},
{GPIOA, GPIO_Pin_3},
{GPIOA, GPIO_Pin_4},
{GPIOA, GPIO_Pin_5},
{GPIOA, GPIO_Pin_6},
{GPIOA, GPIO_Pin_7},
{GPIOA, GPIO_Pin_8},
{GPIOA, GPIO_Pin_9},
{GPIOA, GPIO_Pin_10},
{GPIOA, GPIO_Pin_11},
{GPIOA, GPIO_Pin_12},
{GPIOA, GPIO_Pin_13},
{GPIOA, GPIO_Pin_14},
{GPIOA, GPIO_Pin_15},
{GPIOA},
#else
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL},
#endif /* MR_USING_GPIOA */
#ifdef MR_USING_GPIOB
{GPIOB, GPIO_Pin_0},
{GPIOB, GPIO_Pin_1},
{GPIOB, GPIO_Pin_2},
{GPIOB, GPIO_Pin_3},
{GPIOB, GPIO_Pin_4},
{GPIOB, GPIO_Pin_5},
{GPIOB, GPIO_Pin_6},
{GPIOB, GPIO_Pin_7},
{GPIOB, GPIO_Pin_8},
{GPIOB, GPIO_Pin_9},
{GPIOB, GPIO_Pin_10},
{GPIOB, GPIO_Pin_11},
{GPIOB, GPIO_Pin_12},
{GPIOB, GPIO_Pin_13},
{GPIOB, GPIO_Pin_14},
{GPIOB, GPIO_Pin_15},
{GPIOB},
#else
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL},
#endif /* MR_USING_GPIOB */
#ifdef MR_USING_GPIOC
{GPIOC, GPIO_Pin_0},
{GPIOC, GPIO_Pin_1},
{GPIOC, GPIO_Pin_2},
{GPIOC, GPIO_Pin_3},
{GPIOC, GPIO_Pin_4},
{GPIOC, GPIO_Pin_5},
{GPIOC, GPIO_Pin_6},
{GPIOC, GPIO_Pin_7},
{GPIOC, GPIO_Pin_8},
{GPIOC, GPIO_Pin_9},
{GPIOC, GPIO_Pin_10},
{GPIOC, GPIO_Pin_11},
{GPIOC, GPIO_Pin_12},
{GPIOC, GPIO_Pin_13},
{GPIOC, GPIO_Pin_14},
{GPIOC, GPIO_Pin_15},
{GPIOC},
#else
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL},
#endif /* MR_USING_GPIOC */
#ifdef MR_USING_GPIOD
{GPIOD, GPIO_Pin_0},
{GPIOD, GPIO_Pin_1},
{GPIOD, GPIO_Pin_2},
{GPIOD, GPIO_Pin_3},
{GPIOD, GPIO_Pin_4},
{GPIOD, GPIO_Pin_5},
{GPIOD, GPIO_Pin_6},
{GPIOD, GPIO_Pin_7},
{GPIOD, GPIO_Pin_8},
{GPIOD, GPIO_Pin_9},
{GPIOD, GPIO_Pin_10},
{GPIOD, GPIO_Pin_11},
{GPIOD, GPIO_Pin_12},
{GPIOD, GPIO_Pin_13},
{GPIOD, GPIO_Pin_14},
{GPIOD, GPIO_Pin_15},
{GPIOD},
#else
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL},
#endif /* MR_USING_GPIOD */
#ifdef MR_USING_GPIOE
{GPIOE, GPIO_Pin_0},
{GPIOE, GPIO_Pin_1},
{GPIOE, GPIO_Pin_2},
{GPIOE, GPIO_Pin_3},
{GPIOE, GPIO_Pin_4},
{GPIOE, GPIO_Pin_5},
{GPIOE, GPIO_Pin_6},
{GPIOE, GPIO_Pin_7},
{GPIOE, GPIO_Pin_8},
{GPIOE, GPIO_Pin_9},
{GPIOE, GPIO_Pin_10},
{GPIOE, GPIO_Pin_11},
{GPIOE, GPIO_Pin_12},
{GPIOE, GPIO_Pin_13},
{GPIOE, GPIO_Pin_14},
{GPIOE, GPIO_Pin_15},
{GPIOE},
#else
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL, 0},
{MR_NULL},
#endif /* MR_USING_GPIOE */
};
static struct drv_gpio_pin_data gpio_drv_pin_data[] =
{
{GPIO_Pin_0},
{GPIO_Pin_1},
{GPIO_Pin_2},
{GPIO_Pin_3},
{GPIO_Pin_4},
{GPIO_Pin_5},
{GPIO_Pin_6},
{GPIO_Pin_7},
{GPIO_Pin_8},
{GPIO_Pin_9},
{GPIO_Pin_10},
{GPIO_Pin_11},
{GPIO_Pin_12},
{GPIO_Pin_13},
{GPIO_Pin_14},
{GPIO_Pin_15},
};
static struct mr_gpio gpio_dev;
static struct drv_gpio_data *drv_gpio_get_data(int pin)
{
pin /= 16;
if ((pin >= mr_array_num(gpio_drv_data)) || (gpio_drv_data[pin].port == MR_NULL))
{
return NULL;
return MR_NULL;
}
return &gpio_drv_data[pin];
}
static struct drv_gpio_pin_data *drv_gpio_get_pin_data(int pin)
{
pin %= 16;
if (pin >= mr_array_num(gpio_drv_pin_data))
{
return MR_NULL;
}
return &gpio_drv_pin_data[pin];
}
static int drv_gpio_configure(struct mr_gpio *gpio, int pin, int mode)
{
struct drv_gpio_data *gpio_data = drv_gpio_get_data(pin);
struct drv_gpio_pin_data *gpio_pin_data = drv_gpio_get_pin_data(pin);
uint32_t exti_line = pin % 16;
GPIO_InitTypeDef GPIO_InitStructure = {0};
EXTI_InitTypeDef EXTI_InitStructure = {0};
NVIC_InitTypeDef NVIC_InitStructure = {0};
/* Check pin is valid */
if (gpio_data == MR_NULL)
if (gpio_data == MR_NULL || gpio_pin_data == MR_NULL)
{
return MR_EINVAL;
}
@@ -367,7 +249,7 @@ static int drv_gpio_configure(struct mr_gpio *gpio, int pin, int mode)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
EXTI_InitStructure.EXTI_Line = gpio_data->pin;
EXTI_InitStructure.EXTI_Line = gpio_drv_pin_data->pin;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
GPIO_EXTILineConfig(pin / 16, exti_line);
@@ -404,14 +286,14 @@ static int drv_gpio_configure(struct mr_gpio *gpio, int pin, int mode)
}
gpio_irq_mask[exti_line] = -1;
EXTI_InitStructure.EXTI_Line = gpio_data->pin;
EXTI_InitStructure.EXTI_Line = gpio_drv_pin_data->pin;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
GPIO_EXTILineConfig(pin / 16, exti_line);
EXTI_Init(&EXTI_InitStructure);
}
/* Configure GPIO */
GPIO_InitStructure.GPIO_Pin = gpio_data->pin;
GPIO_InitStructure.GPIO_Pin = gpio_drv_pin_data->pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(gpio_data->port, &GPIO_InitStructure);
return MR_EOK;
@@ -420,25 +302,27 @@ static int drv_gpio_configure(struct mr_gpio *gpio, int pin, int mode)
static int drv_gpio_read(struct mr_gpio *gpio, int pin)
{
struct drv_gpio_data *gpio_data = drv_gpio_get_data(pin);
struct drv_gpio_pin_data *gpio_pin_data = drv_gpio_get_pin_data(pin);
/* Check pin is valid */
if (gpio_data == NULL)
if (gpio_data == NULL || gpio_pin_data == NULL)
{
return 0;
}
return (int)GPIO_ReadInputDataBit(gpio_data->port, gpio_data->pin);
return (int)GPIO_ReadInputDataBit(gpio_data->port, gpio_drv_pin_data->pin);
}
static void drv_gpio_write(struct mr_gpio *gpio, int pin, int value)
{
struct drv_gpio_data *gpio_data = drv_gpio_get_data(pin);
struct drv_gpio_pin_data *gpio_pin_data = drv_gpio_get_pin_data(pin);
/* Check pin is valid */
if (gpio_data == NULL)
if (gpio_data == NULL || gpio_pin_data == NULL)
{
return;
}
GPIO_WriteBit(gpio_data->port, gpio_data->pin, value);
GPIO_WriteBit(gpio_data->port, gpio_drv_pin_data->pin, value);
}
void EXTI0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

View File

@@ -20,6 +20,10 @@ extern "C" {
struct drv_gpio_data
{
GPIO_TypeDef *port;
};
struct drv_gpio_pin_data
{
uint32_t pin;
};

View File

@@ -14,7 +14,7 @@
#error "Please define at least one I2C macro like MR_USING_I2C1. Otherwise undefine MR_USING_I2C."
#else
static enum drv_i2c_index
enum drv_i2c_index
{
#ifdef MR_USING_I2C1
DRV_INDEX_I2C1,

View File

@@ -14,7 +14,7 @@
#error "Please define at least one SPI macro like MR_USING_SPI1. Otherwise undefine MR_USING_SPI."
#else
static enum drv_spi_bus_index
enum drv_spi_bus_index
{
#ifdef MR_USING_SPI1
DRV_INDEX_SPI1,

View File

@@ -14,7 +14,7 @@
#error "Please define at least one UART macro like MR_USING_UART1. Otherwise undefine MR_USING_UART."
#else
static enum drv_uart_index
enum drv_uart_index
{
#ifdef MR_USING_UART1
DRV_INDEX_UART1,

View File

@@ -13,6 +13,8 @@
extern "C" {
#endif /* __cplusplus */
#include "ch32v30x.h"
#define MR_USING_ADC1
#define MR_USING_ADC2