在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-GPIO端口应用
下一篇:LPC824-头文件应用
推荐阅读最新更新时间:2024-11-13 06:27
设计资源 培训 开发板 精华推荐
- 用于 MCU 系统负载感应的 NCP301LSN32T1 2.8V 电压检测器的典型应用
- 猪场气体监测装置-电源板
- DC1593A-D,具有 LTC2635 的演示板,具有内部基准的四路 12 位 I2C VOUT DAC
- DIY STC15F2K60S2用于设计
- 使用 Semtech 的 EZ1086C 的参考设计
- 基于L6920DB的高效同步整流升压转换器演示板
- LT8330ES6 4V 至 36V 输入、12V SEPIC 转换器的典型应用电路
- 基于ESP芯片制作物联网时钟
- 使用 ROHM Semiconductor 的 BD46411 的参考设计
- 具有欠压锁定功能的 LT3990EMSE 5V 降压转换器的典型应用
- 评论赢好礼|TI SK-AM64评估套件测评
- 逛村田在线云展厅,了解通信、移动、工业+环境、健康四大领域的应用干货!
- 福禄克明星款热像仪全新来袭,抢先免费体验赢好礼
- 2016 TI嵌入式产品研讨会全网首映,下载有好礼!
- 福禄克专家级热像仪震撼上市,参与问答赢精美好礼!
- 免费申请TI 样片,晒单赢好礼!
- 奉献九月,助人为快乐之本 贡献出你闲置的开发板、器件...
- 从终端到架构,TE Connectivity(TE)助你连接5G高速未来 看视频答题赢好礼!
- 福禄克首款热成像万用表Fluke-279FC等你来尝鲜!晒心得享好礼喽!
- 【评论有礼】大话CC2650,从资料到例程、从应用到生态全方位讲解!