嵌入式学习-硬件基础-Day02
GPIO
基本概念
实际应用
施密特触发器
工作模式
浮空输入
上拉输入
下拉输入
模拟输入
推挽输出
开漏输出
点亮一盏灯(输出)
任务分析
灯如何才能亮?
板子上的灯是如何连接的
板子上的灯如何点亮
寄存器详细讲解
使能时钟寄存器(RCC_AHB2ENR1)
基地址表
模式寄存器
输出类型寄存器
输出速度寄存器
输出数据寄存器
编程实现
寄存器分析(PC13)
使用MX创建工程
代码编写
方法二:将PC13设置为输出模式
任务:点亮LD1
配置MX
库函数分析
闪灯实验
方法1
方法2
光电开关实验(输入)
光电开关(任务分析)
MX配置
代码编写
按键控制灯(输入+输出)
MX配置
按键消抖
延时消抖(既然抖动,那就给他时间抖够了再判断)
抬手检测(忽略抖动过程,只做抬手的判断)
GPIO
基本概念
参考手册第13章节
GPIO(General-purpose I/Os)通用输入输出接口
GPIO是一种在嵌入式系统中广泛使用的接口,它允许系统与外部设备进行交互。GPIO引脚可以配置为输入或输出模式,以读取或控制外部设备的状态。
输入模式:GPIO作为输入时,可以接收来自传感器、开关或其他外部设备的信号。这些信号被传递给嵌入式系统的处理器,以便系统可以根据这些信号做出相应的决策或执行特定的操作。
输出模式:GPIO作为输出时,可以向外部设备发送数字信号。例如,控制LED的亮灭、驱动电机运转等。通过改变输出信号的状态,嵌入式系统可以与外部设备进行交互。
实际应用
input 输入 - 数据采集 如:采集传感器数据、电平状态
output 输出 - 设备控制 如:控制灯、控制数码管
U575的IO框图
保护二极管:(1)电压过大,有保护作用;(2)反向电动势。
上拉电阻:上拉电阻是一种用于数字电路中的电阻元件,它的作用是将信号线拉高到高电平(逻辑1)状态。当信号线不被其他元件拉低时,上拉电阻会将信号线连接到正电源,使其保持在高电平状态。
施密特触发器:电压的比较器
复用功能输入:其他功能,不是GPIO的功能
输出控制器:使用反相器
施密特触发器
施密特触发器可以将一个模拟信号波形整型为数字电路能处理的方波波形。(整形)
施密特触发器和一般比较器不同的点在于,它可以有两个参考电压,分别是正向阈值电压和反向阈值电压。
- 输入电压 > 正向阈值电压(0.7*VDD),输出高电平;
- 输入电压 < 负向阈值电压(0.3*VDD),输出低电平;
- 负向阈值电压 < 输入电压 < 正向阈值电压,输出不变。
经过处理后可以得到0101的信息,将该信息存入输入数据寄存器,就可以使用CPU进行读出。
问:模拟信号和数字信号的区别?
1、时间连续性不同:
1)模拟信号时间上是连续的;
2)数字信号时间上不是连续的。
2、幅度变化不同:
1)模拟信号指幅度的取值是连续的(幅值可由无限个数值表示)。
2)数字信号指幅度的取值是离散的,幅值表示被限制在有限个数值之内。
3、信号传输方式不同:
1)模拟信号是用模拟量的电压或电流来表示的电视信号;
2)数字信号是通过0和1的数字串所构成的数字流来传输的。
4、保密性不同:
1)模拟信号的微波通信和有线明线通信,很容易被窃听。只要收到模拟信号,就容易得到通信内容。
2)数字信号保密性较强,语音信号可以先进行加密处理,再进行传输,在接收端解密后再变换还原成模拟信号。
问:VDD、VSS、VCC分别表示什么意思?
VCC:接入电路的电压
VDD:元器件内部的工作电压
VSS:公共接地端电压
工作模式
浮空输入
IO端口 - 施密特触发器 - 输入数据寄存器 - 读
通俗讲就是让管脚什么都不接,悬空着。
此时VDD和VSS所在路径的两个开关同时断开。因为没有上拉和下拉,所以当IO口没有接输入的时候,此时的电平状态会是一个不确定的值,完全由外部输入决定。
由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的,易受干扰。
优势:
这一种输入模式的电平会完全取决于外部电路而与内部电路无关。
缺点:
在没有外部电路接入的时候,IO脚浮空会使得电平不确定
应用:
该模式是STM32复位之后的默认模式,一般用作对开关按键的读取或用于标准的通讯协议,比如IIC、USART的等。
上拉输入
IO端口 - 上拉电阻 - 施密特触发器 - 输入数据寄存器 - 读
输入的电平不会因上下浮动而导致输入信号不稳定,当外部没有信号输入时,上拉电阻会将输入信号钳在高电平,此时引脚始终读到高电平信号。
下拉输入
IO端口 - 下拉电阻 - 施密特触发器 - 输入数据寄存器 - 读
输入的电平不会因上下浮动而导致输入信号不稳定,当外部没有信号输入时,下拉电阻会将输入信号钳在低电平,此时引脚始终读到低电平信号。
模拟输入
IO端口 - 片上外设模块(电信号---模拟信号)
信号进入后不经过上拉电阻或者下拉电阻,关闭施密特触发器,经由另一线路把电压信号传送到片上外设模块。 所以可以理解为模拟输入的信号是未经处理的信号,是原汁原味的信号。
应用:当 GPIO 引脚用于 ADC 采集电压的输入通道时,则需要选择“模拟输入”功能,因为经过施密特触发器后信号只有 0、1 两种状态,所以 ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。
推挽输出
推挽 开漏 高阻 这都是谁想出来的词??_哔哩哔哩_bilibili
输出数据寄存器'0'——>输出控制‘1’——>NMOS激活 (低电平)
输出数据寄存器'1'——>输出控制‘0’——>PMOS激活 (高电平)
输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
具备输出高低电平的能力。
推挽输出就是可以需要利用两个不同的MOS管来实现输出。
推挽输出模式下(P-MOS管+N-MOS管),通过设置位设置/清除寄存器或者输出数据寄存器的值,途经P-MOS管和N-MOS管,最终输出到I/O端口。
开漏输出
开漏输出:PMOS不使用
输出寄存器上的的’0’激活 N-MOS,输出寄存器上的’1’将端口置于高阻状态 (P-MOS 从不被激活 )。
无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动。
可以利用改变上拉电源的电压来适应所需,进而提高外部电路的驱动能力。
MOS管的漏极等于啥也没接,处于一个开路状态,所以这个模式称之为开漏模式。
优势1:
虽然我们可以看到开漏输出是没有办法在内部输出一个高电平,但是这一个看似是缺点。其实实际上是一种优点。当给一个低电平的时候,MOS管没有导通,此时电压不确定导致无法输出高电平,但是一旦我们在外部增加一个上拉,那么这一个缺点就会被有效避免。并且,因为是我们自己设计一个上拉,这个上拉的电压是由我们自己确定,这样我们就可以根据外部电路需要多少V的高电平来给这一个上拉的电压,可以更好的适应更多情况。如下图,我们可以给定任意的VDD电压,来适应我们实际所需要的情况。
优势2:
开漏输出的实质其实就是一个OD门(OD:漏极输出(Open Drain))。而在数电中,OD门有一个非常重要的特性就是可以实现线与的功能,简单来说,就是在像IIC这样的总线协议中,只要有一个给低电平,那么总线都会被拉低。
开漏和推挽的区别
点亮一盏灯(输出)
思路:
- 先找到灯(看丝印)
- 确定在哪个原理图
- 到原理图追(网络标号)
- 最终追到单片机引脚
任务分析
灯如何才能亮?
板子上的灯是如何连接的
注意:必须掌握查看原理图的技巧
器件在哪就看哪个原理图,然后通过网络标号追,追到芯片引脚。(因为是芯片引脚控制等)
查看原理图
原理图
原理图(Schematic Diagram),也称为电路图或电气图,是一种图形表示方法,用于展示电子系统或电路的工作原理和组成部分之间的连接方式。它通常包括各种符号来代表电子元件以及连线来表示它们之间的电气连接。
三极管
三极管,全称半导体三极管,也称为双极型晶体管(BJT, Bipolar Junction Transistor),是一种控制电流的半导体器件。它的主要功能是把微弱的信号放大成幅度值较大的电信号,也可用作无触点开关。
结构
三极管由三个区域的半导体材料构成:
●发射极(Emitter):负责发射载流子。
●基极(Base):位于发射极和集电极之间,厚度非常薄。
●集电极(Collector):负责收集载流子。
根据材料排列的不同,三极管可以分为两种类型:
●NPN型:发射极和集电极由N型半导体构成,基极由P型半导体构成。
●PNP型:发射极和集电极由P型半导体构成,基极由N型半导体构成。
工作原理
三极管的工作原理基于电流放大。当发射结正偏时,发射区的多数载流子(NPN型为自由电子,PNP型为空穴)不断地越过发射结进入基区,形成发射极电流。电子或空穴进入基区后,会在基区中向集电结扩散,并最终被集电结的电场拉入集电区形成集电极电流。同时,也会有一小部分载流子与基区的少数载流子复合。扩散的载流子与复合载流子的比例决定了三极管的放大能力。
应用
●放大作用:三极管可以将微弱的电信号放大。
●开关作用:通过控制基极电流来控制集电极和发射极之间的导通或截止状态。
电路基础
板子上的灯如何点亮
经过查看原理图发现,与三极管基级相连的单片机引脚为PC13,当PC13处于高电平状态时,灯会被点亮,之后就要我们学习下如何让PC13变为高电平了
- P: 表示这是一个GPIO端口。
- C: 指的是端口号,比如A、B、C等。不同的端口可能有不同数量的引脚。
- 13: 这是端口C中的第13个引脚(从0开始计数,因此这是第14个实际的引脚)
LED灯分别接在LED1、LED2、LED3、PWR_ON引脚上。
通过一个NPN型三极管对LED灯进行控制,以LD1为例,三极管分为基极,集电极与发射极,其相当于一个简易的开关。
当集电极,也就是LED1引脚为低电平时,基极与发射极相当于断路,LD1无法导通点亮。
当集电极,即LED1引脚为高电平时,基极与发射极导通,LD1点亮。
寄存器详细讲解
配置功能的时候,需要开启相应的时钟
使能时钟寄存器(RCC_AHB2ENR1)
需要先确定相应功能在哪一条总线上
找到RCC的配置寄存器,将时钟进行使能
偏移地址:偏移地址就是计算机里的内存分段后,在段内某一地址相对于段首地址(段地址)的偏移量。所以需要找到基地址
基地址表
同理,如果需要使用GPIO功能则需要找到GPIO的相应基地址
模式寄存器
输出类型寄存器
输出速度寄存器
输出数据寄存器
编程实现
思路:
想要器件(外设)工作,必须启用时钟(RCC)
确定GPIO在哪个总线(时钟)
目标:让PC13引脚输出低电平
寄存器分析(PC13)
本质:往相对应的地址里写值进行配置功能
- 使能GPIOC的时钟 地址:0x56020c8c 值:位2为1
- 配置PC13的工作模式 地址:0x52020800 值:位26位1,位27为0
- 配置PC13的输出类型 地址:0x52020804 值:位13为0
- 配置PC13的输出数据 地址:0x52020814 值:位13为1
使用MX创建工程
代码编写
- 使能GPIOC的时钟 地址:0x56020c8c 将位2置位1
- 配置PC13的工作模式 地址:0x52020800 将位26置位1,27置位0
- 配置PC13的输出类型 地址:0x52020804 将位13置位0
- 配置PC13的输出数据 地址:0x52020814 将位13置位1
*(unsigned int*)0x56020C8C|=1<<2;//rcc 使能*(unsigned int*)0x52020800|=1<<26;*(unsigned int*)0x52020800&=~(1<<27);//PC13为输出功能*(unsigned int*)0x52020804&=~(1<<13);*(unsigned int*)0x52020808|=3<<26;*(unsigned int*)0x52020814|=1<<13;//PC13输出1
使用内部已经封装好的结构体
方法二:将PC13设置为输出模式
设置为输出(因为点灯)
任务:点亮LD1
思路:
- 先找到灯(看丝印)
- 确定在哪个原理图(扩展版)
- 到原理图追(网络标号)
- 最终追到单片机引脚
配置MX
库函数分析
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
功能: 设置或清除指定的端口位
参数:GPIO_TypeDef *GPIOx 端口号
uint16_t GPIO_Pin 引脚号
GPIO_PinState PinState 电平状态
GPIO_PIN_SET 1
GPIO_PIN_RESET 0
返回值:无
void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
功能: 切换指定的引脚电平状态
参数:GPIO_TypeDef * GPIOx 端口号
uint16_t GPIO_Pin 引脚号
返回值:无
GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
功能: 读取指定的引脚电平状态
参数:GPIO_TypeDef * GPIOx 端口号
uint16_t GPIO_Pin 引脚号
返回值:GPIO_PinState 电平状态
GPIO_PIN_RESET 0
GPIO_PIN_SET 1
HAL_Delay()单位毫秒
闪灯实验
方法1
方法2
光电开关实验(输入)
光电开关(任务分析)
1、查看实物(找丝印)
查看原理图(扩展版)
PE15——PB2
此部分就是光电开关,当没有物体遮挡时,该点为低电平。
无遮挡时,LED灯点·亮
有遮挡时,LED灯熄灭。
MX配置
启用调试/烧录引脚
代码编写
注意进入工程第一件事一定是先编译
在调试中可以看到变量的值(注意:变量要在全局定义)
按键控制灯(输入+输出)
按下KE1控制LD1的状态
灯是由PC4控制:高电平亮
按键需要采集PC9的电压判断是否按下:按下是低电平
MX配置
将控制灯的引脚配置为输出
将检测按键的引脚设置为输入
实验要求:按下按键的时候切换灯的状态
注意:所有的机械元件都存在抖动问题
按键消抖
抖动原因:
任何的机械按键都会有抖动,而且人手按下抬起并不是一瞬间的,人抬手是需要反应时间的,所以会导致按下的高电平时间过长,导致多次误进if判断语句,所以会多次切换状态,导致误判。