标准库GPIO小记

现在感觉学标准库更有利于自己对单片机的理解,所以之后还是决定用标准库了(主要是学校智能车实验室也要求使用标准库)

这里用的单片机是STM32F407ZGT6

一.GPIO初始化

GPIO_InitTypeDef  GPIO_InitStructure;                            //定义一个结构体,初始化GPIO端口

1.使能时钟
需要用到哪边的GPIO就开哪边的使能时钟
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE)    //使能GPIOF时钟,修改第一个变量

2..配置引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_X;                        //配置引脚编号,开一个
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;               //开两个

3.设置输入输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                //普通输入模式,常用于按键
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                //普通输出模式,常用于LED

4.输出模式中设置是推挽还是开漏(常用推挽)
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;                //设置他处于推挽输出模式
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;                //设置他处于开漏输出模式
    
5.设置时钟速度
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;            //设置时钟速度为100M

6.设置上下拉电阻
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                //上拉
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;                //下拉
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NO;                //不设置上下拉
注:    输出模式中不需要设置,但是好像设置什么都一样

7.初始化GPIO,不同的使能时钟分开写
GPIO_Init(GPIOF, &GPIO_InitStructure);                        //初始化GPIO
GPIO_Init(GPIOA, &GPIO_InitStructure);                        //初始化GPIO

样例
1.LED配置(GPIO模式为输出)

LED是管子两端存在压降,才可以点亮,所以根据原理图,输出一个低电平他才会亮

void LED_Init(void)
{         
  GPIO_InitTypeDef  GPIO_InitStructure;

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

  //GPIOF9,F10初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口
  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(GPIOF, &GPIO_InitStructure);//初始化GPIO
    
 GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭

}


2.按键配置(GPIO模式为输入)

按键要求按下和不按下可以区分,根据原理图,按下的时候低电平(因为接了GND),所以没按下的时候一定要是高电平,于是便连接了一个上拉电阻(WK_UP和其他按键相反)

void KEY_Init(void)
{
    
  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE时钟
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //KEY0 KEY1 KEY2对应引脚
  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
    
     
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//WK_UP对应引脚PA0
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;//下拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA0
 
}

二.设置电平以及读取电平
 
样例:
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高电平

GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置低电平

GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)    //读这个引脚的电平

样例:

pinState = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);  
  
if (pinState == BIT_SET)

{  
    // 引脚GPIOA.5处于高电平  
    // 执行相应的操作  
}

else

{  
    // 引脚GPIOA.5处于低电平  
    // 执行相应的操作  
}
//这里BIT_SET 和BIT_RESET 已经定义过了,也可以用0,1来代替

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值