1.29k likes | 1.52k Views
5.9 GPIO. (建议使用 Office2003 以上版本播放,将有更丰富的动画效果). 第 5 章 目录. 1. 简介 2. 引脚配置 3. 存储器寻址 4. 系统控制模块 5. 存储器加速模块 6. 外部存储器控制器 7. 引脚连接模块 8. 向量中断控制器 9.GPIO. 10.UART0 11.UART1 12.I 2 C 接口 13.SPI 接口 14. 定时器 0/1 15. 脉宽调制器( PWM ) 16.A/D 转换器 17. 实时时钟 18. 看门狗. 5.9 GPIO. 特性.
E N D
5.9 GPIO (建议使用Office2003以上版本播放,将有更丰富的动画效果)
第5章 目录 • 1.简介 • 2.引脚配置 • 3.存储器寻址 • 4.系统控制模块 • 5.存储器加速模块 • 6.外部存储器控制器 • 7.引脚连接模块 • 8. 向量中断控制器 • 9.GPIO • 10.UART0 • 11.UART1 • 12.I2C接口 • 13.SPI接口 • 14.定时器0/1 • 15.脉宽调制器(PWM) • 16.A/D转换器 • 17.实时时钟 • 18.看门狗
5.9 GPIO • 特性 • LPC2000系列作为 “微控制器”,其GPIO特性就显得很重要。它具有如下的特性: • 可以独立控制每个GPIO口的方向(输入/输出模式); • 可以独立设置每个GPIO的输出状态(高/低电平); • 所有GPIO口在复位后默认为输入状态(注意GPIO与引脚的概念区别)。
5.9 GPIO • 应用 驱动LED或其它指示器 检测数字输入,如键盘或开关信号 控制片外器件
5.9 GPIO • 引脚描述 LPC2114/2124微控制器具有两个端口——P0和P1,可以作为GPIO使用的引脚数为46个。 LPC2210/2212/2214微控制器还包含另外两个端口——P2和P3,这个两个端口与外部存储器总线复用,当它们全部作为GPIO使用时,GPIO引脚数多达112个。
IOxSET out 1 in 0 IOxDIR IOxCLR IOxPIN PINSELx 5.9 GPIO • 引脚描述 GPIO与控制寄存器的关系 引脚
IOxSET IOxSET out out 1 1 in in 0 0 IOxDIR IOxDIR IOxCLR IOxCLR IOxPIN IOxPIN PINSELx PINSELx • GPIO相关寄存器描述
IOxSET out 1 • GPIO相关寄存器描述——IOxPIN in 0 IOxDIR IOxCLR IOxPIN PINSELx 该寄存器反映了当前引脚的状态。IOxPIN中的x对应于某一个端口,如P1口对应于IO1PIN。所以芯片存在多少个端口,就有多少个IOxPIN分别与之对应。 写该寄存器会将值保存到输出寄存器,具体使用稍后介绍。 注意:无论引脚被设置为输入还是输出模式,都不影响引脚状态的读出。
IOxSET out 1 • GPIO相关寄存器描述——IOxDIR in 0 IOxDIR IOxCLR IOxPIN PINSELx 当引脚设置为GPIO输出模式时,可使用该寄存器控制引脚的方向。向某位写入1使对应引脚作为输出功能,写入0时作为输入功能。 作为输入功能时,引脚处于高阻态。
IOxSET out 1 • GPIO相关寄存器描述——IOxSET in 0 IOxDIR IOxCLR IOxPIN PINSELx 当引脚设置为GPIO输出模式时,可使用该寄存器从引脚输出高电平。向某位写入1使对应引脚输出高电平。写入0无效。 从该寄存器读回的数据为GPIO输出寄存器的值。该值不反映外部环境对引脚的影响。
IOxSET out 1 • GPIO相关寄存器描述——IOxCLR in 0 IOxDIR IOxCLR IOxPIN PINSELx 当引脚设置为GPIO输出模式时,可使用该寄存器从引脚输出低电平。向某位写入1使对应引脚输出低电平。写入0无效。 注意:读取该寄存器无效,不能读回输出寄存器的值。
5.9 GPIO • 使用GPIO注意要点 • 引脚设置为输出方式时,输出状态由IOxSET和IOxCLR中最后操作的寄存器决定; • 大部分GPIO输出为推挽方式(个别引脚为开漏输出),正常拉出/灌入电流均为4mA(短时间极限值40mA); • 复位后默认所有GPIO为输入模式。
(1) 设置引脚连接模块,P0.0为GPIO (2) 设置P0.0口方向,设置为输出 (3) 设置P0.0口状态,输出高电平 1 • GPIO应用示例——设置P0.0输出高电平 IO0SET out 1 in 0 P0.0 IO0DIR IO0CLR IO0PIN PINSEL0 C代码: ... PINSEL0 &= 0xFFFFFFFC; IO0DIR |= 0x00000001; IO0SET = 0x00000001; ...
(1) 设置引脚连接模块,P0.0为GPIO (2) 设置P0.0口方向,设置为输入 (3) 从IO0PIN读取引脚状态 • GPIO应用示例——读取P0.0引脚状态 IO0SET out 1 in 0 P0.0 IO0DIR IO0CLR IO0PIN IO0PIN PINSEL0 C代码: ... uint32 PinStat; PINSEL0 &= 0xFFFFFFFC; IO0DIR &= 0xFFFFFFFE; PinStat = IO0PIN; ...
(1) 设置引脚连接模块,P0.0~7为GPIO (2) 设置P0.0口方向,设置为输出 (3) 清零8位IO口的输出状态 (4) Data变量中为1的位将输出高电平 0x?? 0x00 Data • GPIO应用示例——输出多位数据至IO口 在需要将多位数据同时输出到某几个IO口线时,通常使用IOxSET和IOxCLR来实现,在某些情况下也可以使用IOxPIN寄存器实现。后者可以在多个IO口上直接输出0和1电平。 本例将8位无符号整数变量Data的值输出到P0.0~P0.7。 使用IOxSET和IOxCLR实现: #define DataBus 0xFF PINSEL0 &= 0xFFFF0000; IO0DIR |= DataBus; IO0CLR = DataBus; IO0SET = Data; ... 数据输出线:
(1) 设置引脚连接模块,P0.0为GPIO (2) 设置P0.0口方向,设置为输出 (3) 写IO0PIN,输出数据 0x?? 0x?? 0x00 Data Data 与前者对比: • GPIO应用示例——输出多位数据至IO口 在需要将多位数据同时输出到某几个IO口线时,通常使用IOxSET和IOxCLR来实现,在某些情况下也可以使用IOxPIN寄存器实现。后者可以在多个IO口上直接输出0和1电平。 本例将8位无符号整数变量Data的值输出到P0.0~P0.7。 使用IOxPIN实现: #define DataBus 0xFF PINSEL0 &= 0xFFFF0000; IO0DIR |= DataBus; IO0PIN = (IO0SET & 0xFFFFFF00) | Data; ... 数据输出线:
第5章 目录 • 1.简介 • 2.引脚配置 • 3.存储器寻址 • 4.系统控制模块 • 5.存储器加速模块 • 6.外部存储器控制器 • 7.引脚连接模块 • 8. 向量中断控制器 • 9.GPIO • 10.UART0 • 11.UART1 • 12.I2C接口 • 13.SPI接口 • 14.定时器0/1 • 15.脉宽调制器(PWM) • 16.A/D转换器 • 17.实时时钟 • 18.看门狗
5.10 UART0 • 特性 • LPC2000系列微控制器具有两个功能强大的UART,其中UART0具有如下的特性: • 16字节接收FIFO和16字节发送FIFO; • 寄存器位置符合16C550工业标准; • 接收FIFO触发点可设置为1、4、8或14字节; • 内置波特率发生器。
TxD0 TxD0 LPC2000 其它 通信设备 RxD0 RxD0 TxD0 TxD0 LPC2000 232 电平转换 PC机串口 RxD0 RxD0 • 使用UART0通信 使用UART0通信需要两个引脚,分别为: LPC2000的I/O电压为3.3V(可承受5V),连接时须注意电平的匹配。 与PC机相连时,由于PC机串口是RS232电平,所以连接时需要使用RS232转换器。
TxD0 U0IIR U0IER U0IER U0THR U0TSR U0LCR U0LCR U0LSR U0DLM U0DLM U0DLL U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR U0FCR • UART0内部结构示意图 中断使能 波特率设置 FIFO控制 UART0格式设置 1.在使用UART之前需要设置的寄存器
TxD0 U0IIR U0IER U0THR U0THR U0TSR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 VPB 接口 与CPU内核相连 U0FCR • UART0内部结构示意图 发送缓存 发送移位寄存器 CPU内核通过VPB接口对UART0的寄存器进行读写访问 2.发送数据的通道
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RBR U0RSR U0RSR VPB 接口 VPB 接口 与CPU内核相连 U0FCR • UART0内部结构示意图 接收缓存 接收移位寄存器 3.接收数据的通道
TxD0 U0IIR U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR • UART0内部结构示意图 中断标志 UART0当前状态 4.通信过程中可能影响的标志位
TxD0 TxD0 U0IIR U0IIR U0IER U0IER U0THR U0THR U0TSR U0TSR U0LCR U0LCR U0LSR U0LSR U0DLM U0DLM U0DLL U0DLL RxD0 RxD0 U0RBR U0RBR U0RSR U0RSR VPB 接口 VPB 接口 与CPU内核相连 与CPU内核相连 U0FCR U0FCR • UART0相关寄存器描述 ——接收缓存寄存器 U0RBR U0RSR移位寄存器从RxD0引脚接收的有效数据将被送到接收FIFO中。通过读取U0RBR寄存器可以将接收FIFO中最早接收到的字节读出,当FIFO中不再包含有效数据时,该寄存器反映接收到的最后一个有效字节数据。接收的数据不足8位时,高位用0填充。 注意: U0RBR只读。访问该寄存器时,U0LCR的除数锁存访问位(DLAB)必须为0。
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR • UART0相关寄存器描述 ——发送器保持寄存器 U0THR 写入该寄存器的值将是发送FIFO中的最高字节。访问该寄存器时,U0LCR的除数锁存访问位(DLAB)必须为0。 注意: U0THR只写。它的地址与U0RBR相同,通过读/写操作予以区分。
U0THR U0DLM U0DLL TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR • UART0相关寄存器描述 ——除数锁存寄存器 TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 这两个寄存器决定波特率时钟的频率,而波特率时钟必须是波特率的16倍。波特率计算公式如下: BaudRate = FPCLK / ([U0DLM,U0DLL]×16) 注意:由于U0DLL、U0DLM寄存器与其它寄存器的地址重叠,所以在访问它们时,U0LCR的除数锁存访问位(DLAB)必须为1。
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 • UART0相关寄存器描述 ——中断使能寄存器 U0IER U0IER可以控制UART0的4个中断源。其中RBR中断使能包括两个中断,一个是接收数据可用(RDA)中断,一个是接收超时中断(CTI)。稍后将对各中断源作详细介绍。
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 • UART0相关寄存器描述 ——中断标识寄存器 U0IIR U0IIR提供状态代码用于指示一个挂起中断的中断源和优先级。在访问U0IIR过程中,中断被冻结。如果在访问U0IIR时产生了中断,该中断将被记录,在下次访问U0IIR时可以读出,避免了中断的丢失。
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0IER bit2 bit1 bit0 ARM7TDMI 内核 VIC 中断控制器 • UART0相关寄存器描述 ——中断标识寄存器 U0IIR 中断源和中断使能的关系 RLS中断(U0IIR[3:1]=011) RDA中断(U0IIR[3:1]=010) CTI中断(U0IIR[3:1]=110) THRE中断(U0IIR[3:1]=001)
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0IER bit2 bit1 bit0 优先级 ARM7TDMI 内核 最高 VIC 中断控制器 第二 第二 第三 • UART0相关寄存器描述 ——中断标识寄存器 U0IIR 中断源和中断使能的关系 RLS中断 RDA中断 CTI中断 THRE中断
UART0相关寄存器描述 ——中断源说明 • RLS中断:该中断为最高优先级。它在UART0产生了四个错误条件(溢出错误(OE)、奇偶错误(PE)、帧错误(FE)和间隔中断(BI))中的任意一个时置位。通过查看U0LSR[4:1]可以了解到产生该中断的错误条件。读取U0LSR时清除该中断;
RxD0 U0RSR 16 15 14 U0IIR[0] 1 13 U0IIR[3:1] xxx 12 1 0 11 xxx 010 10 9 触发点设置=8 8 7 6 5 4 3 2 1 U0RBR 接收FIFO • UART0相关寄存器描述 ——中断源说明 • RDA中断:该中断与CTI中断并列为第二优先级。当接收的有效数据到达接收FIFO设置寄存器(U0FCR)中设置的触发点时,RDA被激活。当接收FIFO中的有效数据少于触发点时,RDA复位; DATA 1.移位寄存器(U0RSR)从RxD0引脚接收串行数据后,送入接收FIFO中; 2.当接收FIFO中的有效数据数量到达预定的触发点时,置位RDA中断; 3.从U0RBR寄存器中读取FIFO中最早到达的数据,当FIFO中的有效数据小于预定触发点时,清零RDA中断;
16 15 14 U0IIR[0] 1 13 U0IIR[3:1] xxx 12 0 1 11 xxx 110 10 9 8 7 6 5 4 3 2 1 • UART0相关寄存器描述 ——中断源说明 • CTI中断:该中断为第二优先级。当接收FIFO中的有效数据少于预定的触发点数量,但至少有一个字节时,如果超过接收3.5~4.5个字节所需要的时间仍没有接收到数据,那将触发该中断。对接收FIFO的任何操作都会清零该中断标志; RxD0 U0RSR DATA 1.移位寄存器(U0RSR)从RxD0引脚接收串行数据后,送入接收FIFO中; 2.当接收FIFO中的有效数据少于触发个数,但至少有一个时,如果长时间没有数据到达,将触发CTI中断; 触发点设置=8 3.从U0RBR中读取接收FIFO中的数据,或者有新的数据送入接收FIFO,都将清零CTI中断; U0RBR 接收FIFO
16 15 14 U0IIR[0] 1 13 U0IIR[3:1] xxx 12 0 1 11 xxx 110 10 9 8 7 6 5 4 3 2 1 • UART0相关寄存器描述 ——中断源说明 • CTI中断:该中断为第二优先级。当接收FIFO中的有效数据少于预定的触发点数量,但至少有一个字节时,如果超过接收3.5~4.5个字节所需要的时间仍没有接收到数据,那将触发该中断。对接收FIFO的任何操作都会清零该中断标志; RxD0 U0RSR DATA 说明:“3.5~4.5个字节的时间”,其意思是在串口当前的波特率下,发送3.5~4.5个字节所需要的时间; 注意:当接收FIFO中存在多个数据,从U0RBR读取数据,但是没有读完所有数据,那么在经过3.5~4.5个字节的时间后将触发CTI中断; 触发点设置=8 U0RBR 接收FIFO
U0RBR 16 15 14 U0IIR[0] 1 13 U0IIR[3:1] xxx 12 0 11 110 10 9 8 7 6 5 4 3 2 1 TxD0 U0TSR • UART0相关寄存器描述 ——中断源说明 • THRE中断:该中断为第三优先级。当发送FIFO为空并且满足一定的条件时,该中断将被触发。这些条件是: 1.系统启动时,虽然发送FIFO为空,但不会产生THRE中断。 2.在上一次发生THRE中断后,向发送FIFO中写入1个字节数据,将在延时一个字节加上一个停止位后发生THRE中断。 DATA 这是因为:如果发送移位寄存器为空,那么写入发送FIFO的数据将直接进入发送移位寄存器; 3.如果在发送FIFO中有过两个字节以上的数据,但是现在发送FIFO为空时,将立即触发THRE中断。 发送FIFO 此时发送FIFO仍然为空,如果立即产生THRE中断,就会影响紧接着要写入发送FIFO的数据; 当THRE中断为当前有效的最高优先级中断时,往U0THR写数据,或者对U0IIR的读操作,将使THRE中断复位。 所以在发送完该字节以及一个停止位后,才产生THRE中断; U0TSR
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR EnFIFO:FIFO使能。该位的任何变化都将清空UART0的FIFO。 1:使能UART0的接收和发送FIFO,并且允许访问U0FCR[7:1]。 0:禁止接收FIFO,此时接收缓存只有1个字节。而发送FIFO不会被关闭。 • UART0相关寄存器描述 ——FIFO控制寄存器 U0FCR U0FCR控制UART0接收和发送FIFO的操作。
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR 复位RxFIFO:接收FIFO复位。当该位置位时,UART0接收FIFO中的所有字节被清零并复位指针逻辑。 注意:该位会自动清零。 • UART0相关寄存器描述 ——FIFO控制寄存器 U0FCR
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR 复位TxFIFO:发送FIFO复位。当该位置位时,UART0发送FIFO中的所有字节被清零并复位指针逻辑。 注意:该位会自动清零。 • UART0相关寄存器描述 ——FIFO控制寄存器 U0FCR
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR —:这些位保留,用户程序不要向这些位写入1。 • UART0相关寄存器描述 ——FIFO控制寄存器 U0FCR
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR Rx触发点设置:通过设置这两位可以调整接收FIFO中触发RDA中断的有效字节数量。 00:触发点0(1字节); 01:触发点1(4字节); 10:触发点2(8字节); 11:触发点3(14字节); • UART0相关寄存器描述 ——FIFO控制寄存器 U0FCR
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL TxD0 U0IIR U0IER U0THR U0TSR D7 D6 D5 D4 D3 D2 D1 D0 U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 1 1 与CPU内核相连 U0FCR P 0 • UART0相关寄存器描述 ——线状态控制寄存器 U0LCR UART数据帧结构 停止位(1~2位) 奇偶校验位(可选) 数据(5~8位) 起始位 U0LCR寄存器: U0LCR控制发送和接收数据帧的格式。
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR 字长:这些位控制数据长度。 00:5位字符长度; 01:6位字符长度; 10:7位字符长度; 11:8位字符长度; • UART0相关寄存器描述 ——线状态控制寄存器 U0LCR
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR 停止位:控制每帧数据包含的停止位个数。 0:1个停止位; 1:2个停止位; • UART0相关寄存器描述 ——线状态控制寄存器 U0LCR
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR 奇偶使能:控制是否进行奇偶校验。如果使能,发送时将添加一位校验位。 0:禁止奇偶产生和校验; 1:使能奇偶产生和校验; 奇偶选择:设置奇偶校验类型。 00:奇数(数据位+校验位=奇数); 01:偶数(数据位+校验位=偶数); 10:校验位强制为1;11:校验位强制为0; • UART0相关寄存器描述 ——线状态控制寄存器 U0LCR
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR 间隔:当该位为1时,输出引脚(TxD0)强制为逻辑0,可以引起通信对方(LPC2000)产生间隔中断。在某些通信方式中,使用间隔中断作为通信的起始信号(如:LIN Bus)。 0:禁止间隔发送; 1:使能间隔发送; • UART0相关寄存器描述 ——线状态控制寄存器 U0LCR
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR 除数锁存:因为U0DLL和U0RBR/U0THR的地址重叠,通过设置该位可以指定其中某个寄存器操作。 0:禁止访问除数锁存寄存器; 1:使能访问除数锁存寄存器; • UART0相关寄存器描述 ——线状态控制寄存器 U0LCR
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR RDR:接收数据就绪。判断该位是否置一,决定能否从FIFO中读取数据。 0:U0RBR为空; 1:U0RBR中包含有效数据。从接收FIFO中读走所有数据后,恢复为0。 • UART0相关寄存器描述 ——线状态寄存器 U0LSR U0LSR为只读寄存器,它反映了UART0接收和发送模块的状态信息。
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR OE:溢出错误标志。当U0RBR寄存器中已经有新的字符就绪,而接收FIFO已满时,该位置位。 0:接收缓存区没有溢出; 1:接收缓存区发生溢出错误。 • UART0相关寄存器描述 ——线状态寄存器 U0LSR
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR PE:奇偶校验错误。在使能奇偶校验位之后,对所有接收的数据都进行奇偶校验,如果与U0LCR中的设置不符,将引起奇偶校验错误。 0:没有发生奇偶校验错误; 1:发生奇偶校验错误。读操作使该位恢复为0。 • UART0相关寄存器描述 ——线状态寄存器 U0LSR
TxD0 U0IIR U0IER U0THR U0TSR U0LCR U0LSR U0DLM U0DLL RxD0 U0RBR U0RSR VPB 接口 与CPU内核相连 U0FCR FE:帧错误标志。当接收字符的停止位为0时,产生帧错误。 0:没有发生帧错误; 1:发生帧错误。读取该位时恢复为0。 • UART0相关寄存器描述 ——线状态寄存器 U0LSR