此次是一个系列,只要我在学就会不断更新关于32其他功能笔记。
有时间的朋友可以尝试自己写,自己的笔记自己用的顺手。
没有时间自己写的朋友也可以收藏我的看看。
学习心得:我在学习STM32过程中发现整个体系十分庞大,不做笔记很容易前面学后面忘,基本上第一遍可以懂也记得,但是学到后面忘记越多,看说明书回忆又太麻烦,别人的笔记get不到自己的点。认真学32,哪怕听的很明白,一遍也是远远不够的。
STM32F1xx官方资料:《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO )
芯片数据手册。
GPIO
作用:负责采集外部器件的信息或者控制外部器件工作,即输入输出
GPIO基本结构
端口电路
更正:此图TTL肖特基触发器是错误的,按照英文手册上面应该是 施密特触发器 (Schmitt trigger)
施密特触发器在本电路中的作用是脉冲波的整形
施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波波形。
数字系统中,矩形脉冲在传输中经常发生波形畸变,出现上升沿和下降沿不理想的情况,可用施密特触发器整形后,获得较理想的矩形脉冲。(使数字信号变标准)
GPIO输入模式
浮空输入(数字量)(GPIO_Mode_IN_FLOATING)
特征:可读取引脚电平,若引脚悬空,则电平不确定
上拉输入(数字量)(GPIO_Mode_IPU)
特征:可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
下拉输入(数字量)(GPIO_Mode_IPD)
特征:可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
这两个开关,开上闭下是上拉、开下闭上是下拉,闭上闭下是浮空。
模拟输入(模拟量)(GPIO_Mode_AIN)
特征:GPIO无效,引脚直接接入内部ADC
- 输出缓冲器被禁止;
- 禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为’0’;
- 弱上拉和下拉电阻被禁止;
- 读取输入数据寄存器时数值为’0’
GPIO输出模式
推挽输出(数字量)(GPIO_Mode_Out_OD)
特征:可输出引脚电平,高电平接VDD,低电平接VSS
开漏输出(数字量)(GPIO_Mode_Out_OD)
特征:可输出引脚电平,高电平为高阻态,低电平接VSS
MOS开关电路,当PMOS导通时候就是推挽输出,PMOS导通输出高电平、NMOS导通输出低电平
当PMOS不导通时候是开漏输出,PMOS关闭,就只能通过NMOS输出低电平或者选择不输出。
当不输出时,在VDD处直接接5V电源(上图VDD),便可实现5V输出(而非3.3V输出)。
推挽复用功能(数字量)(GPIO_Mode_AF_PP)
特征:由片上外设控制,高电平为高阻态,低电平接VSS
开漏复用功能(数字量)(GPIO_Mode_AF_OD)
特征:由片上外设控制,高电平接VDD,低电平接VSS
//开启时钟操作
void XXX_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//选择开启GPIOA的时钟
GPIO_InitTypeDef GPIO_InitStructure;
//定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//配置输入输出模式,八种模式选择
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
//选择端口,可以同时初始化一个或者多个。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO速度,赋值为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
//将赋值后的构体变量传递给GPIO_Init函数
//函数内部会自动根据结构体的参数配置相应寄存器
//实现GPIOA的初始化
}
GPIO复用功能
复用即重新映射I/O功能,将端口的权柄交个片上设备控制。
- 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部 驱动。(注意: 也可以通过软件来模拟复用功能输入引脚,这种模拟可以通过对GPIO控制器编程来实现。此时,端口应当被设置为复用功能输出模式。显然,这时相应的引脚不再由外部驱动,而是通过GPIO控制器由软件来驱动。)
- 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
- 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被 配置成浮空输入模式。
GPIO外部中断
所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
GPIO锁定机制
注意
- 但是当你配置输入模式时候是不能有额外输出的
- 当你配置输出模式时候是可以同时输入滴(出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器)
- 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
- 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。
推荐以及参考博文GPIO输入输出讲解的十分细致、
关于HAL库使用GPIO口,可以看一下这篇 HAL库使用GPIO