2.1GPIO库函数介绍
1个初始化函数:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
/*
作用:初始化一个或者多个IO口(同一组)的工作方式和速度。该函数主要操作CPIO_CRL(CRH)寄存器,在上拉或者下拉的时候有设置BSRR或者BRR寄存器。
GPIOx:CPIOA~CPIOG
typedef struct
{
uint16_t GPIO_Pin; /*指定要初始化的IO口 */
GPIOSpeed_TypeDef GPIO_Speed; /*设置IO口输出速度*/
GPIOMode_TypeDef GPIO_Mode; /*设置工作模式:8种中的一种*/
}GPIO_InitTypeDef;
*/
2个读取输入电平函数:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/*
作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器
例如:GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平
*/
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
/*
作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器
GPIO_ReadInputData(GPIOA)//读取CPIOA组中所有IO口的输入电平
*/
2个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/*
作用:读取某个GPIO的输出电平。实际操作的是GPIOx_ODR寄存器
例如:GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输出电平
*/
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
/*
作用:读取某组GPIO的输出电平。实际操作的是GPIOx_ODR寄存器
例如:GPIO_ReadOutputData(GPIOA)//读取CPIOA组中所有IO口的输出电平
*/
4个设置输出电平函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/*
作用:设置某个IO口的输出为高电平(1)。实际操作BSRR寄存器
*/
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/*
作用:设置某个IO口的输出为低电平(0)。实际操作BRR寄存器
*/
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
/*
设置IO口输出电平,不常用。
*/
2.2跑马灯实验程序编写
2.2.1硬件连接
由原理图可知LED0一端与PE5端口连接,LED1一端与PB5端口连接,且LED0与LED1另一端共用3.3V的VCC。
2.2.2需调用的库函数
RCC_APB2PeriphColckCmd();//使能IO口时钟。不同的IO组,调用的时钟使能函数不一样
GPIO_Init();//初始化IO口模式
GPIO_SetBits();//操作IO口,输出高电平
GPIO_ResetBits();//操作IO口,输出低电平
2.2.3实验原码
led.h文件
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5
void LED_Init(void);//初始化
#endif
led.c文件
#include "led.h"
//初始化PB5和PE5为输出口.并使能这两个口的时钟
//LED IO初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高
}
main.c文件
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
LED0=0;
LED1=1;
delay_ms(300); //延时300ms
LED0=1;
LED1=0;
delay_ms(300); //延时300ms
}
}
2.3蜂鸣器实验程序编写
2.3.1硬件连接
由原理图可知三极管S8050通过放大基极电流控制蜂鸣器,而三极管的基极与PB8端口连接。
2.3.2需调用的库函数
RCC_APB2PeriphColckCmd();//使能IO口时钟。不同的IO组,调用的时钟使能函数不一样
BEEP_Init();//初始化IO口模式
GPIO_SetBits();//操作IO口,输出高电平
GPIO_ResetBits();//操作IO口,输出低电平
2.3.3实验原码
beep.h文件
#ifndef __BEEP_H
#define __BEEP_H
#include "sys.h"
//蜂鸣器端口定义
#define BEEP PBout(8) // BEEP,蜂鸣器接口
void BEEP_Init(void); //初始化
#endif
beep.c文件
#include "beep.h"
//初始化PB8为输出口.并使能这个口的时钟
//蜂鸣器初始化
void BEEP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //BEEP-->PB.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据参数初始化GPIOB.8
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//输出0,关闭蜂鸣器输出
}
main.c文件
#include "sys.h"
#include "delay.h"
#include "beep.h"
int main(void)
{
delay_init(); //延时函数初始化
BEEP_Init(); //初始化蜂鸣器端口
while(1)
{
BEEP=0;
delay_ms(300);//延时300ms
BEEP=1;
delay_ms(300);//延时300ms
}
}
2.3按键输入实验程序编写
2.3.1硬件连接
由原理图可知KEY0、KEY1和KEY2一端共地,其另一端与PE2、PE3、PE4端口相连,那么在设置IO口模式时应将端口的电压上拉,而KEY_UP与之相反,应将电压下拉。
2.3.2需调用的库函数
RCC_APB2PeriphColckCmd();//使能IO口时钟。不同的IO组,调用的时钟使能函数不一样
BEEP_Init();//初始化IO口模式
GPIO_ReadInputDataBit();//读取端口输入电平
2.3.3实验原码
key.h文件
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1
#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//读取按键2
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP)
#define KEY0_PRES 1 //KEY0按下
#define KEY1_PRES 2 //KEY1按下
#define KEY2_PRES 3 //KEY2按下
#define WKUP_PRES 4 //KEY_UP按下(即WK_UP/KEY_UP)
void KEY_Init(void);//IO初始化
u8 KEY_Scan(u8); //按键扫描函数
#endif
key.c文件
#include "led.h"
//初始化PB5和PE5为输出口.并使能这两个口的时钟
//LED IO初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高
}
main.c文件
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "beep.h"
int main(void)
{
vu8 key=0;
delay_init(); //延时函数初始化
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
BEEP_Init(); //初始化蜂鸣器端口
LED0=0; //先点亮红灯
while(1)
{
key=KEY_Scan(0); //得到键值
if(key)
{
switch(key)
{
case WKUP_PRES: //控制蜂鸣器
BEEP=!BEEP;
break;
case KEY2_PRES: //控制LED0翻转
LED0=!LED0;
break;
case KEY1_PRES: //控制LED1翻转
LED1=!LED1;
break;
case KEY0_PRES: //同时控制LED0,LED1翻转
LED0=!LED0;
LED1=!LED1;
break;
}
}else delay_ms(10);
}
}