Files
checker_gen1/source/interface/if_gpioin.c
2023-06-26 18:07:08 +08:00

119 lines
2.1 KiB
C

#include "board.h"
#include "stm32f4xx.h"
// PB6,7,8,9
// 输入脚
#define GPIO_Initer() {.GPIO_Mode=GPIO_Mode_IN,\
.GPIO_Speed=GPIO_Speed_100MHz,\
.GPIO_OType=GPIO_OType_PP,\
.GPIO_PuPd=GPIO_PuPd_UP \
}
typedef struct{
const char *name;
void (*gpio_clock_fun)(uint32_t,FunctionalState);
uint32_t gpio_rcc;
GPIO_TypeDef *gpio_base;
uint16_t gpio_pin;
volatile uint32_t *bitmap_pin;
}gpioin_dtb;
static const gpioin_dtb g_dtb[]={
{
.name="gpioin1",
.gpio_clock_fun=RCC_AHB1PeriphClockCmd,
.gpio_rcc=RCC_AHB1Periph_GPIOB,
.gpio_base=GPIOB,
.gpio_pin=6,
.bitmap_pin=&PININ(B,6),
},
{
.name="gpioin2",
.gpio_clock_fun=RCC_AHB1PeriphClockCmd,
.gpio_rcc=RCC_AHB1Periph_GPIOB,
.gpio_base=GPIOB,
.gpio_pin=7,
.bitmap_pin=&PININ(B,7),
},
{
.name="gpioin3",
.gpio_clock_fun=RCC_AHB1PeriphClockCmd,
.gpio_rcc=RCC_AHB1Periph_GPIOB,
.gpio_base=GPIOB,
.gpio_pin=8,
.bitmap_pin=&PININ(B,8),
},
{
.name="gpioin4",
.gpio_clock_fun=RCC_AHB1PeriphClockCmd,
.gpio_rcc=RCC_AHB1Periph_GPIOB,
.gpio_base=GPIOB,
.gpio_pin=9,
.bitmap_pin=&PININ(B,9),
},
};
typedef struct{
const gpioin_dtb *dtb;
}self_data;
static self_data g_self[LENGTH(g_dtb)];
def_find_fun(gpioin_dtb,g_dtb)
static int init(gpioin_def *g)
{
param_check(g);
if(g->private_data) return 0;
GPIO_InitTypeDef init=GPIO_Initer();
int index;
const gpioin_dtb *dtb=find(g->name,&index);
self_data *self=&g_self[index];
self->dtb=dtb;
g->private_data=self;
dtb->gpio_clock_fun(dtb->gpio_rcc,ENABLE);
init.GPIO_Pin = 1<<dtb->gpio_pin;
GPIO_Init(dtb->gpio_base, &init);
return 0;
}
static int deinit(gpioin_def *g)
{
return 0;
}
static int state(gpioin_def *g)
{
param_check(g);
param_check(g->private_data);
self_data *self=g->private_data;
return *self->dtb->bitmap_pin;
}
gpioin_init_export(gpioin1,init,deinit,state,0)
gpioin_init_export(gpioin2,init,deinit,state,0)
gpioin_init_export(gpioin3,init,deinit,state,0)
gpioin_init_export(gpioin4,init,deinit,state,0)