LPC824-通用输入/输出端口

发布时间:2023-05-25  

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通用输入输出端口的基本原理,至于如何具体使用,将在下次再进行讨论。 


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    芯片的支持,使得ARM广泛应用于检测、通讯、控制等领域。 本文以ARM 920T核的S3C24449芯片作为微控制器,在TQ2440开发板进行串口扩展,利用开发板上的系统总线接口和通用输入输出接口......
    。这一微控制器器件系列具有更佳的闪存密度、通用输入输出接口(GPIO)、CAN-FD和硬件安全性,扩展了采用™技术的汽车车身/暖通空调(HVAC)和方向盘应用人机界面(HMI)解决方案组合。 本文......
    Purpose Input/Output,即通用输入输出口。它是一个通用的数字电平接口,可以极大地扩展单片机的应用范围。GPIO 的主要功能就是承载数据,它是......
    凌科技股份公司推出全新车规级PSoC™ 4100S Max系列。这一微控制器器件系列具有更佳的闪存密度、通用输入输出接口(GPIO)、CAN-FD和硬件安全性,扩展了采用CAPSENSE™技术......
    化数据处理。 数据初始化 3.输入/输出分配&数据交互 PLC与机器人输入输出分配:包含远程→主站 主站→远程 ①.专用输入&输出设置 专用输入输出 ②.通用输入&输出设置 通用输入输出......
    线图 3、转矩控制模式下相关接线 三菱MR-JE-A驱动在转矩模式下,漏型输入输出接口时相关接线如下: 转矩模式漏型输入输出接线图 三菱伺服在力矩模式下,源型输入输出接线: 力矩模式下源型接线 伺服......
    。常见的外设包括通用输入输出(GPIO)、定时器(TIM)、串行通信接口(USART、SPI、I2C)、模数转换器(ADC)、数字到模拟转换器(DAC)和通用定时/计数器(RTC)等。这些外设模块提供了灵活的接口......
    接口、RS485接口、CAN接口、USB接口、以太网接口等。借用官网的图片,我们可以初步领略一下这款板子的强大功能: 该板子的通用输入输出部分、步进电机接口,均采用了光耦隔离,可以......
    快速搞懂GPIO控制器的六种模式;在嵌入式系统和单片机开发中,GPIO(通用输入输出)控制器是一个非常重要的组件。GPIO引脚的灵活性使它们能够执行多种功能,从简单的输入输出到复杂的通信任务。为了......
    (X),Level2功能安全等级为X(X),其中X可以根据具体功能分为ASILA/B/C/D。1.Level2信号校验软件架构(1)输入输出接口信号校验模块输入输出接口,如表1所示。表1 Level2......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>