查看: 223|回复: 0

[分享] LPC800 前生今世-第七章 输入输出控制器(GPIO)

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3300

    主题

    6547

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32034
    最后登录
    2024-4-26
    发表于 2023-12-25 17:07:44 | 显示全部楼层 |阅读模式
    LPC800 前生今世-第七章 输入输出控制器(GPIO)



    一款MCU,最重要的是要有输入输出引脚,引脚的数量要够丰富,功能要够齐全,还要有灵活的输入输出控制方式。


    在LPC800系列中提供了很多封装和输入输出引脚数量的选项:
    11.png
    表1 LPC800各系列引脚数

    没有单独的模拟比较器供电引脚,其它封装都有单独的模拟比较器供电引脚。

    从表1可以看出,所有LPC800产品的引脚利用率是非常高的,除了供电引脚外,所有其它引脚,包含调试引脚、外接晶振的引脚和所有具有模拟功能的引脚,都可以作为普通的数字输入输出使用。甚至芯片的复位引脚,也可以在芯片启动后被配置为数字输入输出引脚。这大大增加了产品的可用性和配置的灵活性。

    这里要强调一个重要的概念,引脚通常被称为GPIO引脚,但引脚不等同于GPIO控制器。在LPC800中,引脚的配置由IOCON模块实现,而GPIO模块只实现软件对引脚输入电平的直接读取,和对输出引脚的电平高低的控制。

    所有需要用到输入输出引脚的模块,例如UART、I2C、SPI、ADC、定时器等,都需要使用IOCON配置外部引脚。使用GPIO模块之前,也都需要使用IOCON配置外部引脚。

    一、LPC800的引脚配置功能

    LPC800的引脚具有下述功能:
    ■内部上拉或下拉电阻
    ■漏极开路模式
    ■输入迟滞(Hysteresis)
    ■可配置的数字式毛刺滤波
    ■模拟模式
    下图是一个标准引脚的功能示意图:
    12.png            
    图1.引脚功能图

    这个示意图可以分为三个部分,上面是输出部分,下面是输入部分,中间是一个维持输入信号的维持电路。下面几个小节分别关注不同的功能部分。

    1.1 标准推拉输出

    这是最常用的输出模式,图1中绿色框中的两个MOS管的导通和截止,决定了输出电平的高低。采用这种模式时,芯片直接推动对应的引脚信号,并具有一定的信号驱动能力。具体驱动能力的大小,每个产品系列会不尽相同,用户需要查看数据手册中的参数说明。

    下图是LPC82x数据手册中Electrical pin characteristics列表中的相关参数:
    13.png

    VOH表示当引脚输出高时的情况,即输出电流为4mA或3mA时,引脚的电压值最多可以达到VDD-0.4V。例如,某个引脚有一个825Ω对地电阻,当VDD=3.3V时,电阻上的电流为4mA,达到手册规定的最大允许电流,此时引脚端的电压将不会低于2.9V,这远高于TTL或CMOS高电平的电压。

    在实际应用中,通常可以用一个串联了几百Ω小电阻的LED,通过输出高电平点亮LED。小电阻的具体阻值可以按照LED的压降计算得出,或按照经验测试出来。

    VOL表示当引脚输出低时,允许外部输入电流的大小。作为例子,可以用一个串联了小电阻的LED,跨接在VDD和引脚之间,通过输出低点亮LED。

    IOH和IOL表示当引脚输出高或低时,能够输出或输入的电流大小。

    为了一些需要大电流驱动的应用,在LPC800系列中,还有一些引脚能够输出较大的电流,当输出高时,输出电流可以达到20mA。下表是LPC82x数据手册中,关于PIO0_2、PIO0_3、PIO0_12和PIO0_16的输出参数表。利用这一特性,用户可以使用这些引脚,控制片外大电流的电路,例如直接驱动电流环的通信电路。
    14.png
    1.2 开漏输出

    开漏模式通常用于I2C通信和其它需要双向通信的场合。控制图中“开漏输出”控制信号有效,不管输出还是输入信号,也不管输出是高还是低,绿色框中上方的那个MOS管始终处于截止状态。

    使用开漏输出模式时,通常用户需要在该引脚的芯片外部设置一个上拉电阻,此电阻的大小由外部输入电路的输入阻抗决定。

    当引脚输出低时,绿色框中下方的MOS管导通,引脚被拉低;此时外部上拉电阻上流过的电流,会通过引脚注入下方的MOS管,因此上拉电阻不能太小,要保证注入电流不能超出芯片能够承受的范围。从上一节的引脚参数表中可以看到,一般引脚的灌入电流为4mA,即当VDD为3.3V时,外部的等效上拉电阻不能小于825Ω。

    当引脚输出高时,绿色框中下方的MOS管截止,引脚的电平由外部电路决定。此时片外的上拉电阻将把信号线拉至高电平。

    实际上,当在开漏输出引脚输出高时,两个MOS管都是处于截止状态,该引脚对外呈现高阻状态。利用这一特性,允许多个器件的开漏输出引脚相互连接在一起,通过“线与”实现双向通信。

    为了实现I2C的高速模式+,或其它大电流驱动的需要,LPC800系列中,还有几个引脚允许灌入较大的电流。在适当的配置下,不管是推拉输出还是开漏输出模式下,当引脚输出低时,可以有多达20mA的灌入电流。

    下图摘录于LPC82x的数据手册,可以看出PIO0_10和PIO0_11具有灌入大电流的能力。读者可以自行查看其它型号的数据手册,找出相应的引脚。

    15.png

    1.3 数字输入

    图1中橙色框里的电路就是数字输入部分。当引脚处于输入模式时,绿色框中的两个MOS管均处于截止状态,不对引脚的外部电平产生影响。

    当引脚配置为数字输出时,这部分输入电路仍然连接在引脚的回路中,并没有断开,即用户可以在配置为数字输出的引脚上读回信号线的状态。当引脚配置为开漏输出时,I2C就是利用这一特性实现了在同一个信号线上的双向通信,用户也可以利用这一特性,自行实现双向通信。

    LPC800的输入模式还有几个特殊的特性,可以方便地辅助用户实现相应的功能,随后几节会一一介绍。

    1.4 输入反向

    使能这个模式后,当输入引脚为低电平时,软件会在寄存器读到’1’,反之当输入引脚为高电平时,软件会在寄存器读到’0’。用户可以按照应用的要求,自主配置是否需要“输入反向”。

    一般情况下,基本用不到该功能。只有在片外使用负逻辑电路时,为了软件逻辑的方便,可以启用此功能。

    1.5 输入的数字滤波

    用户可以使能这个功能,自动地过滤掉输入信号中可能出现的毛刺。例如,用户可以利用它,实现按键的自动去抖动。
    如果输入信号的频率较高,则需要关闭此功能。

    经过适当配置,数字滤波功能能够滤除的最窄脉冲,是小于一个主时钟周期的脉冲,即当系统主时钟为30MHz时,宽度小于33ns的信号会被滤除。数字滤波功能可以滤除的最宽的脉冲,则是小于3 x 255个主时钟周期的脉冲,即当系统主时钟为30MHz时,可以滤除宽度小于25.5us的脉冲,这已经足够实现一般按键去抖动的要求。

    1.6 输入信号迟滞(Hysteresis)

    这个功能是指,当一个外部输入信号由低变高,或由高变低时,芯片内部会推迟输入状态的翻转。

    下面是LPC82x数据手册中引脚静态特性的参数表截图:
    16.png

    当外部输入电平为0.7VDD时,芯片会识别为’高’(VIH),即当VDD=3.3V时,VIH=2.3V;当外部输入电平为0.3VDD时,芯片会识别为’低’(VIL),即当VDD=3.3V时,VIL=1.0V。

    当使能输入迟滞功能时,按照上面截图的参数,芯片会在外部信号变化过程中,推迟0.4V改变内部寄存器的数值。这个迟滞电压的数值会随芯片的不同而不同,设计时请注意查看对应型号的数据手册。

    举个例子,当外部信号从3.0V下降到0V的过程中,如果没有迟滞功能,内部寄存器的数值会在信号刚好降到低于1.0V时,从’1’变为’0’;如果引入迟滞功能,只有信号降到低于0.6V时,内部寄存器的数值才会变化。同理,当外部信号上升时,没有迟滞功能时,内部寄存器的数值会在外部电平刚好超过2.3V时变化,使能迟滞功能后,内部寄存器的数值要在外部电平超过2.7V时才变化。

    使用这个功能的好处是,当外部输入信号变化时,可以滤除电平上的小幅抖动,内部寄存器的数值不至于随外部信号的抖动而频繁变化,减少软件处理的负担。

    1.7 输入维持


    在原文的用户手册中,该功能被称为Repeater(重复)模式。

    图1中紫色虚线框中的部分实现输入维持模式。当外部输入为高电平时,输入维持电路在引脚内部接入一个弱上拉电阻;当外部输入为低电平时,则在引脚内部接入一个弱下拉电阻。这样所产生的效果就是,如果外部电路不再驱动这个信号线,该信号线不至于处于浮空状态。

    我们知道,CMOS电路的输入端,在处于浮空状态时,会导致较大的漏电流增加功耗,同时也非常容易受到外界信号的干扰。使能输入维持模式,则可以避免这种浮空状态,减少了系统的无谓功耗,也提高了系统的可靠性。

    1.8 引脚的内部上拉或下拉

    上节介绍的“输入维持”模式里的上拉电阻和下拉电阻,是由对应电路自动引入,用户也可以按照自己的应用逻辑,直接使能引脚内部的上拉或下拉电阻,同样可以达到避免信号线浮空的目的。

    与输入维持模式不同的是,应用程序可以自行决定在外部电路浮空时,需要保持信号线的高电平状态,还是低电平状态。

    另外使能引脚的内部上拉或下拉,独立于引脚的输入或输出模式。即不管引脚是输入还是输出,都可以配置有内部上拉或下拉。

    按照数据手册中的参数推算,内部上拉电阻或下拉电阻的等效阻值的典型值是100kΩ左右。读者可自行查看手册中的相应部分。

    1.9 I2C模式

    在LPC800系列中,引脚PIO0_10和PIO0_11拥有特殊的I2C模式,除了支持标准和快速I2C模式,还可以支持I2C快速+模式。这两个引脚是真开漏输出,即在这两个引脚的输出电路中,没有图1绿色框中上边的那个MOS管;而普通的“非” 真开漏引脚,是通过始终让上边那个MOS管处于截止状态,实现开漏输出的功能。

    在LPC800中,只有I2C0可以配置为快速+模式。从SWM章节可以看到,LPC81x的I2C0引脚可以经SWM配置到任意引脚,但只能在引脚PIO0_10和PIO0_11上使用快速+模式;其它LPC800系列产品中,I2C0的引脚是不能经SWM移动的。

    当I2C的输出引脚使用PIO0_10和PIO0_11时,需要配置这两个引脚为I2C模式;当I2C的输出使用其它引脚时,则需要配置对应的引脚为开漏模式。

    1.10 模拟输入/输出

    对于模拟输入功能来说,不需要在IOCON中做任何配置,一旦在SWM模块使能了某个模拟输入功能后,该引脚对应的数字输入输出功能就被屏蔽。即作为模拟引脚时,图1中绿色框和蓝色框的输出MOS全部截止,橙色的输入线路也处于关闭状态,引脚上的数字输入输出电路均处于高阻状态。

    相比其它系列,在LPC84x中增加了两个DAC模拟输出,这两个DAC对应的配置寄存器相比其它引脚的配置寄存器,多了一个模拟输出的控制位。和模拟输入一样,当选择了模拟输出后,该引脚的数字输入输出电路即被屏蔽。

    二、引脚的5V兼容

    当引脚配置为数字输入模式时,除了与VDDCMP共用的PIO0_6引脚外,其它的引脚都可以承受外部5V的电压。PIO0_6只能承受与VDD相同的电压。
    当引脚配置为模拟输入时,则不能承受外部5V的电压,用户需特别留意。

    作为输入时,引脚能够承受5V的输入电压,这个特性极大地方便了使用LPC800产品,与传统的5V器件在同一个系统里的互联,即一个5V器件的数字输出引脚可以直接连接到LPC800的数字输入端。

    反之,LPC800的数字输出引脚可以直接与5V器件的输入端相连,但5V器件是否能够正确地识别LPC800输出的高电平,用户需自行查看这个5V器件的手册来决定。

    三、复位后引脚的默认状态

    结合SWM章节和GPIO章节的描述,系统复位后除了与SWDIO、SWCLK和RESETN对应的功能外,所有的可移动功能都与引脚断开,即引脚内部与GPIO模块相连;同时由于GPIO模块中所有的端口复位后默认为输入,因此在复位后,除PIO0_2、PIO0_3和PIO0_5外,所有其它引脚都是数字输入,并且使能了内部弱上拉电阻。

    在最新的LPC84x产品中,引入了一个新的模块-FAIM(快速初始化存储器),它可以在系统复位时,按照事先安排好的逻辑,在软件还未运行时快速地配置好引脚的弱上拉、弱下拉或输入维持模式。详见FAIM对应章节。

    3.1未用引脚的配置
    为了减少干扰和减小功耗,建议在软件启动后,立即把不用的悬空引脚,配置为输出并输出低电平同时关闭内部的上拉电阻。

    四、引脚模式配置

    在LPC800产品中,每个引脚都对应一个32位寄存器,用于配置1.1中介绍的各项功能和模式。下面几张表格列出了所有引脚的IOCON配置寄存器的每位功能。
    17.png


    表2.LPC81x、LPC82x、LPC83x和LPC84x引脚配置寄存器列表

    18.png

    表3.LPC82x、LPC83x和LPC84x引脚配置寄存器列表(不含LPC81x)


    19.png


    表4.LPC84x的引脚配置寄存器列表


    上述表格中列出了每个寄存器的第0~16位,寄存器的第17~31位均为保留位。其它位的意义如下:
    22.png

    五、使用IOCON的数字滤波功能实现按键去抖动的例程

    使用数字滤波实现按键去抖,配置过程很简单,只需三步:
    1、使能IOCON时钟;
    2、配置IOCONCLKDIVx的分频系数;
    3、配置对应引脚的配置寄存器。

    以下是初始化LPC824-Lite开发板上的KEY_USER和KEY_ISP按键的例程。
    在例程中使用了下列宏定义:
    23.png

    代码片段1.配置KEY_USER和KEY_ISP按键数字滤波功能的函数

    代码的第04和11行是对应的,此例程使用了IOCONCLKDIV0作为滤波时钟,并设置分频系数为255,在主频为30MHz时,可以滤除最大255x3=765个周期,即25.5us的脉冲。




    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 20:28 , Processed in 0.121895 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表