如何在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的信息之前,您需要了解像PIN复用,PIN控制块和与其相关联的寄存器所需的其他基础。

如何在LPC1768中编程GPIO

PIN连接LPC1768的块

LPC1768最常见的IC封装是LQFP100 I.E.包装中有100个引脚。在这100销中,30个引脚用于主电源(V.DD和V.SS.),用于处理器的振荡器和RTC(XTAL1,XTAL2,RTCX1和RTCX2),很少参考电压引脚和用于调试接口的引脚(JTAG / SWD)。

进入其余70个销钉,它们都可以用作GPIO引脚。但是,如果我们想通过一个引脚输出PWM或将其用于UART交流。由于这70个引脚是MCU与外部世界(通过GPIO或任何其他外围)进行通信的唯一方法,因此应该有一种机制来决定哪个引脚作用于GPIO PIN,哪个引脚充当PWM输出引脚(作为一个PIN(作为一个)例子)。

这是LPC1768的PIN连接块的位置。由于PIN物理上是有限的资源,因此所有这些70个引脚都具有多于一种功能。在内部,这是使用多路复用器实现的,其中PIN可以被配置为具有许多可能的功能之一。

例如,如果您在LPC1768的数据表中引用PIN配置部分,则IC上的引脚37名为P0.0的PIN编号37可以具有以下任何功能:

  • GPIO - 通用数字输入/输出引脚
  • RD1 - CAN1接收器输入引脚
  • TXD3 - UART3变送器输出引脚
  • SDA1 - I2C1数据引脚(符合非I2C)

类似地,所有其他引脚都具有相应的多个功能。

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

PIN描述LPC1768

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

LPC1768 MCU具有5个称为端口0(P0),端口1(P1),端口2(P2),端口3(P3)和端口4(P4)的端口。每个端口可以是32位宽的i.e.每个端口最多可具有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] - 仅提供端口4中的引脚28和29。休息不可用。

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

PIN控制模块的寄存器

有三组与PIN连接块相关联的寄存器。他们是:

  • Pinsel ––––引脚功能选择寄存器
  • PINMODE ––––输入模式控制寄存器
  • PINMODE_OD -----开路漏极模式控制寄存器

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

登记 控制
Pinsel0 p0 [15:0]
Pinsel1 p0 [31:16]
Pinsel2 P1 [15:0] - 以太网
Pinsel3 p1 [31:16]
Pinsel4 P2 [15:0]
Pinsel7 p3 [31:16]
Pinsel9 p4 [31:16]
PINSEL10. 跟踪端口启用

每个平底台寄存器中的两个位用于控制一个引脚。例如,位0和1 inPinsel0用于配置P0.0引脚的功能。下表显示了它们分配给特定引脚的PINEL寄存器和相应函数的比特值。

PINSEL0 - 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连接块章节,并理解不同的PINEL寄存器值和相应的功能。

访问程序中的PINEL寄存器

LPC1768的存储映射中的所有寄存器及其对应位置都已在LPC17xx.h头文件中定义。根据功能,LPC1768的寄存器被分组为几个C结构。例如,与PIN连接块相关联的所有寄存器被分组为称为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,那么您必须将PINSEL0的位5和4中的第5位为10,因为您可以使用以下语句。

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

LPC1768中的GPIO

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

为了使用快速GPIO来区分正常的GPIO,与快速GPIO端口相关联的寄存器通常以FIO为前缀。

如前所述,如果我们想将PIN用作GPIO引脚,那么我们必须配置Pinsel寄存器以将PIN制作为GPIO PIN,然后使用GPIO外围的寄存器将PIN引脚作为输入或输出,还可以读取或写入引脚(取决于其配置方式)。

默认情况下,所有70个引脚都配置为GPIO输入引脚,用于复位。

GPIO在LPC1768中登记

与LPC1768 MCU的GPIO外围有五个寄存器。他们的名称和描述是在下表中提到的。

GPIO寄存器的名称 描述 功能
FIODIR. 快速GPIO端口方向控制寄存器 用于控制单个端口引脚的方向(输入或输出)。当0时,输入引脚。当1时,输出引脚。
fioMask 港口的快速面具注册。 用于屏蔽来自读写操作的引脚。当有点为0时,其他四个寄存器的读/写任务被反映在引脚上。当1时,引脚不受其他寄存器的影响。
快速端口引脚值寄存器。 用于直接读取或写入端口引脚。无论方向如何,都可以读取引脚状态。
菲多斯 快速端口输出设置寄存器。 用于控制高状态的输出引脚。当1时,输出引脚会产生高电平。0没有效果。
FIOCLR. 快速端口输出清除寄存器。 用于控制输出引脚的低状态。当1时,输出引脚会产生低。0没有效果。

访问GPIO寄存器在编程中

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

  • lpc_gpio0.
  • lpc_gpio1
  • lpc_gpio2.
  • LPC_GPIO3.
  • LPC_GPIO4.

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

LPC_GPION-> FIODIR.

这里,基于所选择的端口,n可以是0和4之间的任何数字。

现在,让我们看到几乎没有用于使P0.2引脚作为输出的编程语句,并使输出值高和低。

首先,P0.2引脚必须使用PINEL寄存器(我们在上一步中已经完成)的GPIO引脚配置为GPIO引脚。

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

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

lpc_gpio0-> fiodir | =(1 << 2);

要使PIN高,请使用FIOSET寄存器。

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

要使PIN较低,请使用FIOCLR寄存器。

lpc_gpio0-> fioclr | =(1 << 2);

示例:眨眼一个LED

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

#include
空隙延迟(空白);
int main(无效)
{
lpc_gpio1-> fiodir | =(1 << 14);//配置P1.14作为输出
而(1)
{
LPC_GPIO0-> FIOSET | =(1 << 14);//输出高
延迟 ();
lpc_gpio0-> fioclr | =(1 << 14);//输出低电平
延迟 ();
}
返回0;
}

空隙延迟(空白)
{
int计数,i = 0;
for(count = 0; count <6000000; count ++)

{

I ++;

}

}

结论

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

我建议您在参考手册中探索PIN控制块和GPIO块,并读取其他寄存器。

2回复

    1. 当您希望用面具M清除寄存器的记者位时使用否定和操作。它的意思是什么:

      允许使用内容0x0F0F(0000 1111 0000 1111)的名为R0的简单32位寄存器(B [31] ... B [0])。我们有太掩模M用于位B [5]和B [2],另一个词,具有值0x24(.10 0100)。
      如果我们进行操作:
      R0&= 〜m
      我们的R0将被修改为:
      0x000b(0000 0000 0000 1011)

      但是,在另一个情况下,用相同的变量但是操作(在您的问题的情况下,没有否定):
      R0 | = 0x24

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

      因此,您使用&=〜当您希望从寄存器中“清洁”屏蔽位,而且当您想要使用M时更改整个寄存器时
      请注意,有时您不希望在| =操作中设置另一个掩码,因此在寄存器中使用掩码M&(值以放置)。就像这样,你就是确保你没有改变掩码位的其他比特。

      我希望它能帮助你!

发表评论

您的电子邮件地址不会被公开。

电子豪华粉丝
<\/i>","library":""}}" data-widget_type="nav-menu.default">
Baidu
map