LPC824-通用输入/输出端口

发布者:EnchantedMagic最新更新时间:2023-05-25 来源: elecfans关键字:输出端口 手机看文章 扫描二维码
随时随地手机看文章

在LED交替闪烁的实例中,已经用到了LPC824的GPIO端口。GPIO端口是处理器与外部设备打交道的基础,为了更好地应用它,接下来就对LPC824的通用输入输出端口(GPIO)的寄存器结构及用法做详细深入地讨论。
在前面已经介绍过,LPC824处理器是一个32位结构的处理器,但它的GPIO端口并没有把32根引脚全都接出来,而是根据封装的不同,分别引出来了29根(HVQFN33封装)和16根(TSSOP20封装)引脚。它们都具有如下特点:
(1)GPIO引脚可以通过软件配置为输入或输出。
(2)所有GPIO引脚都默认设置为输入,复位时禁用中断。
(3)引脚寄存器允许单独感测和设置各引脚。
(4)GPIO的输入/输出方向可以独立置位或者清除。

GPIO端口的具体使用配置会在稍后进行讨论,这里先来看一下“通用输入/输出端口GPIO”的结构体是如何定义的,代码如下:

typedef struct {    
  __IO uint8_t   B0;
  __IO uint8_t   B1;
  __IO uint8_t   B2;
  __IO uint8_t   B3;
  __IO uint8_t   B4;
  __IO uint8_t   B5;
  __IO uint8_t   B6;
  __IO uint8_t   B7;
  __IO uint8_t   B8;
  __IO uint8_t   B9;
  __IO uint8_t   B10;
  __IO uint8_t   B11;
  __IO uint8_t   B12;
  __IO uint8_t   B13;
  __IO uint8_t   B14;
  __IO uint8_t   B15;
  __IO uint8_t   B16;
  __IO uint8_t   B17;
  __IO uint8_t   B18;
  __IO uint8_t   B19;
  __IO uint8_t   B20;
  __IO uint8_t   B21;
  __IO uint8_t   B22;
  __IO uint8_t   B23;
  __IO uint8_t   B24;
  __IO uint8_t   B25;
  __IO uint8_t   B26;
  __IO uint8_t   B27;
  __IO uint8_t   B28;
  __I  uint8_t   RESERVED0[4067];
  __IO uint32_t  W0;
  __IO uint32_t  W1;
  __IO uint32_t  W2;
  __IO uint32_t  W3;
  __IO uint32_t  W4;
  __IO uint32_t  W5;
  __IO uint32_t  W6;
  __IO uint32_t  W7;
  __IO uint32_t  W8;
  __IO uint32_t  W9;
  __IO uint32_t  W10;
  __IO uint32_t  W11;
  __IO uint32_t  W12;
  __IO uint32_t  W13;
  __IO uint32_t  W14;
  __IO uint32_t  W15;
  __IO uint32_t  W16;
  __IO uint32_t  W17;
  __IO uint32_t  W18;
  __IO uint32_t  W19;
  __IO uint32_t  W20;
  __IO uint32_t  W21;
  __IO uint32_t  W22;
  __IO uint32_t  W23;
  __IO uint32_t  W24;
  __IO uint32_t  W25;
  __IO uint32_t  W26;
  __IO uint32_t  W27;
  __IO uint32_t  W28;
  __I  uint32_t  RESERVED1[995];
  __IO uint32_t  DIR0;          
  __I  uint32_t  RESERVED2[31];
  __IO uint32_t  MASK0;         
  __I  uint32_t  RESERVED3[31];
  __IO uint32_t  PIN0;          
  __I  uint32_t  RESERVED4[31];
  __IO uint32_t  MPIN0;         
  __I  uint32_t  RESERVED5[31];
  __IO uint32_t  SET0;
  __I  uint32_t  RESERVED6[31];
  __O  uint32_t  CLR0;          
  __I  uint32_t  RESERVED7[31];
  __O  uint32_t  NOT0;          
  __I  uint32_t  RESERVED8[31];
  __O  uint32_t  DIRSET0;       
  __I  uint32_t  RESERVED9[31];
  __O  uint32_t  DIRCLR0;       
  __I  uint32_t  RESERVED10[31];
  __O  uint32_t  DIRNOT0;       
} LPC_GPIO_PORT_Type;
 

上述代码对LPC824的GPIO端口进行了结构体定义,同前面讨论的结构体一样,它定义的成员变量利用偏移地址与GPIO端口区的寄存器一一对应。下表给出了GPIO端口区寄存器的分布情况。

