一.GPIO8种输入输出模式
模拟输入(GPIO_Mode_AIN):将物理信号(例如:声音、光线等)转换成模拟数字,多用于ADC模数转换。
浮空输入(GPIO_Mode_IN_FLOATING):一般指输入端口没有固定的电平值。
下拉输入(GPIO_Mode_IPD):当输入端口没有输入高电平时,输入端口一直保持低电平。
上拉输入(GPIO_Mode_IPU):当输入端口没有输入低电平时,输入端口一直保持高电平
开漏输出(GPIO_Mode_Out_OD):输出端口可以输出低电平。
推挽输出(GPIO_Mode_Out_PP):输出端口可以输出高电平和低电平。
复用开漏输出(GPIO_Mode_AF_OD):一个引脚配置为开漏输出并且可以与多个功能(例如:外部中断,串行通信)复用。
复用推挽输出(GPIO_Mode_AF_PP):一个引脚配置为推挽输出并且可以与多个功能复用。
二.3种开关端口方法
GPIO_ResetBits(GPIOA,GPIO_Pin_0); //低电平(0) 开
GPIO_SetBits(GPIOA,GPIO_Pin_0); //高电平(1) 关
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET); //低电平(0) 开
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0); //低电平(0) 开
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET); //高电平(1) 关
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1); //高电平(1) 关
GPIO_Write(GPIOA,~0x0001);
. . .
GPIO_Write(GPIOA,~0x0008);//用于流水灯
三.代码实现
1.LED闪烁
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);//GPIOA选择APB2时钟
//初始化GPIO结构体变量
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;//输出模式选择推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//引脚接PA0端口
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz ;//速度选择50MHz
GPIO_Init(GPIOA ,&GPIO_InitStructure);
//开灯
// GPIO_ResetBits(GPIOA,GPIO_Pin_0);//端口输出低电平 0
//关灯
// GPIO_SetBits(GPIOA,GPIO_Pin_0);//端口输出高电平 1
//开灯
// GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//端口输出低电平 0
//关灯
// GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//端口输出高电平 1
while(1)
{
// 第一种LED闪烁
// GPIO_ResetBits(GPIOA,GPIO_Pin_0);//开灯
// Delay_ms(500);
// GPIO_SetBits(GPIOA,GPIO_Pin_0);//关灯
// Delay_ms(500);
// 第二种LED闪烁
// GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
// Delay_ms(500);
// GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
// Delay_ms(500);
// 第三种LED闪烁
// GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);
// Delay_ms(500);
// GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
// Delay_ms(500);
}
}
2.LED流水灯
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);//GPIOA选择APB2时钟
//初始化GPIO结构体变量
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;//输出模式选择推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//引脚接PA0 - PA7端口,用All将GPIOA的所有引脚打开
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz ;//速度选择50MHz
GPIO_Init(GPIOA ,&GPIO_InitStructure);
while(1)
{
//因为要输出低电平所以要按位取或“~”
//十六进制寄存器地址 二进制寄存器地址
GPIO_Write(GPIOA, ~0x0001);//0000 0000 0000 0001
Delay_ms (100);
GPIO_Write(GPIOA, ~0x0002);//0000 0000 0000 0010
Delay_ms (100);
GPIO_Write(GPIOA, ~0x0004);//0000 0000 0000 0100
Delay_ms (100);
GPIO_Write(GPIOA, ~0x0008);//0000 0000 0000 1000
Delay_ms (100);
GPIO_Write(GPIOA, ~0x0010);//0000 0000 0001 0000
Delay_ms (100);
GPIO_Write(GPIOA, ~0x0020);//0000 0000 0010 0000
Delay_ms (100);
GPIO_Write(GPIOA, ~0x0040);//0000 0000 0100 0000
Delay_ms (100);
GPIO_Write(GPIOA, ~0x0080);//0000 0000 1000 0000
Delay_ms (100);
}
}
3.蜂鸣器
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//APB2时钟选择GPIOB
//初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式选择推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//端口选择PB12
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度选择50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
while(1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12); //开启蜂鸣器 0
Delay_ms(500);
GPIO_SetBits(GPIOB, GPIO_Pin_12); //关闭蜂鸣器 1
Delay_ms(500);
GPIO_ResetBits(GPIOB, GPIO_Pin_12); //开启蜂鸣器 0
Delay_ms(500);
GPIO_SetBits(GPIOB, GPIO_Pin_12); //关闭蜂鸣器 1
Delay_ms(700);
}
}
读取输入输出寄存器
GPIO_ReadInputDataBit();//读取输入寄存器端口的值
GPIO_ReadInputData();//读取输入寄存器的值
GPIO_ReadOutputDataBit();//读取输出寄存器端口的值
GPIO_ReadOutputDataBit();//读取输出寄存器的值
4.按键控制LED
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
uint8_t Key_Num;
int main(void)
{
LED_Init();
Key_Init();
while(1)
{
Key_Num = Key_GetNum();
if(Key_Num == 1)
{
LED1_turn();
}
if(Key_Num == 2)
{
LED2_turn();
}
}
}
LED.c
#include "stm32f10x.h" // Device header
void LED_Init (void)
{
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO选择APB2时钟
//初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;//选择pin1/pin2端口
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz ;//速度50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure);
//默认关灯(高电平)
GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);
}
//设置LED1开灯函数
void LED1_ON(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
//设置LED1关灯函数
void LED1_OFF(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
//设置LED1反转函数
void LED1_turn(void)
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) == 0)//如果输出端口为低电压
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);//关灯
}
else//如果输出端口为高电压
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);//开灯
}
}
//设置LED2开灯函数
void LED2_ON(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
//设置LED12关灯函数
void LED2_OFF(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
//设置LED2反转函数
void LED2_turn(void)
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2) == 0)//如果输出端口为低电压
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);//关灯
}
else//如果输出端口为高电压
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);//开灯
}
}
LED.h
#ifndef _LED_H
#define _LED_H
void LED_Init (void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED1_turn(void);
void LED2_turn(void);
#endif
Key.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init(void)
{
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//GPIOB选择APB2时钟
//GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入模式默认为高电平
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;//端口选择pin1/pin11
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//定义Key_GetNum函数
uint8_t Key_GetNum(void)
{
uint8_t Key_Num = 0;//定义一个接受变量
//第一个输入端口
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)//如果输入端口输入低电平,按键按下
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0);//输入端口一直低电平,按键一直按
Delay_ms (20);
Key_Num = 1;
}
//第二个输入端口
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0)//如果输入端口输入低电平,按键按下
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0);//输入端口一直低电平,按键一直按
Delay_ms (20);
Key_Num = 2;
}
return Key_Num;
}
Key.h
#ifndef _Key_H
#define _Key_H
void Key_Init(void);
uint8_t Key_GetNum(void);
#endif
5.光敏电阻控制蜂鸣器
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"
int main(void)
{
Buzzer_Init();
LightSensor_Init ();
while(1)
{
if (LightSensor_Get () == 1)
{
Buzzer_ON();
}
else
{
Buzzer_OFF();
}
}
}
Buzzer.c
#include "stm32f10x.h" // Device header
void Buzzer_Init(void)
{
//开启时钟
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB, ENABLE);//GPIOB选择APB2时钟
//初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//开漏输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//选择pin12引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure );
//默认不响
GPIO_SetBits (GPIOB,GPIO_Pin_12);//设置高电平 1
}
//蜂鸣器响
void Buzzer_ON(void )
{
GPIO_ResetBits (GPIOB, GPIO_Pin_12);
}
//蜂鸣器不响
void Buzzer_OFF(void )
{
GPIO_SetBits (GPIOB, GPIO_Pin_12);
}
蜂鸣器反转
void Buzzer_Turn(void)
{
if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 0)//如果读取输出端口输出低电平
{
GPIO_SetBits(GPIOB, GPIO_Pin_12);//蜂鸣器不响
}
else //如果读取输出端口输出高电平
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);//蜂鸣器响
}
}
Buzzer.h
#ifndef _BUZZER_H
#define _BUZZER_H
void Buzzer_Init(void);
void Buzzer_ON(void );
void Buzzer_OFF(void );
void Buzzer_Turn(void);
#endif
LightSensor.c
#include "stm32f10x.h" // Device header
void LightSensor_Init(void)
{
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//GPIOB选择APB2时钟
//初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//选择pin13引脚
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//定义光敏传感器函数
uint8_t LightSensor_Get(void)
{
return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);//返回输入端口的值
}
LightSensor.h
#ifndef _LIGHT_SENSOR_H
#define _LIGHT_SENSOR_H
void LightSensor_Init(void);
uint8_t LightSensor_Get(void);
#endif