电赛期间临时由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
//