如何在LPC1768中编程GPIO ?LPC1768 GPIO教程

在本教程中,我将向您展示如何在LPC1768中配置GPIO。GPIO是LPC1768 MCU中的常用外设之一,可直接或间接。我将解释与GPIO相关的所有寄存器,我们如何操纵这些寄存器以控制输入和输出操作。

LPC1768 GPIO教程将是第一个重要教程,解释了ARM Cortex-M3 MCU的主要外围。

重要的提示:我已经在上一个教程中提到过这个,但我会在每个LPC1768教程中重复它。从官方NXP网站下载LPC1768 MCU的数据表和用户手册。我无法详细解释/讨论每个主题。您必须在这些文件中查找讨论的主题,并收集其他信息。

介绍

对于通用输入输出短而言,GPIO是ARM Cortex-M3 LPC1768中的基本和最简单的外围设备之一。顾名思义,GPIO外设的目的是充当处理器的输入或输出,使得MCU可以与外界交互。(这里,MCU的术语外部手段是外部外围的外部外部。

除电源相关,时钟相关和一些其他调试引脚,几乎所有LPC1768引脚都可以配置为GPIO引脚。另外,每个GPIO引脚可以进一步设置为输入引脚或作为输出引脚。当GPIO引脚设置为输入时,MCU可以在电压方面从外部分量读取数据。

类似地,当GPIO引脚设置为输出时,MCU将控制引脚上的电压并因此控制外部部件。

在更多地了解LPC1768中的GPIO及其寄存器之前,您需要了解一些其他的基础知识,如引脚复用、引脚控制块和与其相关的寄存器。

如何在LPC1768中编程GPIO

LPC1768的引脚连接块

LPC1768最常见的IC封装是LQFP100,即封装中有100个引脚。在这100引脚中,30引脚用于主电源(VDD和V党卫军),振荡器处理器和RTC (XTAL1, XTAL2, RTCX1和RTCX2),少数参考电压引脚和引脚的调试接口(JTAG / SWD)。

留在剩下的70销上,它们都可以用作GPIO引脚。但是,如果我们想通过其中一个引脚输出PWM或用于UART通信的话,何时何地。由于这70个引脚仅为MCU与外部世界(通过GPIO或任何其他外围设备)通信,因此应该有一个机制来决定哪个PIN发挥GPIO引脚,并且哪个引脚充当PWM输出引脚(作为PWM输出引脚(作为PWM输出引脚)例子)。

这就是LPC1768的引脚连接块出现的地方。由于引脚在物理上是有限的资源,所有这70个引脚都有不止一个功能。在内部,这是使用多路复用器实现的,其中一个引脚可以配置为具有多种可能的功能之一。

例如,如果你参考LPC1768 datasheet中的Pin Configuration Section, IC上的Pin号37 (P0.0)可以具有以下任何功能:

  • 通用数字输入/输出引脚
  • RD1 - CAN1接收机输入引脚
  • TXD3 - UART3发射机输出引脚
  • SDA1 - I2C1数据引脚(非i2c兼容)

类似地,所有其他引脚都有相应的多种功能可供选择。

引脚连接块负责配置内部多路复用器以连接PIN和片上外围设备(包括GPIO)。在激活外围设备之前,必须连接到适当的引脚。当引脚被分配给特定功能时,所有其他外围功能都被排除在引脚上。

LPC1768的引脚描述

在查看PIN控制模块的寄存器之前,让我们简要介绍LPC1768中的端口。除了电源,振荡器和调试引脚之外的所有70销(即,可以配置为GPIO引脚的引脚),将被分组为端口,以外的所有LPC1768 I.。

LPC1768单片机有5个端口,分别为Port 0 (P0)、Port 1 (P1)、Port 2 (P2)、Port 3 (P3)和Port 4 (P4)。每个端口可以是32位宽,即每个端口最多可以有32脚。因此,端口中的引脚命名如下:

Px。y–––––其中x是端口(0 - 4),y是引脚(0 - 31)。

但LPC1768中的所有端口都可能没有32个引脚,并且它们不可用的引脚通常被标记为“保留”。以下是LPC1768的五个端口中的每一个中所有可用引脚的列表。

  • 端口0 - P0 [30:0] - 端口0中的引脚12,13,14和31不可用。
  • 端口1 - P1[31:0] -端口1的引脚2,3,5,6,7,11,12和13不可用。
  • 端口2 - P2 [13:0] - 端口2中的引脚14至31不可用。
  • 端口3 - P3[26:25] -只有端口3中的引脚25和26可用。休息不可用。
  • 端口4 - P4[29:28] -只有Pins 28和29在端口4是可用的。休息不可用。

如果您计算所有可用引脚,则将结果达到70。

PIN控制模块寄存器

有三组寄存器与引脚连接块相关。它们是:

  • PINELEL -----引脚功能选择寄存器
  • PINMODE -----输入模式控制寄存器
  • PINMODE_OD–––––开式排水模式控制寄存器

在这三组寄存器中,我们感兴趣的是PINSEL寄存器。有8个PINSEL寄存器。下表显示了PINSEL寄存器和它们控制的引脚的列表。

注册 控制
佩尔纽隆 P0 [15:0]
PINSEL1. P0 [31:16]
百莱斯2. P1(15:0)——以太网
佩埃尔3. P1 (31:16)
佩埃尔4. P2 [15:0]
佩氏7. P3 (31:16)
佩氏9. P4 [31:16]
PINSEL10 跟踪端口启用

每个PINSEL寄存器中的两个比特用来控制一个引脚。例如,PINSEL0中的位0和1用于配置P0.0引脚的功能。下表显示的值的PINSEL寄存器和相应的功能,他们分配给一个特定的引脚。

PINSEL9值 函数
00 主(默认)函数(通常为GPIO)
01 第一个替代函数
10 第二个备用功能
11 第三备选功能

下表显示了PINSEL0寄存器的不同值,位0和1即P0.0引脚的可能函数。

PINSEL0 1:0 [] 函数P0.0
00 GPIO口0.0
01 RD1
10 TXD3
11 SDA1

同样,您可以参考LPC1768参考手册中的Pin Connect Block章节,了解不同的PINSEL寄存器值和相应的函数。

在程序设计中访问PINSEL寄存器

LPC1768内存映射中的所有寄存器及其对应位置已经在lpc17xx.h头文件中定义。根据功能的不同,LPC1768的寄存器被分为几个C结构。例如,所有与引脚连接块相关的寄存器都被分组到一个名为LPC_PINCON的结构中。

可以使用标准C结构访问技术访问该结构的元素。

例如,如果你想将P0.2设置为GPIO,那么你必须将PINSEL0的5位和4位设为00。为此,您可以使用以下语句。

lpc_pincon-> pinsel0&=〜((1 << 5)|(1 << 4));

类似地,如果查看P0.2的其他可能的功能,则可以将其配置为TXD0或AD0.7。因此,如果你想设置P0.2引脚为ADC输入AD0.7,那么你必须使位5和4的PINSEL0为10,你可以使用下面的语句。

lpc_pincon-> pinsel0 | =(1 << 5);

GPIO在LPC1768中

如果你还记得LPC1768入门教程中提到的LPC1768的框图,GPIO外围设备直接连接到AHB总线(AMBA高性能总线)用于快速I/O操作。如果你使用ARM7 mcu,那么你可能会记得在那些mcu中有两套GPIO外设,称为GPIO和Fast GPIO。在LPC1768中,所有的GPIO端口都是Fast GPIO端口。

为了区分普通GPIO和Fast GPIO,与Fast GPIO端口相关的寄存器通常以FIO前缀。

如前所述,如果我们想使用引脚作为GPIO引脚,我们必须配置PINSEL寄存器以使PIN作为GPIO引脚,然后使用GPIO外设的寄存器使得PIN使PIN作为输入或输出,也可以使用输入或输出。读取或写入引脚(根据配置方式)。

缺省情况下,所有70个引脚都被配置为GPIO输入引脚。

LPC1768中的GPIO寄存器

LPC1768单片机的GPIO外设有5个寄存器。下表列出了它们的名称和描述。

GPIO寄存器名称 描述 函数
FIODIR 快速GPIO端口方向控制寄存器 用于控制单个端口引脚的方向(输入或输出)。当0时,引脚为Input。当1时,引脚为输出。
Fiomask. 端口快速掩码注册。 用于屏蔽读和写操作中的引脚。当位为0时,其他四个寄存器的读/写任务将反映在引脚上。当为1时,引脚不受其他寄存器的影响。
FIOPIN 快速端口引脚值寄存器。 用于直接读或写端口引脚。不管方向如何,引脚状态都可以读取。
Fiooset. 快速端口输出集寄存器。 用于控制输出引脚的高状态。当1时,输出引脚产生HIGH。0没有影响。
FIOCLR 快速端口输出清除寄存器。 用于控制输出引脚的LOW状态。当1时,输出引脚产生LOW。0没有影响。

编程中对GPIO寄存器的访问

类似于引脚控制块寄存器,GPIO寄存器也被分组成结构,每个GPIO端口一个。的结构是:

  • LPC_GPIO0
  • LPC_GPIO1
  • LPC_GPIO2
  • LPC_GPIO3
  • LPC_GPIO4

如果要修改特定端口的FIODIR寄存器,则简单访问结构的成员如下:

LPC_GPIOn - > FIODIR

这里,根据所选的Port, n可以是0到4之间的任何数字。

现在,让我们看一些编程语句,使P0.2引脚作为输出,并使输出值HIGH和LOW。

首先,P0.2引脚必须配置为GPIO引脚使用PINSEL寄存器(这是我们已经在前面的步骤)。

lpc_pincon-> pinsel0&=〜((1 << 5)|(1 << 4));

现在,要使引脚作为输出,使用GPIO0的FIODIR寄存器。

LPC_GPIO0 - > FIODIR | = (1 < < 2);

要使引脚为高,使用FIOSET寄存器。

LPC_GPIO0 - > FIOSET | = (1 < < 2);

要使PIN耗电,请使用FIOCLR寄存器。

LPC_GPIO0-> FIOCLR | =(1 << 2);

示例:闪烁LED

现在让我们看看如何闪烁连接到LPC1768 MCU的P1.14引脚的LED。

# include < lpc17xx.h >
空白延迟(无效);
int主要(空白)
{
LPC_GPIO1 - > FIODIR | = (1 < < 14);//设置P1.14为Output
而(1)
{
LPC_GPIO0 - > FIOSET | = (1 < < 14);/ /输出高
延迟 ();
LPC_GPIO0 - > FIOCLR | = (1 < < 14);/ /输出低
延迟 ();
}
返回0;
}

无效的延迟(空白)
{
int count,i = 0;
(数= 0;数< 6000000;计数+ +)

{

我+ +;

}

}

结论

在本教程中,我已经解释了LPC1768单片机中关于GPIO的一些基本信息。这包括配置一个引脚作为GPIO,如何使它作为输入或输出,当设置为输出,如何使引脚高或低。

我建议你在参考手册中探索引脚控制块和GPIO块,并阅读其他寄存器。

2反应

    1. 当你想要清除带有掩码m的寄存器的对应位时,就使用与运算。它的意思是:

      让我们考虑一个简单的32位寄存器(b[31]…b[0]),名为R0,内容为0x0F0F(0000 1111 0000 1111)。我们也有一个用于b[5]和b[2]位的掩码M,换句话说,值为0x24 (..)10 0100)。
      如果我们进行操作:
      r0&=〜m
      我们的R0将被修改为:
      0x000B (0000 0000 0000 1011)

      但是,在另一种情况下,使用相同的变量,但是OR操作(在你的问题的情况下,不是否定):
      R0 | = 0 x24

      我们的R0将被修改为:
      0x0F2F (0000 1111 0010 1111)

      所以,你使用&=~当你想要“清除”一个寄存器的掩码位,|=当你想应用改变整个寄存器与你的M。
      注意,有时您不希望在|=操作中设置掩码以外的其他位,因此在寄存器中使用掩码M&(Value to Put)很好。这样你就可以确保你没有改变掩码位的其他位。

      希望对你有所帮助!

留下一个回复

您的电子邮件地址不会被公开。必填字段被标记*