stm32f103 gpio快捷使用

电赛期间临时由K60转换到stm32,感觉32的io口使用起来非常的麻烦,(可能K60贵包含这个原因)最近总结了一下gpio的使用,感觉32的库非常接近底层,就是在配置寄存器;话不多说,直接上代码吧。PS:写得匆忙,验证了GPIOA和GPIOC,如果有问题以后再更新。对了,这个库不支持io口的重映射,笔者用的stm32f103c8t6;
#include "gpio_tyx.h"
#include "stm32f10x_gpio.h"
//初始化函数
void gpio_init(PTXn_e ptxn,GPIO_CFG cfg,GPIO_RAW raw)
{ 
  u32 port;//记录属于哪个模块
  GPIO_InitTypeDef  GPIO_InitStructure;
 switch(ptxn/32)
 {
  case PTA :port=RCC_APB2Periph_GPIOA;break;
  case PTB :port=RCC_APB2Periph_GPIOB;break;
  case PTC :port=RCC_APB2Periph_GPIOC;break;
  case PTD :port=RCC_APB2Periph_GPIOD;break;
  case PTE :port=RCC_APB2Periph_GPIOE;break;
  case PTF :port=RCC_APB2Periph_GPIOF;break;
  case PTG :port=RCC_APB2Periph_GPIOG;break;
 }
 RCC_APB2PeriphClockCmd(port, ENABLE);  //使能端口时钟,这个时钟非常的奇怪,放case里面不清楚为什么运行不了
 GPIO_InitStructure.GPIO_Pin = 1<<(ptxn%32);
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 if(cfg==GPO)
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
 else if(raw==0)
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
 else 
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; 
 switch(port)
 {
  case RCC_APB2Periph_GPIOA:GPIO_Init(GPIOA, &GPIO_InitStructure);break;
  case RCC_APB2Periph_GPIOB:GPIO_Init(GPIOB, &GPIO_InitStructure);break;
  case RCC_APB2Periph_GPIOC:GPIO_Init(GPIOC, &GPIO_InitStructure);break;
  case RCC_APB2Periph_GPIOD:GPIO_Init(GPIOD, &GPIO_InitStructure);break;
  case RCC_APB2Periph_GPIOE:GPIO_Init(GPIOE, &GPIO_InitStructure);break;
  case RCC_APB2Periph_GPIOF:GPIO_Init(GPIOF, &GPIO_InitStructure);break;
  case RCC_APB2Periph_GPIOG:GPIO_Init(GPIOG, &GPIO_InitStructure);break;
 } 
}
//设置GPO输出电平
void gpio_set(PTXn_e ptxn,GPIO_RAW data)
{ 
 if(data==1)
 {
  switch(ptxn/32)//得到GPIO模块
  {
   case PTA:
    GPIO_SetBits(GPIOA,1<<(ptxn%32));
   break;
   case PTB:
    GPIO_SetBits(GPIOB,1<<(ptxn%32));
   break;
   case PTC:
    GPIO_SetBits(GPIOC,1<<(ptxn%32));
   break;
   case PTD:
    GPIO_SetBits(GPIOD,1<<(ptxn%32));
   break;
   case PTE:
    GPIO_SetBits(GPIOE,1<<(ptxn%32));
   break;
   case PTF:
    GPIO_SetBits(GPIOF,1<<(ptxn%32));
   break;
   case PTG:
    GPIO_SetBits(GPIOG,1<<(ptxn%32));
   break;
   default:break;
  }
 }
 else
 {
  switch(ptxn/32)//得到GPIO模块
  {
   case PTA:
    GPIO_ResetBits(GPIOA,1<<(ptxn%32));
   break;
   case PTB:
    GPIO_ResetBits(GPIOB,1<<(ptxn%32));
   break;
   case PTC:
    GPIO_ResetBits(GPIOC,1<<(ptxn%32));
   break;
   case PTD:
    GPIO_ResetBits(GPIOD,1<<(ptxn%32));
   break;
   case PTE:
    GPIO_ResetBits(GPIOE,1<<(ptxn%32));
   break;
   case PTF:
    GPIO_ResetBits(GPIOF,1<<(ptxn%32));
   break;
   case PTG:
    GPIO_ResetBits(GPIOG,1<<(ptxn%32));
   break;
   default:break;
  }
 }
}
//读取GPI电平
u8 gpio_get(PTXn_e ptxn)
{
 switch(ptxn/32)//得到GPIO模块
  {case PTA:
    return GPIO_ReadInputDataBit(GPIOA,1<<(ptxn%32));
   break;
   case PTB:
    return GPIO_ReadInputDataBit(GPIOB,1<<(ptxn%32));
   break;
   case PTC:
    return GPIO_ReadInputDataBit(GPIOC,1<<(ptxn%32));
   break;
   case PTD:
    return GPIO_ReadInputDataBit(GPIOD,1<<(ptxn%32));
   break;
   case PTE:
    return GPIO_ReadInputDataBit(GPIOE,1<<(ptxn%32));
   break;
   case PTF:
    return GPIO_ReadInputDataBit(GPIOF,1<<(ptxn%32));
   break;
   case PTG:
    return GPIO_ReadInputDataBit(GPIOG,1<<(ptxn%32));
   break;
   default:break;
  }
}