由上表可以看出,在LPC824中GPIO端口一共使用了68个寄存器。其中,B0~B28共29个寄存器为一类,分别对应到PIO0~PIO28一共29个引脚,每个寄存器长度为一个字节(8位),占用的偏移地址范围为0x0000~0x001C。W0~W28共29个寄存器为一类,也分别对应到PIO0~PIO28一共29个引脚,每个寄存器长度为一个字(32位),占用的偏移地址范围为0x1000~0x1074。这两类寄存器每个对应一个引脚,用于操作每个引脚的输出或输入电平,可选择字节操作型(B类寄存器),或字操作型(W类寄存器)。其余10个寄存器的长度都是32位,用于操作端口的其他功能。同前面的结构体对应比较,成员B0~B28因此被定义为uint8_t型(即8位长度),可读可写(即__IO型),成员W0~W28因此被定义为uint32_t型(即32位长度),可读可写(即__IO型),其余10个成员DIR0~DIRNOT0因此被定义为uint32_t型(即32位长度),读写属性则根据不同寄存器需要被定义为__IO型(读写)或__I型(读)或__O型(写)。在地址空余的地方,比如B28寄存器到W0寄存器之间,一共空余了0x1000-0x001C-1=4067个字节(见上表),因此定义了32位的空数组成员RESERVED0[4067]以占满偏移的字节数,且为__I型(输入型),其他空余处的分析以此类推。

从上面的讨论可知,端口的结构体LPC_GPIO_PORT_Type是严格按照上表中的寄存器地址偏移来进行定义的。完成定义后,还需要对其进行地址映射,如下:

#define LPC_GPIO_PORT_BASE 0xA0000000UL
#define LPC_GPIO_PORT ((LPC_GPIO_PORT_Type *) LPC_GPIO_PORT_BASE)

通过上述定义后,在程序中就可以通过“LPC_GPIO_PORT->”的形式来引用各端口寄存器的名称了。以上分析实际上是重现了前面头文件解析中的分析方法,以进一步巩固学习效果,在明白了其中原理之后,后续各模块的介绍中,将不再进行此类分析了。

接下来讨论各个端口寄存器的功能,先来看GPIO端口的29个字节引脚寄存器(B0~B28),其字节地址从0xA0000000(B0)至0xA000001C(B28),由于29个寄存器功能完全一样(只是针对不同的引脚),下表只给出了其中一个的全部位结构。

(1)第0位 为对应引脚的操作位,置1时,引脚输出高电平,置0时输出低电平,引脚输入高电平时,读该位的值为1,输入低电平时值为0。对该位的操作不受引脚屏蔽功能的影响。若该引脚被配置为模拟引脚时,读出的值恒为0。
(2)第1到7位为保留位,读取这些位的值恒为0,写入这些位的值将被忽略。

接下来看GPIO端口的29个字引脚寄存器(W0~W28),其字节地址从0xA0001000(W0)至0xA0001074(W28),同样由于29个寄存器功能完全一样(只是针对不同的引脚),下表只给出了其中一个的全部位结构。

 

(1)当对32位写入0x00000001~0xFFFFFFFF之间的任何值,引脚输出高电平,写入0时引脚输出低电平,引脚输入高电平时,将读到32位数据0xFFFFFFFF,输入低电平时值为0。对这些位的操作不受引脚屏蔽功能的影响。若该引脚被配置为模拟引脚时,读出的值恒为0。

下表给出的是GPIO方向端口寄存器DIR0的全部位结构,其字节地址为0xA0002000。

(1)第0到28位为对应引脚的操作位,置1时,引脚为输出方向,置0时为输入方向。
(2)第29到31位为保留位。
 

下表给出的是GPIO屏蔽端口寄存器MASK0的全部位结构,其字节地址为0xA0002080。对该寄存器的操作会影响到读写MPORT寄存器(即下面的MPIN0寄存器)。

(1)第0到28位为对应MPORT引脚的操作位,置1时,对应的MPORT写入值会被屏蔽(不生效),即对MPORT的输出操作不会改变原有状态,而对MPORT的读取则始终为0。置0时,不影响对MPORT的操作(即不屏蔽)。
(2)第29到31位为保留位。

下表给出的就是GPIO屏蔽端口引脚寄存器MPIN0的全部位结构,其字节地址为0xA0002180。

(1)第0到28位为对应GPIO引脚(PIO0~PIO28)的操作位,当某位置1时,若MASK0中该位也为1,则对应引脚将保持原来的电平不变,若MASK0中该位为0,则对应引脚会输出高电平。置0时,若MASK0中该位为1,则对应引脚将保持原来的电平不变,若MASK0中该位为0,则对应引脚会输出低电平。
(2)第29到31位为保留位。

如果想读写引脚的电平不受MASK0寄存器的控制,则可以访问PIN0寄存器而不是MPIN0,下表就给出了GPIO端口引脚寄存器PIN0的全部位结构,其字节地址为0xA0002100。

 

(1)第0到28位为对应GPIO引脚(PIO0~PIO28)的操作位,当某位置1时,对应的引脚会输出高电平,置0时,对应的引脚会输出低电平。引脚输入高电平时,读得对应引脚的值为1,输入低电平时读得的值为0。
(2)第29到31位为保留位。

下表给出的是GPIO端口设置寄存器SET0的全部位结构,其字节地址为0xA0002200。向该寄存器写1,可以置位输出位,且不受MASK0寄存器的影响。读这些寄存器会返回端口的输出位,且无论引脚是什么方向。

(1)第0到28位为对应GPIO引脚(PIO0~PIO28)的操作位,当某位置1时,对应的引脚会输出高电平,置0时,对应的引脚将保持原来的电平不变。读取时将会得到原来的输出值。
(2)第29到31位为保留位。 

