当前位置: 首页 > news >正文

GPIO(嵌入式学习)

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(ALTERNATE OPEN DRAIN)是复用开漏

AF_PP(ALTERNATE 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速度,赋值为50MHzGPIO_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);										//延时500msGPIO_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);										//延时500msGPIO_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);										//延时500msGPIO_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 0001Delay_ms(100);GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010Delay_ms(100);GPIO_Write(GPIOA, ~0x0004);	//0000 0000 0000 0100Delay_ms(100);GPIO_Write(GPIOA, ~0x0008);	//0000 0000 0000 1000Delay_ms(100);GPIO_Write(GPIOA, ~0x0010);	//0000 0000 0001 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0020);	//0000 0000 0010 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0040);	//0000 0000 0100 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0080);	//0000 0000 1000 0000Delay_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);}
}

 

 


http://www.mrgr.cn/news/92775.html

相关文章:

  • [密码学实战]Java实现国密(SM2)密钥协商详解:原理、代码与实践
  • FFmpeg-chapter3-读取视频流(原理篇)
  • 自然语言处理:词频-逆文档频率
  • 驱动开发系列40 - Linux 显卡驱动KMD代码分析(一) - 设备初始化过程
  • C++ 的编译和链接
  • 寒假刷题Day26
  • Spring Web MVC
  • RNN实现精神分裂症患者诊断(pytorch)
  • 2025年2月文章一览
  • FloodFill 算法(典型算法思想)—— OJ例题算法解析思路
  • Windows安装sql server2017
  • 深度学习的正则化深入探讨
  • 基于SSM实现的bbs论坛系统功能实现八
  • 数据集笔记:新加坡 一些交通的时间序列统计量
  • 聊聊Java的SPI机制
  • 高频面试题(含笔试高频算法整理)基本总结回顾3
  • 稀疏数组学习
  • 3 算法1-4 过河卒
  • 2025-03-01 学习记录--C/C++-PTA 7-35 有理数均值
  • 如何使用 Jenkins 实现 CI/CD 流水线:从零开始搭建自动化部署流程