看逻辑图,GPIO分为输入驱动器和输出驱动器两部分,最右边是一个保护电路,用于抵御电压波动(3.3/5V)
一、输出驱动器
当我们使用HAL库的函数HAL_GPIO_WritePin设置寄存器,或片上外设进行复用功能输出,控制P-MOS管与N-MOS管开断
推挽输出
当两个MOS管都使用时,便是推挽输出,P‑MOS 激活 N‑MOS 断开就是接Vdd,输出高电平;P‑MOS 断开 N‑MOS 激活就是接地,输出低电平
优点:可以直接输出 3.3V 缺点:只能输出 3.3V
开漏输出:
当P-NOS管断开时,就是开漏输出,N‑MOS 断开,输出就由外部电路决定,当外接5V时就输出5V高电平(必须是5V容忍的IO口,一般是3.3V);当N‑MOS 激活,接地,输出低电平;
优点:配合外部电路 更加灵活 缺点:高电平实际是高阻态 无法输出电流
复用输出:
复用推挽输出、复用开漏输出,交由片上外设接管 MOS 管控制而不是单片机寄存器
二、输入驱动器
外部输入信号先经过引脚保护电路进入输入驱动器;可以选择开启芯片内部上拉电阻 / 下拉电阻。 信号分成两条通路:
模拟通路:信号直接作为模拟输入,给到 ADC 等模拟外设;
数字通路:信号经过肖特基触发器整形,转为标准数字电平,送给片上外设,同时存入IDR 输入寄存器,单片机可以通过HAL库的指令HAL_GPIO_ReadPin读取寄存器
根据信号通路选择、内部上下拉电阻开关状态,GPIO 输入分为 4 种模式:上拉输入,下拉输入,浮空输入(上下拉都不打开),模拟输入(不经过肖特基触发器)