Files
checker_slave/source/interface/if_gpioin.c

176 lines
3.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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<<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;
// 电路上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)