下面是h文件

#ifndef _GPIO_H_
#define _GPIO_H_
#include "stm32f10x.h"
typedef enum
{//0~31
    PTA0,  PTA1,  PTA2,  PTA3,  PTA4,  PTA5,  PTA6,  PTA7,  PTA8,  PTA9,  PTA10, PTA11, PTA12, PTA13, PTA14, PTA15,
    PTA16, PTA17, PTA18, PTA19, PTA20, PTA21, PTA22, PTA23, PTA24, PTA25, PTA26, PTA27, PTA28, PTA29, PTA30, PTA31,//32~63
    PTB0,  PTB1,  PTB2,  PTB3,  PTB4,  PTB5,  PTB6,  PTB7,  PTB8,  PTB9,  PTB10, PTB11, PTB12, PTB13, PTB14, PTB15,
    PTB16, PTB17, PTB18, PTB19, PTB20, PTB21, PTB22, PTB23, PTB24, PTB25, PTB26, PTB27, PTB28, PTB29, PTB30, PTB31,
    PTC0,  PTC1,  PTC2,  PTC3,  PTC4,  PTC5,  PTC6,  PTC7,  PTC8,  PTC9,  PTC10, PTC11, PTC12, PTC13, PTC14, PTC15,
    PTC16, PTC17, PTC18, PTC19, PTC20, PTC21, PTC22, PTC23, PTC24, PTC25, PTC26, PTC27, PTC28, PTC29, PTC30, PTC31,

    PTD0,  PTD1,  PTD2,  PTD3,  PTD4,  PTD5,  PTD6,  PTD7,  PTD8,  PTD9,  PTD10, PTD11, PTD12, PTD13, PTD14, PTD15,
    PTD16, PTD17, PTD18, PTD19, PTD20, PTD21, PTD22, PTD23, PTD24, PTD25, PTD26, PTD27, PTD28, PTD29, PTD30, PTD31,
 PTE0,  PTE1,  PTE2,  PTE3,  PTE4,  PTE5,  PTE6,  PTE7,  PTE8,  PTE9,  PTE10, PTE11, PTE12, PTE13, PTE14, PTE15,
    PTE16, PTE17, PTE18, PTE19, PTE20, PTE21, PTE22, PTE23, PTE24, PTE25, PTE26, PTE27, PTE28, PTE29, PTE30, PTE31,
} PTXn_e;
typedef enum
{
    GPI         = 0,                                //定义管脚输入
    GPO         = 1,                              //定义管脚输出
} GPIO_CFG;
typedef enum
{
    LOW         = 0,//  下拉输入,或默认输出高电平                               //
    HIGH        = 1,//  上拉输入,或默认输出低电平                   //
  FLOAT       =2,//浮空输入
  AIN         =3,//模拟输入
} GPIO_RAW;//初始电平
typedef enum
{
 PTA,
 PTB,
 PTC,
 PTD,
 PTE,
 PTF,
 PTG,
} GPIO_P;
void gpio_init(PTXn_e ptxn,GPIO_CFG cfg,GPIO_RAW raw);
void gpio_set(PTXn_e ptxn,GPIO_RAW raw);
u8 gpio_get(PTXn_e ptxn);
#endif
//

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值