您的位置:首页 > 其它

GPIO-输入/输出配置

2016-07-20 17:10 429 查看
//输入端口定义

GPIO_TypeDef *  m_gpio_in[INPUT_NUM]  ={GPIOE,GPIOE,GPIOE,GPIOE,GPIOE};  

unsigned int    m_port_in[INPUT_NUM]  ={GPIO_Pin_2,GPIO_Pin_3,GPIO_Pin_4,GPIO_Pin_5,GPIO_Pin_6};

//输出端口定义

GPIO_TypeDef *  m_gpio_out[OUTPUT_NUM]={GPIOG,GPIOG,GPIOG,GPIOG,GPIOB,GPIOF,GPIOF};  

unsigned int    m_port_out[OUTPUT_NUM]={GPIO_Pin_6,GPIO_Pin_7,GPIO_Pin_9,GPIO_Pin_15,GPIO_Pin_6,GPIO_Pin_9,GPIO_Pin_10};

static unsigned char  m_status_out[OUTPUT_NUM];

static unsigned char  m_ist[INPUT_NUM];

static unsigned int   m_KeyDownTime[INPUT_NUM];

//*********************************************************************

//IO始化函数

//*********************************************************************

void Gpio_Init(void)

{

unsigned char i;

GPIO_InitTypeDef  GPIO_InitStructure;

    //输入配置

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);                         //使能GPIOE时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;   //PE2 3 4 5 6对应引脚

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                                  //普通输入模式

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                            //100M

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                                  //上拉

    GPIO_Init(GPIOE, &GPIO_InitStructure);                                        //初始化GPIOE2,3,4

    

    //输出配置     

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);                         //使能GPIOG时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_15;   //PG6 7 9 15

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                                 //普通输出模式

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                //推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                            //100MHz

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                                  //上拉

    GPIO_Init(GPIOG, &GPIO_InitStructure);                                        //初始化GPIO

    GPIO_SetBits(GPIOG,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_15);             //初始高输出

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);                         //使能GPIOB时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                                     //PB6

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                                 //普通输出模式

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                //推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                            //100MHz

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                                  //上拉

    GPIO_Init(GPIOB, &GPIO_InitStructure);                                        //初始化GPIO     

    GPIO_SetBits(GPIOB,GPIO_Pin_6);                                               //初始高输出

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);                         //使能GPIOD的时钟

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;                                  //输出

    GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;                                 //推挽输出

    GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;                               //上拉输出

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;                             //高速GPIO

    GPIO_Init(GPIOF,&GPIO_InitStructure);

    GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);                                  //GPIOF 高电平  

  

    for(i=0;i<INPUT_NUM;i++)  m_ist[i]=0;

    for(i=0;i<OUTPUT_NUM;i++) m_status_out[i]=0;



//*********************************************************************

//无滤波读输入 

//1-无按下,0-有低电平有效输入

//*********************************************************************

unsigned char Gpio_ReadIo(unsigned char port)

{

unsigned char val;

    val=GPIO_ReadInputDataBit(m_gpio_in[port],m_port_in[port]); 

    return val;

}

//*********************************************************************

//写输出 : 

//0-关闭 1-输出,低电平输出

//*********************************************************************

void Gpio_WriteOut(unsigned char port,unsigned char op)

{

    if(op==0) 

    {

        GPIO_SetBits(m_gpio_out[port],m_port_out[port]);        //引脚拉高,关闭输出

        m_status_out[op]=0;

    }
else

    {

        GPIO_ResetBits(m_gpio_out[port],m_port_out[port]);      //引脚拉低,打开输出,低电平输出有效

        m_status_out[op]=1;

    }

}

//*********************************************************************

//读输出

//*********************************************************************

unsigned char Gpio_ReadOut(unsigned char op)

{

    return(m_status_out[op]);

}

//*********************************************************************

//有消抖读输入(必须先执行消抖扫描函数)

//*********************************************************************

int Gpio_ReadIoFilter(unsigned char port)

{
if(port>=INPUT_NUM)return(INPUT_UP);
if(m_ist[port]>=2 && m_ist[port]<=4)return(INPUT_DOWN);
else return(INPUT_UP);

}

//*********************************************************************

//获取按钮按下时间

//*********************************************************************

unsigned int GetKeyDownTime(unsigned char port)

{

OS_ERR err;    
return(OSTimeGet(&err)-m_KeyDownTime[port]);

}

//*********************************************************************

//消抖扫描输入

//注意:获取状态判断只能读一次,然后再对结果进行多态判断如:

//key=Gpio_ScanInput(0) if(key==INPUT_UP ||key==INPUT_LONG_UP )

//*********************************************************************

#define KEY_DOWN_TIME 2000

int Gpio_ScanInput(unsigned char port) 

{

OS_ERR err;

static unsigned int uiInputDelay[INPUT_NUM];

static unsigned int down_time[INPUT_NUM];

    
if(port>=INPUT_NUM)return(0);
switch(m_ist[port])
{
case 0:

if(Gpio_ReadIo(port)==0)
{
uiInputDelay[port]=OSTimeGet(&err)+10;
m_ist[port]++;
}
break;

case 1:
if(OSTimeGet(&err)>=uiInputDelay[port])
{
if(Gpio_ReadIo(port)==0)m_ist[port]++;
else m_ist[port]=0;
}
break;
case 2:
down_time[port]=OSTimeGet(&err)+KEY_DOWN_TIME;
m_ist[port]++;
return(INPUT_DOWN);
case 3:
if(Gpio_ReadIo(port)!=0)
{
uiInputDelay[port]=OSTimeGet(&err)+10;
m_ist[port]++;
}
break;
case 4:
if(OSTimeGet(&err)>=uiInputDelay[port])
{
if(Gpio_ReadIo(port)!=0)m_ist[port]++;
else m_ist[port]--;
}
break;
case 5:
m_ist[port]=0;
if(OSTimeGet(&err)>=down_time[port])
{
return(INPUT_LONG_UP);
}
else
{
return(INPUT_UP);
}
default:
m_ist[port]=0;
break;
}
return(0);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: