GPIO综述
GPIO(Geneal Purpose Input Output) 通用输入输出口
可配置为8种输入输出模式
引脚电平:0-3.3V 部分引脚可容忍5V
输出模式-控制端口输出高低电平
输入模式-读取端口的高低电平
GPIO基本构造
寄存器是特殊的存储器,内核通过APB2总线对寄存器进行读写,完成输出和读取电平的功能。
寄存器是32位寄存器,低16位对应0-15号端口,高16位不使用。
寄存器引脚输出为1 端口为高电平
寄存器引脚输出为0 端口为低电平
驱动器的作用是增加驱动能力
GPIO的八种工作模式
1.浮空输入:一种数字输入,可读取引脚电平,若引脚悬空则电平不确定
2.上拉输入:一种数字输入,内部连接上拉电阻,引脚悬空默认为高电平
3.下拉输入:一种数字输入,内部连接下拉电阻,引脚悬空默认为低电平
4.模拟输入:一种模拟输入,GPIO无效,引脚直接链接内部ADC
5.开漏输出:一种数字输出,数据选择器选择输出数据寄存器控制输出,输出高电平为高阻态,低电平为零
6.推挽输出:一种数字输出,数据选择器选择输出数据寄存器控制输出,输出高电平为一,低电平为零
7.复用开漏输出:一种数字输出,数据选择器选择片上外设控制输出,输出高电平为高阻态,低电平为零
8复用推挽输出:一种数字输出,数据选择器选择片上外设控制输出,输出高电平为一,低电平为零
程序点亮一个LED
#include "stm32f10x.h" // Device header
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
//GPIO_SetBits(GPIOA, GPIO_Pin_0);
//GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); 向GPIOA0口写入低电平 点亮LED
//GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); 向GPIOA0口写入高电平 熄灭LED
while(1);
}
点亮一个蜂鸣器
#include "stm32f10x.h" // Device header
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
while(1);
}
点亮流水灯
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 |GPIO_Pin_2 |.....; 按位或的方法配置多个引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while(1)
{
for(int i = 0;i < 8;i++)
{
GPIO_Write(GPIOA, ~(0X0001 << i)); //1111 1111 1111 1110点亮第一个LED 循环右移依次点亮其他LED
Delay_ms(500);
}
}
}