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)
 | ||
| 
 | ||
| 
 | 
