#include "board.h" #include "stm32f10x.h" /* 输入通道对应关系 PC3|PC2|PC1|PC0|PB9|PB8|PB7|PB6|PB5|PC12 IN0|IN1|IN2|IN3|IN4|IN5|IN6|IN7|IN8|IN9 */ #define GPIO_Initer() {.GPIO_Speed=GPIO_Speed_50MHz,\ .GPIO_Mode=GPIO_Mode_IPU,\ } 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="gpioin0", .gpio_clock_fun=RCC_APB2PeriphClockCmd, .gpio_rcc=RCC_APB2Periph_GPIOC, .gpio_base=GPIOC, .gpio_pin=3, .bitmap_pin=&PININ(C,3), }, { .name="gpioin1", .gpio_clock_fun=RCC_APB2PeriphClockCmd, .gpio_rcc=RCC_APB2Periph_GPIOC, .gpio_base=GPIOC, .gpio_pin=2, .bitmap_pin=&PININ(C,2), }, { .name="gpioin2", .gpio_clock_fun=RCC_APB2PeriphClockCmd, .gpio_rcc=RCC_APB2Periph_GPIOC, .gpio_base=GPIOC, .gpio_pin=1, .bitmap_pin=&PININ(C,1), }, { .name="gpioin3", .gpio_clock_fun=RCC_APB2PeriphClockCmd, .gpio_rcc=RCC_APB2Periph_GPIOC, .gpio_base=GPIOC, .gpio_pin=0, .bitmap_pin=&PININ(C,0), }, { .name="gpioin4", .gpio_clock_fun=RCC_APB2PeriphClockCmd, .gpio_rcc=RCC_APB2Periph_GPIOB, .gpio_base=GPIOB, .gpio_pin=9, .bitmap_pin=&PININ(B,9), }, { .name="gpioin5", .gpio_clock_fun=RCC_APB2PeriphClockCmd, .gpio_rcc=RCC_APB2Periph_GPIOB, .gpio_base=GPIOB, .gpio_pin=8, .bitmap_pin=&PININ(B,8), }, { .name="gpioin6", .gpio_clock_fun=RCC_APB2PeriphClockCmd, .gpio_rcc=RCC_APB2Periph_GPIOB, .gpio_base=GPIOB, .gpio_pin=7, .bitmap_pin=&PININ(B,7), }, { .name="gpioin7", .gpio_clock_fun=RCC_APB2PeriphClockCmd, .gpio_rcc=RCC_APB2Periph_GPIOB, .gpio_base=GPIOB, .gpio_pin=6, .bitmap_pin=&PININ(B,6), }, { .name="gpioin8", .gpio_clock_fun=RCC_APB2PeriphClockCmd, .gpio_rcc=RCC_APB2Periph_GPIOB, .gpio_base=GPIOB, .gpio_pin=5, .bitmap_pin=&PININ(B,5), }, { .name="gpioin9", .gpio_clock_fun=RCC_APB2PeriphClockCmd, .gpio_rcc=RCC_APB2Periph_GPIOC, .gpio_base=GPIOC, .gpio_pin=12, .bitmap_pin=&PININ(C,12), }, }; 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<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; // 电路上0为导通,逻辑上1为真,这里反向 return !(*self->dtb->bitmap_pin); } gpioin_init_export(gpioin0,init,deinit,state,0) 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) gpioin_init_export(gpioin5,init,deinit,state,0) gpioin_init_export(gpioin6,init,deinit,state,0) gpioin_init_export(gpioin7,init,deinit,state,0) gpioin_init_export(gpioin8,init,deinit,state,0) gpioin_init_export(gpioin9,init,deinit,state,0)