GPIO(嵌入式学习)
- 手机
- 2025-09-22 06:57:02

GPIO 通用输入输出口:
可分为八种输入输出模式
输出模式
下可控制端口输出高低电平,用以驱动LED,控制蜂鸣器,模拟通信协议输出时许
输入模式
读取高低电平或电压,用与读取按键输入,外界模块电平信号输入,adc电压采集,模拟通信协议接收数据等
GPIO基本结构
寄存器只负责存储数据,其中寄存器只有低16位的有端口,高16位没有端口
这是GPIO的位结构
上面是输入部分,下面是输出部分
输入部分: 两个保护二极管作用为对输入电压进行限幅
上拉电阻和下拉电阻:上面导通,下面断开,为上拉输入模式;下面导通,上面断开,下拉输入模式;两个断开,就是浮空的状态
施密特触发器输出信号:整形输入信号使其稳定,可有效避免因信号波动造成的输出抖动现象,经过施密特整形就可以直接输入数据寄存器(用程序读取输入数据寄存器对应的某一位数据,可知道端口的输入电平)
这里有两个片上外设,上面是接模拟量,接在施密特触发器前面,下面接数字量,接在施密特触发器后面。
输出部分
数字部分可由输出数据寄存器和片上外设两种控制,然后通过数据选择器接到了输出控制部分。
而最左侧的位设置/清除寄存器可以单独操作输出数据寄存器的某一位,不影响其他(方式:如果要对某一位进行置1,在未设置寄存器的对应位写1,对不需要操作的位写0,要操作的写一,内部就会有电路;如果相对某一位清0,就在位清除寄存器的对应位写1)
mos管:用来控制开关的导通和关闭(引脚为输入模式,两个mos管都无效,端口电平由外部信号控制),可选择推挽、开漏或关闭;输出寄存器为1时,上管导通,下面断开,输出接到vdd就是输出高电平,反之亦然。
P-mos无效,就是开漏输出,如果P-MOS和N-MOS都有效,就是推挽输出
对应上拉输入,下拉输入和浮空输入
其他模式有效
AIN(Analog IN)是模拟输入
IN_FLOATING是浮空输入
IPD(IN PULL DOWN)下拉输入
IPU(IN PULL UP)是上拉输入
OUT_OD(OUT OPEN DRAIN)是开漏输出
OUT_PP(OUT PUSH PULL)是推挽输出
AF_OD(ATL OPEN DRAIN)是复用开漏
AF_PP(ATL PUSH PULL)是复用推挽
GPIO初始化
int main(void) { /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 //使用各个外设前必须开启时钟,否则对外设的操作无效 /*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO引脚,赋值为第0号引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数 //函数内部会自动根据结构体的参数配置相应寄存器 //实现GPIOA的初始化这里led正极接的是电源vcc,负极gpio,所以是低电平导通,形成电流路径
reset低电平,set高电平
led闪烁的三种方式
while (1) { /*设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法*/ /*方法1:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平*/ GPIO_ResetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为低电平 Delay_ms(500); //延时500ms GPIO_SetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为高电平 Delay_ms(500); //延时500ms /*方法2:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定*/ GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); //将PA0引脚设置为低电平 Delay_ms(500); //延时500ms GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //将PA0引脚设置为高电平 Delay_ms(500); //延时500ms /*方法3:GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强转为BitAction类型*/ GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); //将PA0引脚设置为低电平 Delay_ms(500); //延时500ms GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1); //将PA0引脚设置为高电平 Delay_ms(500); //延时500ms } }推挽输出高低电平都有驱动能力,所以如果正极接电源,就是低电平驱动;如果长脚正极接PA0口,短角插到负极,led就是高电平点亮方式
因为开漏输出高电平不能驱动,所以只能才用低电平驱动方式,也就是长脚正极接电源正极,短脚负极接PA0口
如果需要实现流水灯,可以使用按位或的方式选中多个引脚,用GPIO_Write点亮对应的灯,因为是低电平驱动,所以取反。
int main(void) { 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_Speed = GPIO_Speed_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); } }蜂鸣器也同理,修改对应的gpio口就可以了
int main(void) { 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); while (1) { GPIO_ResetBits(GPIOB, GPIO_Pin_12); Delay_ms(100); GPIO_SetBits(GPIOB, GPIO_Pin_12); Delay_ms(100); GPIO_ResetBits(GPIOB, GPIO_Pin_12); Delay_ms(100); GPIO_SetBits(GPIOB, GPIO_Pin_12); Delay_ms(700); } }GPIO(嵌入式学习)由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“GPIO(嵌入式学习)”
上一篇
网络安全深度剖析