嵌入式-GPIO
本文最后更新于360天前,其中的信息可能已经有所发展或是发生改变。

GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。

I/O端口位的基本结构

被称为输出数据寄存器、位设置\清除寄存器、输入数据寄存器的内存单元是程序与硬件电路的连接桥梁,其按照每32位二进制0\1数据为一组,存储着芯片中特定电路的开关信息。通过程序对寄存器中的数据修改,来改变芯片中某功能的电路的开关,或者通过程序对寄存器数据进行读取。

施密特触发器:

TTL肖特基触发器(施密特触发器)就是为了防止在某一个临界电平的情况出现各种情况的抖动出现,为了稳定我们的输出而设计的。施密特触发器采用电位触发方式,其状态由输入信号电位维持;对于负向递减和正向递增两种不同变化方向的输入信号,施密特触发器有不同的阈值电压。

作用是稳定电平,应用于波形的整形和变换:整形时,将不好的矩形波变为较好的矩形波;波形转换时,将三角波、正弦波和其他波形转换为矩形波。由于外部输入的电压不稳定,并不能一直稳定在标准的3.3V或0V,所以简单的规定一个参考电压,高于参考值视为高电平,低于参考值的视为低电平。使用一个比较器 可以实现此效果。

用施密特触发器实现波形变换
用施密特触发器实现波形变换

如果输入电压中噪声较多,在参考电压中徘徊,会导致高低电平快速变化无法准确测量当前电平,所以对比较器改造,形成施密特触发器,产生两个参考电压。当输入电压高于高参考电压,则输出高电平;输入电压低于低参考电压,则输出低电平;在两者之间则维持原本的信号不变

用施密特触发器对脉冲整形
用施密特触发器对脉冲整形

GPIO种类

CH32V307VCT6提供了 5 组 GPIO 端口,共 80 个 GPIO 引脚。每个引脚都可以由软件配置成输出(推挽或开漏)、输入(带或不带上拉或下拉)或复用的外设功能端口。多数 GPIO 引脚都与数字或模拟的复用外设共用。除了具有模拟输入功能的端口,所有的 GPIO 引脚都有大电流通过能力。提供锁定机制冻结 IO 配置,
以避免意外的写入 I/O 寄存器。

CH32V307VCT6共有7组IO口,每组16个,共16×5=80个,分别为:
GPIOA——>PA0、PA1、PA2…PA15
GPIOB——>PB0、PB1、PB2…PB15
.
.
.
GPIOE——>PE0、PE1、PE2、…PE15

GPIO输入输出的8种模式

GPIO支持4种输入模式(浮空输入、上拉输入、下拉输入、模拟输入)和4种输出模式(开漏输出、推挽输出、开漏复用输出、推挽复用输出)。同时,GPIO还支持三种最大翻转速度(2MHz、10MHz、50MHz)。

每个I/O口可以自由编程,但I/O口寄存器必须按32位字被访问。

程序中标识
模式
GPIO_Mode_AIN模拟输入
GPIO_Mode_IN_FLOATING浮空输入
GPIO_Mode_IPD下拉输入
GPIO_Mode_IPU上拉输入
GPIO_Mode_Out_OD开漏输出
GPIO_Mode_Out_PP推挽输出
GPIO_Mode_AF_OD复用开漏输出
GPIO_Mode_AF_PP复用推挽输出

下面将具体介绍GPIO的这八种工作方式:

输出模式

上拉输入模式

上拉输入模式
上拉输入模式
  1. 上拉电阻:把不确定的信号通过电阻连接到高电平电信号初始化为高电平
  2. 下拉电阻:把不确定的信号通过电阻连接到低电平电信号初始化为低电平

默认情况下输入引脚数据为1,高电平。

上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平保持在高电平(自己理解:上拉电阻连接电压);并且在I/O端口输入为低电平的时候,输入端的电平也是低电平(自己理解:上拉电阻上的电压和端口导通)。

下拉输入模式

下拉输入模式
下拉输入模式

默认情况下输入引脚为0,低电平。

下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平也是高电平。

浮空输入模式

浮空输入模式
浮空输入模式

浮空输入模式下,I/O端口的电平信号==直接进入输入数据寄存器==。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。

通常用于IIC、USART。

模拟输入模式

