NXP LPC54110使用体验3:GPIO寄存器介绍 Mabel_7b8(QQ:724419756) 第一部分:GPIO相关寄存器及介绍 自然,在进行写代码控制LED灯亮灭之前,我们首先要做的是了解一下LPC54110芯片的GPIO的基本情况,本篇文章主要是根据NXP LPC54110的用户手册来写的(大多数是直接翻译的),由于该手册是英文版的,理解肯定存在不正确的地方,希望大家指出一起学习。 LPC54110有两组GPIO组,GPIO 0和GPIO 1,每组有32个GPIO引脚,GPIO0_0 - GPIO[0_31,GPIO1_0 - GPIO1_31; 在使用GPIO引脚之前,我们需要将使能GPIO端口的时钟(在第二部分介绍),可通过设置 AHBCLKCTRL0寄存器实现; LPC54110寄存器的特性: 1:每个GPIO引脚都可配置为输入引脚或者输出引脚 2:所有的GPIO引脚默认时都为输入引脚,并且禁止中断; 3:可通过Pin寄存器来感知或者设置引脚状态; 4:可通过设置或者清除对应寄存器来控制引脚的方向(输入或者输出); 我们知道,操作开发板就是操作这些开发板的对应寄存器来实现相应的操作;下面我们先介绍一些GPIO 相关的寄存器; 在LPC54114_cm4.h这个头文件有一部分主要介绍了GPIO结构体的定义,首先#define GPIO_BASE (0x4008C000u)这句代码表明GPIO的基地址是0x4008C000u,依据是LPC54110的芯片数据手册中的 Main memory map可以看出,High Speed GPIO占Flash空间的0x4008C000u - 0x4008FFFF, 共占0x4000个字节; 根据《LPC5411x User manual》这个用户手册的11章节LPC5411x General Purpose I/O (GPIO),我们知道,GPIO的相关寄存器有以下这些: GPIO的结构体成员就是根据这个内容进行定义的,我们可以参考LPC54114_cm4.h文档中的GPIO_TYPE结构体的内容;其中值得注意的是各个寄存器的偏移量;下图是我根据数据手册自己算的结果,从excel表格中截图的。 我们需要清楚的了解到每个寄存器的作用,在我们进行配置时方知如何下手; B寄存器(GPIO port byte pin registers):每个GPIO引脚都有对应1个字节寄存器,可通过读写单字节访问单独的GPIO引脚的状态;也通过读写半字(2字节)来访问两个GPIO引脚的状态;通过读写字(四字节)来访问四个GPIO引脚的状态; 每个引脚的对应的1字节B寄存器只使用了bit[0],bit[1-7]保留; 当进行读操作时,当该GPIO引脚为低电平时读结果为0,当该GPIO引脚为高电平时读结果为0xFF; 当进行写操作时,写0表示清除输出位,写0x01-0xFF中的任何一个值表示设置输出位; 可是我不明白的一点是,保留位bit[1-7]在进行读操作时为0,那么为什么当GPIO引脚为高电平的时候读的结果是0xFF而不是0x01呢? W寄存器(GPIO port word pin register):每个GPIO引脚都有一个字空间的寄存器; 不管是进行字节访问、半字访问还是字访问,当该引脚为低电平时,读的结果都是0x0000 0000;当该引脚为高电平时,读的结果为0xFFFF FFFF; 当进行写操作时,当写值为0x0000 0000时会清除输出位;当写值为0x0000 0001 - 0xFFFF FFFF范围内的任何一个数的时候,都表示设置输出位为该值; DIR 寄存器(GPIO direction port register):在DIR寄存器中每个GPIO引脚都有一个用来配置该引脚为输入或输出的位空间(bit 0 = PIOn_0, bit 1 = PIOn_1,依此类推);当DIR寄存器对应的某GPIO引脚位设置为0时表示输入模式,设置为1表示输出模式; MASK寄存器(GPIO port mask register):这个寄存器的值影响MPORT寄存器的读写操作,当该寄存器的对应位值为0时,那么使能MPORT寄存器的对应GPIO的读写操作;当该寄存器的对应位值为1时,禁止写MPORT寄存器,且读MPORT寄存器的结果都会强制为0; PIN寄存器(GPIO port pin register):读取这个寄存器时会返回引脚的当前状态;写这个寄存器时忽视Mask register,加载该值到对应引脚的输出位; MPIN寄存器(GPIO masked port pin register): 这些寄存器与PORT寄存器(PIN寄存器中的每一位标志为PORT)类似,除了读取该寄存器的值是经过和MASK寄存器的反向值进行位与之后的结果;写这些寄存器只对输出位起作用,通过写0到这些寄存器的对应位; SET寄存器(GPIO port set registers):可以通过写该寄存器的值为1来设置输出位(不在乎MASK寄存器的值的影响);读取这个寄存器的值可以得到输出位的状态(不在乎引脚的方向); CLR寄存器(GPIO port clear registers):这是只写寄存器,可通过写1来清除对应引脚的输出位(忽略MASK寄存器); NOT寄存器(GPIO port toggle registers):这是只写寄存器,可通过写1到对应位来设置输出位的切换、反转、补全(忽略MASK寄存器的值的影响); DIRSET寄存器(GPIO port direction set registers):可通过写1到这个寄存器的对应位来设置引脚的方向; DIRCLR寄存器(GPIO port direction clear register):只写寄存器,可通过写1到对应位来清除方向位; DIRNOT寄存器(GPIO port direction toggle register):只写寄存器,可通过写1到对应位来设置方向位; 功能性描述: 读引脚状态: 可通过软件程序来读取所有GPIO引脚的状态除了那些配置为模拟输入输出的IO配置逻辑。读取引脚的状态有以下4中方法: 1:若是读取单个引脚的状态那么可以读取其对应的B寄存器字节的bit[7]位; 2:若是读取单个引脚的状态,也可以通过字节、半字、字的方式读取其对应的W寄存器的值; 3:若是想读取同个端口的几个引脚的状态值那么可以通过字节、半字、字的方式读取(PIN)PORT寄存器; 4:若是想读取同个端口的多个子引脚状态,你可以读取MPORT寄存器,但是有个前提是,对应的MASK寄存器的值必须为0。 GPIO输出: 每个GPIO引脚在GPIO块中都有一个输出位,对GPIO引脚进行写操作就是对这个输出位进行操作,驱动这个输出位必须满足以下两个条件: 1:必须通过IOCON寄存器(第三部分详述)来选择引脚操作; 2:必须将对应引脚的DIR寄存器配置为1(输出); 如果以上两个条件有任何一个不满足,那么写引脚操作将会无效; 有以下7种方法修改GPIO的输出位: 1:通过写GPIO引脚对应的B寄存器的bit[7]位; 2:写GPIO引脚对应的W寄存器的值将其加载到输出位中; 3:写PORT寄存器可对所有的GPIO引脚的输出位进行更改; 4:写MPORT寄存器也可对所有的GPIO引脚的输出位进行更改,但是MASK寄存器的对应位必须为0; 5:可通过写1到SET寄存器来设置输出位; 6:可通过写1到CLR寄存器来清除输出位; 7:可通过写1到NOT寄存器来触发、完善、反转输出位; 一个端口的输出位可通过SET寄存器来读。上面读寄存器状态的方法都是不在乎引脚的方向、可选功能的。 Masked I/O: MASK寄存器定义了能够访问MPORT寄存器中的引脚,当MASK中某位为0时表示能够访问MPORT寄存器的值;若该值为1表示不能够访问MPORT寄存器的值,读MPORT时其值会被强制为0,写MPORT时其输出位不会受影响。当MASK寄存器的值为全0时表示PORT和MPORT寄存器都能被等同的读写操作。 中断程序、任务间切换可导致Masked GPIO操作,必须将MASK寄存器作为一个保护、限制区域,当中断禁止之后可以用信号来终止它; GPIO方向: 每个GPIO引脚可以配置DIR寄存器为输入或输出的方向,GPIO引脚的方向可通过DIRSET、DIRCLR、DIRNOT寄存器来设置、清除、触发; 推荐操作: 以下是一些推荐使用GPIO操作的方法: 1:在重置或初始化时为了初始化配置,通过写PORT寄存器; 2:为了更改一个引脚的状态,可通过写B寄存器或W寄存器; 3:为了一次更改多个引脚的状态,可写SET寄存器或CLR寄存器; 4:在一个严格控制的条件下,为了更改多个引脚的状态,最好通过NOT寄存器,因为这比3方法中执行更少的写操作; 5:读一个引脚的状态,可读B寄存器、W寄存器; 6:在基于多引脚操作的基础上,读取、屏蔽PORT寄存器; 本来打算这一章节说完点亮LED灯的操作的,但是个人觉得要在介绍完SYSCON和IOCON之后再进行点亮LED灯操作较好,这节主要是GPIO的相关寄存器操作。
|