在本教程中,我将向您展示如何在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的引脚连接块
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反应
你好先生,我是一个初学者,我有一个疑问,什么时候我们应该使用(&=~)和(|=)
当你想要清除带有掩码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)很好。这样你就可以确保你没有改变掩码位的其他位。
希望对你有所帮助!