下表给出的是GPIO端口清除寄存器CLR0的全部位结构,其字节地址为0xA0002280。该寄存器为只写,向该寄存器写1,可以清除输出位,且不受MASK0寄存器影响。

(1)第0到28位为对应GPIO引脚(PIO0~PIO28)的操作位,当某位置1时,对应的引脚会输出低电平,置0时,对应的引脚将保持原来的电平不变。
(2)第29到31位为保留位。

下表给出的是GPIO端口切换寄存器NOT0的全部位结构,其字节地址为0xA0002300。该寄存器为只写,向该寄存器写1,可以切换(反转)输出位,且不受MASK0寄存器影响。

(1)第0到28位为对应GPIO引脚(PIO0~PIO28)的操作位,当某位置1时,对应的引脚电平会被取反输出,置0时,对应的引脚将保持原来的电平不变。
(2)第29到31位为保留位。

下表给出的是GPIO端口方向设置寄存器DIRSET0的全部位结构,其字节地址为0xA0002380。该寄存器为只写。

(1)第0到28位为对应GPIO引脚(PIO0~PIO28)的操作位,当某位置1时,对应的引脚会被设置为输出方向,置0时,对应的引脚将保持原来的方向不变。
(2)第29到31位为保留位。

下表给出的是GPIO端口方向清除寄存器DIRCLR0的全部位结构,其字节地址为0xA0002400。该寄存器为只写。

(1)第0到28位为对应GPIO引脚(PIO0~PIO28)的操作位,当某位置1时,对应的引脚会被设置为输入方向,置0时,对应的引脚将保持原来的方向不变。
(2)第29到31位为保留位。

下表给出的是GPIO端口方向寄存器DIRNOT0的全部位结构,其字节地址为0xA0002480。该寄存器为只写。

(1)第0到28位为对应GPIO引脚(PIO0~PIO28)的操作位,当某位置1时,对应的引脚方向会被取反切换,置0时,对应的引脚将保持原来的方向不变。
(2)第29到31位为保留位。

以上介绍的是LPC824通用输入输出端口的基本原理,至于如何具体使用,将在下次再进行讨论。 


关键字:输出端口 引用地址:LPC824-通用输入/输出端口

上一篇:LPC824-GPIO端口应用
下一篇:LPC824-头文件应用

推荐阅读最新更新时间:2024-11-13 06:27

LPC1114通用输入/输出端口(GPIO)
在前面的示例中,已经用到了LPC1114的GPIO端口。GPIO端口是CPU与外部设备打交道的基础,为了更好地运用好它,下面将对LPC1114的通用输入输出端口(GPIO)的寄存器结构及用法做详细深入地讨论。 在第一节中已经介绍过,LPC1114处理器是一个32位结构的处理器,但它的GPIO端口没有把32根引脚都接出来,而是每组只接出来12根引脚(注意,第四组只接出来6根引脚),共有4组,一共42根引脚。它们都具有如下特点: 1.可通过软件配置GPIO引脚为输入或输出 2.每个独立的端口引脚均可作为外部中断的输入引脚(边沿或电平触发) 3.边沿触发中断可配置为上升沿触发、下降沿触发以及双边沿触发 4.电平触发中断引脚可以配置为高电
[单片机]
LPC1114<font color='red'>通用</font><font color='red'>输入</font>/<font color='red'>输出</font><font color='red'>端口</font>(GPIO)
STM32端口输入输出模式配置
STM32的IO口模式配置 根据数据手册提供的信息,stm32的io口一共有八种模式,他们分别是: 四种输入模式 上拉输入: 通过内部的上拉电阻将一个不确定的信号通过一个电阻拉到高电平。 下拉输入: 把电压拉到GND。与上拉原理相似。 浮空输入: 引脚内部什么都不接,处于浮空模式下,电平状态是不确定的。外部信号输入什么,IO口就是什么状态。 模拟输入: 接收到的是连续的模拟信号,一般用于AD转换。 四种输出模式 推挽输出: 可以输出高低电平,连接数字器件。在stm32中推挽电路由两个MOS管组成:输出高电平时P-MOS管导通,引脚联通VDD(3.3v)。输出低电平时N-MOS导通,引脚联通GND。**该方式既提高电路的负
[单片机]
大功率功放输出端口的热驻波测量
以DUT是100W(50dBm)放大器的热驻波测试为例 耦合器的耦合度20dB,衰减器40dB, 参数选取规则是 DUT输出功率 - 总损耗= -10dBm 环形器和负载是为了避免大功率信号进入PORT4 ( -10dBm),可以用带负载的隔离器代替,隔离度大于70dB(可以串联) 注意上述功率计算,确保安全... PORT1和PORT4的频率差可设置为1M或2MHz; PORT1输出的信号(红色)使DUT正常工作; PORT4输出信号及反射的信号(绿色)是驻波测试,S44; 网络分析仪的IFBW =100Hz; 在Mode - Port Configure 中设置PORT1和PORT4的频率(相差1M)和功率(0
[测试测量]
大功率功放<font color='red'>输出</font><font color='red'>端口</font>的热驻波测量
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved