理论知识
GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式
引脚电平:0V~3.3V,部分引脚可容忍5V(带FT的可以容忍5V,但是输出均为3.3V)
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
单片机32位,只有16位用于端口
上方输入,下方输出。上拉电阻:保证引脚默认高电平输入模式 下拉电阻:保证引脚默认低电平输入模式
肖特基(施密特触发器)用于对输入电压整形,因为实际信号总存在失真
施密特触发器前面是模拟输入(整形前),后面是数字输入(整形后)
推挽输出:STM32对端口有绝对控制权
开漏模式:P-MOS不工作,有高阻态和低电平。还可以通过接5V电源提升输出电压
关闭模式:由外部控制
除了模拟输入会关闭输入功能,其他情况输入均有效
LED和蜂鸣器
LED:长脚正极
推挽输出模式下高低电平均有较好的驱动能力,两种连接均可
若高电平驱动能力弱,不能用第二种方法
三级管开启需要发射极和基极之间有一定的电压,注意三级管的位置
LED灯闪烁
注意端口一定要设置成推挽输出模式,开漏模式只有低电平有驱动能力
#include "stm32f10x.h" // Device header
#include "Delay.h"//需要引用延时函数
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启时钟,填入两个参数
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体作为GPIO_Init的参数
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//使用推挽输出,两次查询,Ctrl+F
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//一样查找,注意这里第一次查找选member,这里我们用的是0引脚要选0
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出速度50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure);//把这个初始化结构体的!地址!放在Init参数上
GPIO_ResetBits(GPIOA, GPIO_Pin_0);//置0函数,将0口归0
GPIO_SetBits(GPIOA,GPIO_Pin_0);//置1函数,将0口置1
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//最后一个参数可以是Bit_SET置1,Bit_RESET置0
while(1)
{
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//SetBits和ResetBits也可以实现这样的功能
Delay_ms(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
Delay_ms(500);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
Delay_ms(500);
GPIO_SetBits(GPIOA,GPIO_Pin_0);
Delay_ms(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);//使用强制类型转换转换为指定的结构体
Delay_ms(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
Delay_ms(500);
}
}
LED流水灯
初始化多个端口:
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//根据定义,这实际上是00000001|00000010等,一下子初始化若干个端口
#include "stm32f10x.h" // Device header
#include "Delay.h"//需要引用延时函数
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启时钟,第一个参数也可以按位或
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体作为GPIO_Init的参数
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//使用推挽输出,两次查询,Ctrl+F
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//初始化所有端口FFFF
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出速度50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure);//把这个初始化结构体的!地址!放在Init参数上
while(1)
{
GPIO_Write(GPIOA,~0x0001);//一次实现多个端口,取反(00000000000000001)、
Delay_ms(500);
GPIO_Write(GPIOA,~0x0002);//一次实现多个端口,取反(00000000000000001)、
Delay_ms(500);
GPIO_Write(GPIOA,~0x0004);//一次实现多个端口,取反(00000000000000001)、
Delay_ms(500);
GPIO_Write(GPIOA,~0x0008);//一次实现多个端口,取反(00000000000000001)、
Delay_ms(500);
GPIO_Write(GPIOA,~0x0010);//一次实现多个端口,取反(00000000000000001)、
Delay_ms(500);
GPIO_Write(GPIOA,~0x0020);//一次实现多个端口,取反(00000000000000001)、
Delay_ms(500);
GPIO_Write(GPIOA,~0x0040);//一次实现多个端口,取反(00000000000000001)、
Delay_ms(500);
GPIO_Write(GPIOA,~0x0080);//一次实现多个端口,取反(00000000000000001)、
Delay_ms(500);
}
}
蜂鸣器
#include "stm32f10x.h" // Device header
#include "Delay.h"//需要引用延时函数
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启时钟,注意这次换成了B口
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体作为GPIO_Init的参数
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//使用推挽输出,两次查询,Ctrl+F
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;//初始化端口12
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出速度50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);//把这个初始化结构体的!地址!这个地方也要改成B
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_12);
Delay_ms(500);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
Delay_ms(500);
}
}