模拟输入模式
模拟输入模式

模拟输入模式下,I/O端口的模拟信号(电压信号(电压值),而非电平信号)直接模拟输入到片上外设模块,比如==ADC模块==等。模拟信号一般:3.3v 5v 9v。

输出模式

开漏输出模式

可以输出0和1,适用于电平不匹配场合,要得到高电平需要上拉电阻才行。

开漏输出模式下(上拉电阻+N-MOS管),只有N-MOS工作,P-MOS一直处于断开状态,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经N-MOS管,最终输出到I/O端口。

这里要注意N-MOS管,当设置输出的值为高电平的时候,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口外部的上拉或者下拉决定;

开漏输出模式-高电平
开漏输出模式-高电平

当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。

开漏输出模式-低电平
开漏输出模式-低电平

同时,I/O端口的电平也可以通过输入电路进行读取;注意,I/O端口的电平不一定是输出的电平。

开漏复用输出模式

开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,==不是让CPU==直接写输出数据寄存器,取而代之利用==片上外设==模块的复用功能输出来决定的。

片内外设功能:TX1,MOSI,MISO,SCK,SS

推挽输出模式

可以输出高低电平0和1,适用于双向IO使用。具有一定的电压与电流驱动能力,可以直接驱动合适的元件工作,若需要更高或者更低的电压驱动,这就需要开漏模式。

推挽输出模式下(P-MOS管+N-MOS管),通过设置位设置/清除寄存器或者输出数据寄存器的值,途经P-MOS管和N-MOS管,最终输出到I/O端口。

这里要注意P-MOS管和N-MOS管,当设置输出的值为高电平的时候,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定:高电平;

推挽输出模式-高电平
推挽输出模式-高电平

当设置输出的值为低电平的时候,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定:低电平。

推挽输出模式-低电平
推挽输出模式-低电平

同时,I/O端口的电平也可以通过输入电路进行读取;注意,此时I/O端口的电平一定是输出的电平。

推挽复用输出模式

推挽复用输出模式,与推挽输出模式很是类似。只是输出的高低电平的来源,==不是让CPU==直接写输出数据寄存器,取而代之利用==片上外设==模块的复用功能输出来决定的。

片内外设功能IIC的SCL、SDL

推挽输出与开漏输出的区别

推挽输出开漏输出
高电平P-MOS激活 N-MOS断开
3.3V
P-MOS断开 N-MOS断开
由外部电路决定
低电平P-MOS断开 N-MOS激活
0V
P-MOS断开 N-MOS激活
0V
优点可以直接输出3.3V配合外部电路更加灵活
缺点只能输出3.3V高电平实际是高阻态
无法输出电流

点击数:6

    暂无评论

    发送评论 编辑评论

    
    				
    |´・ω・)ノ
    ヾ(≧∇≦*)ゝ
    (☆ω☆)
    (╯‵□′)╯︵┴─┴
     ̄﹃ ̄
    (/ω\)
    ∠( ᐛ 」∠)_
    (๑•̀ㅁ•́ฅ)
    →_→
    ୧(๑•̀⌄•́๑)૭
    ٩(ˊᗜˋ*)و
    (ノ°ο°)ノ
    (´இ皿இ`)
    ⌇●﹏●⌇
    (ฅ´ω`ฅ)
    (╯°A°)╯︵○○○
    φ( ̄∇ ̄o)
    ヾ(´・ ・`。)ノ"
    ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
    (ó﹏ò。)
    Σ(っ °Д °;)っ
    ( ,,´・ω・)ノ"(´っω・`。)
    ╮(╯▽╰)╭
    o(*////▽////*)q
    >﹏<
    ( ๑´•ω•) "(ㆆᴗㆆ)
    😂
    😀
    😅
    😊
    🙂
    🙃
    😌
    😍
    😘
    😜
    😝
    😏
    😒
    🙄
    😳
    😡
    😔
    😫
    😱
    😭
    💩
    👻
    🙌
    🖕
    👍
    👫
    👬
    👭
    🌚
    🌝
    🙈
    💊
    😶
    🙏
    🍦
    🍉
    😣
    Source: github.com/k4yt3x/flowerhd
    颜文字
    Emoji
    小恐龙
    花!
    上一篇
    下一篇