1.优化GPIO驱动编写方式,降低资源占用。
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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 */
|
||||
};
|
||||
|
||||
|
||||
@@ -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")));
|
||||
|
||||
@@ -20,6 +20,10 @@ extern "C" {
|
||||
struct drv_gpio_data
|
||||
{
|
||||
GPIO_TypeDef *port;
|
||||
};
|
||||
|
||||
struct drv_gpio_pin_data
|
||||
{
|
||||
uint32_t pin;
|
||||
};
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#include "ch32v30x.h"
|
||||
|
||||
#define MR_USING_ADC1
|
||||
#define MR_USING_ADC2
|
||||
|
||||
|
||||
Reference in New Issue
Block a user