当前位置: 首页 > 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(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);
	}
}

相关文章:

  • 当AI重构认知:技术狂潮下的教育沉思录
  • 信息学奥赛一本通(C++版)
  • java容器 LIst、set、Map
  • html+js 轮播图
  • Seaborn知识总结
  • ESP32+Mixly-WiFi
  • 22-接雨水
  • Deepseek Api Function Calling解析(tools、tool_calls)Deepseek函数调用流程图、Python代码示例
  • 游戏引擎学习第131天
  • 23种设计模式之《备忘录模式(Memento)》在c#中的应用及理解
  • Qt显示一个hello world
  • linux服务器更新jar包脚本
  • 工程化与框架系列(12)--响应式框架原理
  • 2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析
  • 数据结构课程设计(java实现)---九宫格游戏,也称幻方
  • 热点创意大师智能体
  • 传奇3光通版手游行会战攻略:团队协作与战术布局详解
  • PS通道抠图
  • 推进断裂力学:深入研究工程模拟中的 UMM
  • 10.指针进阶
  • wordpress 需要zend/重庆seo网站收录优化
  • 腾讯风铃怎么建设网站/镇江网页设计
  • 怎么设计门户网站/做网站需要什么条件
  • 网站项目框架/东莞关键词排名推广
  • 自己电脑做网站iis/上海网站seo招聘
  • 如何注册网站主办者/百度账号登录入口网页版