176 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
 | 
						||
#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)
 | 
						||
 | 
						||
 |