收藏 分享(赏)

嵌入式实训指导书new.doc

上传人:dzzj200808 文档编号:2249398 上传时间:2018-09-07 格式:DOC 页数:62 大小:1.62MB
下载 相关 举报
嵌入式实训指导书new.doc_第1页
第1页 / 共62页
嵌入式实训指导书new.doc_第2页
第2页 / 共62页
嵌入式实训指导书new.doc_第3页
第3页 / 共62页
嵌入式实训指导书new.doc_第4页
第4页 / 共62页
嵌入式实训指导书new.doc_第5页
第5页 / 共62页
点击查看更多>>
资源描述

1、嵌入式系统实训交通信息学院 电子系 编广东交通职业技术学院 二一一年一月实训要求一、实训目的 1嵌入式系统是一门理论性很强的课程,经过原来理论课程的学习,学生已经对相关的理论知识掌握了到了一定的程度。实训环节是对课程理论的巩固,也是学生掌握课程核心内容的一种有效途径和方式,通过实训可以使学生掌握电子产品的设计流程、设计方法和相关的概念。课程设计应强调以能力培养为主,在独立完成设计任务同时注意多方面能力的培养与提高,主要包括以下方面:1. 独立工作能力和创造力。2. 综合运用专业及基础知识,解决实际工程技术问题的能力。3. 查阅图书资料、产品手册和各种工具书的能力。4. 使用 Protel 等

2、EDA 工具进行单片机硬件系统设计的能力。5. 基于 ADS1.2 开发 LPC21XX 系列处理器应用程序的能力6. 写技术报告和编制技术资料的能力。二、内容及要求 基于 LPC21XX 系列处理器实现对 LED 亮度的控制系统,该系统可通过多种方法进行 LED 亮度的控制。三、时间、地点安排 地点:EDA 实验室、电子制作室 四、组织管理 教师组织抽查、考勤五、学生分组 2 人 1 组。六、考核评估 通过总结报告,并结合学生的动手能力,独立分析解决问题的能力和创新精神,及学习态度综合考评。成绩分优、良、及格和不及格四等。考核标准包括:实训报告 (30%) 学生的动手能力 (60%)考勤 (

3、10%)23项目 LED 亮度控制系统基于 LPC21XX 单片机构成一个控制系统,如图 1 所示。图 1 LED 亮度系统实现的功能要求:1、实现 LPC21XX 最小系统的编程和控制 50 分2、实现 LED 亮度的简单控制 15 分3、能根据周围环境的灯光亮度实现 LED 亮度的自动调节 15 分4、通过键盘设定 LED 的亮度 5 分5、通过 PC 机设置 LED 的亮度 5 分6、其他功能 10 分4第一阶段 GPIO 的控制一、实训目的1、掌握寄存器的使用2、使用 GPIO 的控制方法点亮和熄灭 LED二、实训内容控制 LED 的点亮,点亮 L4,L6 ,熄灭 L5、L7。三、实训

4、设备一组设备为:序号 名称 数量 备注1 普通 PC 12 嵌入式系统实验板 1四、实训报告要求按指导老师的要求完成:(1)实训作业,即设计图纸。(2)实训心得。五、参考知识所谓GPIO,即通用I/O 口( General Purpose I/O ports),可理解为即可作为输入又可以作为输出的接口。与单片机一样,LPC213X 也具备一定数量的GPIO,LPC213X具有多达 47个GPIO,分为2组,分 别为P0 、P1。每组GPIO 的数量不尽相同,其中P0口可最多有30 个GPIO接口,P1口也有17个GPIO,P0和P1口同时又与内部的一些模块共用。5.1 引脚描述LPC213X的

5、引脚 结构如图 5-1所示5图5-1 LPC213X引脚结 构如图5-1所示,由于LPC213X的引脚与其它功能复用,比如P0.0引脚,即有GPIO的功能,同时也具有串口0发送功能,但是一个时间只能选择GPIO和串口发送功能的一种,而不能同 时具备两种功能。 这些功能的选择是通过管脚连接模块(Pin Connect Block)来实现的,管脚连接模块通过配置寄存器控制多路开关来连接管脚与片内外设。5.2 管脚连接模 块管脚连接模块的用途是将管脚配置为需要的功能,可实现独立的管脚配置。外设在激活和任何相关中断使能之前必须连接到适当的管脚,任何使能的外设功能如果没有映射到相关的管脚,则被认为是无效

6、的。LPC213X的管脚框 图示例如 图5-2 所示。G P I OT x D 0P W M 1P 0 . 0P I N S E L x图5-2 管脚框图示例5.3 管脚连接模 块相关寄存器管脚连接模块是通过PINSEL0、PINSEL1 和PINSEL2寄存器来控制的,芯片复位时这三个寄存器会自动设置为默认值,所以复位后芯片引脚的功能是确6定的。当管脚选择一个功能时,其它功能无效。上述规则唯一的例外是管脚用作A/D 转换器输入时。不论管脚选择何种功能,它都仍可用作A/D 输入, A/D 输入可随时被读取,管脚的电压变化都从A/D 的读取值中反映出来。但是,只有选择模拟输入功能,才能读出有效的

7、模拟值。也只有这种情况下,管脚和 A/D模块之间的接口电路才有效。其它情况下,执行数字功能所必需的数字逻辑部分将有效,从而影响A/D 转换器的正确操作。通用名称 描述 访问类型 复位值PINSEL0 P0.0-P0.15管脚 连接模块控制 读/ 写 0x0000 0000PINSEL1 P0.16-P0.31管脚连接模块控制 读/ 写 0x1540 0000PINSEL2 P1、P3管脚连接模块控制 读/ 写 不定表5-1 管脚连接控制模块的寄存器5.3.1 PINSEL0寄存器PINSEL0寄存器控制的是P0.0-P0.15 管脚所连接的模 块,如表2-2所示。PINSEL0 管脚名称 00

8、 01 10 11 复位值1:0 P0.0 GPIO P0.0 TxD0 PWM1 保留 003:2 P0.1 GPIO P0.1 RxD0 PWM3 EINT0 005:4 P0.2 GPIO P0.2 SCL 捕获 0.0 保留 007:6 P0.3 GPIO P0.3 SDA 匹配 0.0 EINT1 009:8 P0.4 GPIO P0.4 SCK0 捕获 0.1 保留 0011:10 P0.5 GPIO P0.5 MISO0 匹配 0.1 保留 0013:12 P0.6 GPIO P0.6 MOSI0 捕获 0.2 保留 0015:14 P0.7 GPIO P0.7 SSEL0 PW

9、M2 EINT2 0017:16 P0.8 GPIO P0.8 TxD1 PWM4 保留 0019:18 P0.9 GPIO P0.9 RxD1 PWM6 EINT3 0021:20 P0.10 GPIO P0.10 RTS 捕获 1.0 保留 00723:22 P0.11 GPIO P0.11 CTS 捕获 1.1 保留 0025:24 P0.12 GPIO P0.12 DSR 匹配 1.0 保留 0027:26 P0.13 GPIO P0.13 DTR 匹配 1.1 保留 0029:28 P0.14 GPIO P0.14 CD EINT1 保留 00PINSEL0 管脚名称 00 01 1

10、0 11 复位值31:30 P0.15 GPIO P0.15 RI EINT2 保留 00表5-2 PINSEL0寄存器控制其中第一列指的是 PINSEL0对应的位,第二列是被控制管脚的名称,第三列是当 PINSEL0对应的位取 值为”00” 时该管脚对应 的功能,第四列是当PINSEL0对应 的位取值为 ”01”时对应的功能,第五列是当 PINSEL0对应的位取值为”10”时对应的功能,第六列是当 PINSEL0对应的位取值为”11”时对应的功能,第七列是该位在复位 时候的值。如管脚 P0.9,从表 5.2可以 查出它的控制位为 PINSEL0的第 18和 19两位,当 CPU复位时,该两位

11、是复位 值”00” ,从表 3.2的第三列可以看出,当这两位为”00”时,P0.9 连接的是 GPIO模块,此时作为 GPIO。当我 们要把 P0.9作为串口输入引脚 RxD使用 时,从表 3.2可以查到,此时需要将 PINSEL0的第 18和 19为设置”01” ,即第十八位为 0,第十九位 为 1,这样设置后,P0.9管脚即连接到了串口输出模块上,作为 RxD引脚使用。5.3.2 PINSEL1寄存器PINSEL1寄存器控制的是 P0.16-P0.31的管脚连接模块,如表 2-3所示。PINSEL1 管脚名称 00 01 10 11 复位值1:0 P0.16 GPIO P0.16 EINT

12、1 匹配 0.2 保留 0083:2 P0.17 GPIO P0.17 捕获 1.2 SCK1 匹配 1.2 005:4 P0.18 GPIO P0.18 捕获 1.3 MISO1 匹配 1.3 007:6 P0.19 GPIO P0.19 匹配 1.2 MOSI1 匹配 1.3 009:8 P0.20 GPIO P0.20 匹配 1.3 SSEL1 EINT3 0011:10 P0.21 GPIO P0.21 PWM5 保留 捕获 1.3 0013:12 P0.22 GPIO P0.22 保留 捕获 0.0 匹配 0.0 0015:14 P0.23 GPIO P0.23 保留 保留 保留 0

13、0PINSEL1 管脚名称 00 01 10 11 复位值17:16 P0.24 GPIO P0.24 保留 保留 保留 0019:18 P0.25 GPIO P0.25 保留 保留 保留 0021:20 P0.26 保留 0023:22 P0.27 GPIO P0.27 AIN0 捕获 0.1 匹配 0.1 0025:24 P0.28 GPIO P0.28 AIN1 捕获 0.2 匹配 0.2 0027:26 P0.29 GPIO P0.29 AIN2 捕获 0.3 匹配 0.3 0029:28 P0.30 GPIO P0.30 AIN3 EINT3 捕获 0.0 0031:30 P0.31

14、 保留 00表 5-3 PINSEL1寄存器PINSEL1寄存器各个位段的含义与 PINSEL0相近,具体内容可以参考PINSEL0的内容。5.3.4 PINSEL2寄存器PINSEL2寄存器控制 类 LPC213X所有的其他管脚的 连接模块。如表 2-4所示。警告:请使用“ 读修改写 ”的方法来访问 PINSEL2 寄存器。 对位 02 和/或位 3的意外写操作会造成 调试和/或跟踪功能的丢失!9PINSEL2 描述 复位值1:0 保留 002 该位为 0 时 ,P1.36:26 用作 GPIO。该位为 1 时,P1.31:26 用作一个 调试端口。 P1.26/RTCK3 该位为 0 时

15、,P1:25:16 用作 GPIO。该位为 1 时,P1.25:16 用作一个跟踪端口。 P1.205:4控制数据总线和选通管脚的使用:管脚 P2.7:0 11=P2.7:0 0x 或 10D7:0管脚 P1.0 11=P1.00x 或 10CS0管脚 P1.1 11=P1.10x 或 10OE管脚 P3.31 11=P3.310x 或 10BLS0管脚 P2.15:8 00 或 11P2.15:8 01 或 10D15:8管脚 P3.30 00 或 11P3.3001 或 10BLS1管脚 P2.27:16 0x 或 11P2.27:16 10=D27:16管脚 P2.29:28 0x 或

16、11P2.29:28 10=D29:28管脚 P2.31:30 0x或 11P2.31:30 或 AIN5:4 10=D31:30管脚 P3.29:28 0x 或 11P3.29:28 或 AIN6:7 10=BLS2:3BOOT1:06 如果位 5:4 不为 10,由该位控制 P3.29 脚的使用:为 0 时使能 P3.29,为 1 时使能 AIN6。 17 如果位 5:4 不为 10,由该位控制 P3.28 脚的使用:为 0 时使能 P3.28,为 1 时使能 AIN7。 18 该位控制 P3.27 脚的使用: 为 0 时使能 P3.27,为 1 时使能 WE。 010:9 保留 0011

17、 该位控制 P3.26 脚的使用: 为 0 时使能 P3.26,为 1 时使能 CS1。 012 保留 013 如果位 27:25 不为 111,由该位控制 P3.23/A23/XCLK 脚的使用:为 0时使能 P3.23,为 1 时使能 XCLK。 015:14 控制 P3.25 脚的使用:00 使能 P3.25,01 使能 CS2,10 和 11 保留。 001017:16 控制 P3.24 脚的使用:00 使能 P3.24,01 使能 CS3,10 和 11 保留。 0019:18 保留 0020 如果位 5:4 不为 10,由该位控制 P2.29:28 的使用:0 使能 P2.29:2

18、8,1保留。 021 如果位 5:4 不为 10,由该位控制 P2.30 的使用:0 使能P2.30,1 使能 AIN4 122 如果位 5:4 不为 10,由该位控制 P2.31 的使用:0 使能P2.31,1 使能 AIN5。 123 控制 P3.0/A0 用作端口管脚(0 )或地址线(1)。如果 RESET 0时BOOT1:0=00,该位的复位值为1。反之 为 0。24 控制 P3.1/A1 用作端口管脚(0 )或地址线(1)。27:25控制 P3.23/A23/XCLK 和 P3.22:2/A2.22:2 中地址线的数目:000无地址线 100A11:2 为地址线001A3:2 为 地

19、址线 101A15:2 为地址线010A5:2 为 地址线 110A19:2 为地址线011A7:2 为 地址线 111A23:2 为地址线如果复位时BOOT1:0=11,该域的复位值为000。反之为111。31:28 保留表 5-4 PINSEL25.4 管脚连接模 块的使用在使用任何一个管脚之前,都应该按照管脚的实际功能设置相关的管脚连接控制寄存器,在没有设置之前就直接进行管脚的操作,有可能导致意外事件的发生。关键连接模块的使用非常简单,只需要根据实际需要设置相关的控制寄存器即可。比如 P0.0 口,它可以作为 GPIO(General Purpose I/O ports)功能,可以作为

20、UART0的 TxD0,还可以作脉宽调制器输出 PWM1。1、 设置 P0.0 为 GPIO 功能假如 P0.0连接的是 LED、按 键等需要直接使用 IO口控制的元器件,那么11就应该把该管脚设置成 GPIO功能。 经过查询 PINSELx的功能表格可知,控制 P0.0管脚的功能使用的是 PINSEL0寄存器,而且只有当 PINSEL0寄存器的第一位和第零位为”00”的使用 P0.0才为 GPIO功能。要在不改变其他管脚连接模块的条件下设置该管脚连接 GPIO,可以使用下面的语句:PINSEL0 = PINSEL0 2、 设置 P0.0 为 TxD0 功能如果 P0.0连接的是串口,那么在使

21、用串口之前,就需要把管脚 P0.0连接到 TxD0功能上,经过查询 PINSELx功能表格,可知要把 P0.0连接到TxD0功能上,需要将 PINSEL0的第一位和第零位设置成”01”才可以。要在不改变其他管脚连接功能的基础上设置管脚 P0.0连接到 TxD0上,可以使用下面的语句:PINSEL0 = (PINSEL0 3、 将 P0.8、P0.9 设 置为 TxD1、RxD1 功能要把 P0.8和 P0.9连接到 RxD1和 RxD1上,经过查表,可知要设置PINSEL0的第 15位和第 16位为”01” ,第 18位和第 19位为”01”才可。所以可以使用下面的语句:PINSEL0 = 0

22、x00050000; (1)或 PINSEL0 = 0x05 16; (2)程序(1)和(2)的作用是一 样的,但是程序(2)方法更直观简单。但是以上两种方法都会改变其他管脚的连接模块,要想不改变其他管脚的连接情况,最好使用下面的程序:PINSEL0 = ( PINSEL0 125.5 寄存器描述当管脚选择GPIO功能时,有4个对应的寄存器用于控制GPIO 的使用,IOxDIR、IOxSET、IOxCLR 和IOxPIN(注意:本书 中x 为对应的组编号,比如P0组, 则x=0,对应的寄存器则为IO0SET,IO0CLR,IO0PIN )。IOxDIR用于控制GPIO的输入/ 输出方向选择;I

23、OxSET 用于置1操作,读回IOSET则反映当前IO 口设定状态;而IOxCLR 则用于清零操作;IOxPIN 则反映当前IO 口的状态。通用名称 描述 访问类型 复位值IOxPINGPIO引脚 值寄存器,不管方向模式如何,引脚的当前状态都可以从该寄存器中读出只读 NAIOxSETGPIO输 出置位寄存器。该寄存器控制引脚输出高电平读 /置位 0x0000 0000IOxCLRGPIO输 出置位寄存器。该寄存器控制引脚输出低电平只读 0x0000 0000IOxDIRGPIO方向控制寄存器。该寄存器单独控制每个IO口的方向读 /写 0x0000 0000表 5-5 GPIO的寄存器5.5.1

24、 IOxPIN:GPIO引脚值寄存器IOxPIN 寄存器反映的是 GPIO引脚的实际电平值,它反映了外部环境对引脚的影响,但不能反映非 GPIO配置引脚的活动 ,因此不能使用 IOxPIN 寄存器来监控非 GPIO 配置引脚,即如果当前引脚功能不是 GPIO,则 IOxPIN反映的并不是当前引脚的实际电平值。IOxPIN 描述 复位值31:0 GPIO引脚。 IOxPIN0对应于 Px.0 ,IOxPIN1对应于 未定义13Px.1 IOxPIN31对应于 Px.31引脚表 5-6 GPIO引脚值寄存器5.5.2 IOxSET:GPIO输出置位寄存器当管脚配置为 GPIO 输出模式时,可使用该

25、寄存器从管脚输出高电平。在对应的位写入 1 使对应管脚 输出高电平,写入 0 无效,如在 IO0SET的第 1位写入 1,即 IO0SET = 0x02,则将 P0.1置为高电平。IOxSET 描述 复位值31:0输出置位。IOxSET0对应于 Px.0 IOxPIN31对应于 Px.31引脚未定义表 5-7 GPIO置位寄存器如果一个管脚被配置为输入或第二功能,写 IOSET 无效。读 IOSET 寄存器返回 GPIO 输出寄存器中的值。 该值由前一次对 IOSET 和 IOCLR(或IOPIN)的写操作决定, 不反映任何外部环境对管脚的影响。注意这种情况,假定当前 P0.01,且 IO0S

26、ET = 0x01,现在要将 P0.1 也拉高,以下语句是等价的:IO0SET = 0x02;或 IO0SET = 0x03;或 IO0SET |= 0x02;注意 IO0SET = 0x02虽 然把第 0位置零,但是并不会影响 P0.0的电平,因为对 IOxSET写入 0是无效的,只有写入 1才有影响。其实这是一种普遍情况:当往某个寄存器只有写入特定逻辑值才有效,而写入反逻辑的值无效时(如只有写入 1 有效而写入 0 无效,或者至于写入 0 有效而写入 1 无效),只操作其中某一位或者某些位时 ,可以不必关心其它位的状态,14即不必读回原来的值,进行与或操作后进行回写。一般情况下,有这种特性

27、的寄存器,均会有置位和清零寄存器成对出现,如IOxSET 和 IOxCLR。对于 ARM系列处理器的其他寄存器的操作也有类似的情况,所以在理解一个寄存器的使用时,一定要弄清楚他的逻辑值的实际影响。5.5.3 IOxCLR:GPIO输出清零寄存器当管脚配置为 GPIO 输出模式时,可使用该寄存器从管脚输出低电平。写入 1 使 对应 管脚输出低电平并清零 IOSET 寄存器中相 应的位,写入 0 无效。如在 IO0CLR的第 1位写入 1,即 IO0CLR = 0x02,则将 P0.1引脚设置为低电平,同 时清除 IO0SET的第一位。如果一个管脚被配置为输入或第二功能,写 IOCLR 无效。IO

28、xCLR 描述 复位值31:0输出清零。IOxCLR0对应于 Px.0 IOxCLR31对应于 Px.31引脚未定义表 2-8 GPIO清零寄存器5.5.4 IOxDIR:GPIO方向寄存器当管脚配置为 GPIO 模式时,可使用 该寄存器控制管的方向,写入 0,对应的管家方向为输入,写入 1则为输出。只有当管脚选择 GPIO 时,IODIR 设置才有意义。当 GPIO用作输入时,可吸收最大 10mA的电流;当 GPIO作为输出引脚时,可对外提供最大 10mA的 电流。IOxDIR 描述 复位值1531:0方向控制位。IOxDIR0对应于 Px.0 IOxDIR31对应于 Px.31引脚未定义表

29、 5-9 GPIO方向寄存器5.6 GPIO的应用作为通用 IO口,LPC213X 的 GPIO经常用于驱动 LED 或其它指示器、控制片外器件和检测数字输入。具体来说可以分成两种,一种是电流型应用,吸收或者驱动电流,这类应用产 生的电流较大,典型的是驱动 LED;另外一种是信号型应用,用于检测外部设备 的状态或应用于设备间的通信,这类应用一般产生的电流极小,典型的应用是检测 按键的状态。5.6.1 电流型应用这类应用主要是驱动需要一定的电流才能产生动作的外设,比如 LED。电路如图 5-3所示。V D DP 0 . 2L P C 2 2 1 4R 1 D 1图 5-3 灌电流驱动 LED接在

30、 LED 和端口 P0.2 之间的电阻 R1 称为限流 电阻,用来防止 电流过大而损坏 LED或者 LPC213X。限流 电阻阻值计算,需要结合 LED 的特性和LPC2131 端口特性(参考各自数据手册的 DC特性部分)。当 LED 内流过 10mA 电流时,两端压降大约 1.7V;而 LPC213X 普通 IO 口推荐的输出/ 吸入电流为4mA。由此,R 的阻值可以这样计算:16LED-U3.-17=40IOR电 源 压 降口 推 荐 电 流为了保护 LED和 LPC213X,限流 电阻的阻值取值 比较保守,一般会 1.5倍的计算值。5.6.2 信号型应用这类应用主要作用是检测 IO口的状

31、态,典型 应用是读取按键是否按下,电路如图 5-4所示。P 0 . 2L P C 2 2 1 4R 1V D DS 1图 5-4 按键检测这类应用不存在着电流驱动,检测的是电压信号,如果按键没有按下,因 为上拉电阻 R1的缘故,P0.2 呈现高电平状态, 读取回来的状 态为 1。当按键按下时,由于 P0.2直接接地,所以 为低电平状态, 读回来的状态为 0。信号型应用电阻 R1与电 流型应用中的电阻 R1的作用是不同的,在电流型中,电阻起限流保护作用,而信号型用中, 电阻起上拉作用,目的是给 IO口一个稳定的状态。此时,电阻的取值与工作环境有关,如果工作环境电噪声较大,则需要用小阻值的电阻,这

32、种方法叫做强上拉;如果工作环境电噪声较小,则可以使用阻值较小的电阻,叫做弱上拉。作为上拉电阻,一般可以取典型值 46K之间的阻值。175.7 使用方法将管脚用作 GPIO,需要先通过设置(PINSELx)将管脚连接到 GPIO,然后再根据应用的实际使用方向设置(IOxDIR)为对应的输入/输出。如果 GPIO用作输出, 则通过操作 IOxSET和 IOxCLR两个寄存器来进行置位和清零操作;如果 GPIO用过输入口,则通过读取 IOxPIN的值来 读取 IO口的实际状态。如图2-5所示。设 置 P I N S E L x将 引 脚 连 接 到 G P I O根 据 需 要 的 操 作 方 向设

33、 置 I O x D I RI O x S E T : 置 位I O x C L R : 清 零I O x P I N : 同 步 置 位 清 零I O x P I N : 读 取 状 态输 出 输 入图 5-5 GPIO的使用例程 1:在 P0.0输出低电平PINSEL0 = 0x00000000;/设置 P0.0连接到 GPIO模块IO0DIR = 0x00000001;/设置 P0.0为输出IO0CLR = 0x00000001;/设置 P0.0为低电平例程 2:在 P0.0输出高电平PINSEL0 = 0x00000000;/设置 P0.0连接到 GPIO模块IO0DIR = 0x00

34、000001;/设置 P0.0为输出IO0SET = 0x00000001;/设置 P0.0为高电平18例程 3:读取 P0.0的状态unsigned int state;PINSEL0 = 0x00000000;/设置 P0.0连接到 GPIO模块IO0DIR = 0x00000000;/设置 P0.0为输入State = IO0PIN /通过 IOxPIN读取 P0.0的状态从上面我们可以看出,通过写 IOxSET/IOxCLR寄存器很容易使所 选输出管脚的状态同时变为高/ 低 电平。只有 IOxSET/IOxCLR 中被写入 1 的位对应的管脚才能设置为高/ 低电 平,写入 0 的位对应

35、的管脚的状态不发生改变。但是,仅通过写 IOxSET 或 IOxCLR 寄存器是不可能使一个 GPIO 口同时输出包含0 和 1 的二进制数。写 IOxPIN 寄存器使能并行 GPIO 输出所需的瞬时值。写入 IOxPIN 寄存器的二进制数据将影响整个并行口的所有输出配置管脚:IOxPIN 的位为 0 时使管脚输出低电平,IOxPIN 的位为 1 时使管脚输 出高电平。为了改变一组端口的某些管脚的输出而同时又要不影响另外一些管脚的电平,必须 将 IOxPIN 读出的内容和一个值相与( 该值使要改变的管脚对应的位用 0来屏蔽,其它管脚对应的位为 1)。最后,再将相与的 结果和期望得到的管脚输出对

36、应的二进制数相或并将相或的结果存回 IOxPIN 寄存器。例如:假定 P07:0初始状 态为 0xA5,现在欲将 P07:0同时变为0x5A,通 过 IO0SET和 IO0CLR必须通过 2 次进行,而且会出现意外的中间状态。通过 IO0PIN来进行操作可以消除这样的中间状态,仅需执行语句IO0PIN = (IO0PIN 5.2 通信协议 的准备物理连接的建立使收发双方具备了通信的通路,但是在进行通信之前,还必须约定双方通信的一些规定,比如通信的速度、通信的格式等,这部分规定即通信协议。在 UART通信方式中,收 发双方需要约定的主要是通信速度和通信格式两个参数。PC上关于这部分的约定可以在软

37、件界面上直接设定,但是对于嵌入式系统而言, 则需要通过设定相关的寄存器来控制以上两个参数。首先要设定的是通信的速度,在串行通信中,只有速度相同的双方才能成功通信。在UART通信模式中,通信速度称 为波特率。波特率是指数据信号 对载波的调制速率,如果数据信号是二进制调制的,波特率即比特率,即每秒 钟传输的二进制位数。在LPC21XX中,波特率是通过UxDLM和UxDLL 两个寄存器来控制的,这两个寄存器决定波特率时钟的频率,UxDLM 即UARTx Divisor Latch MSB Register,UART除数锁 存LSB寄存器;UxDLL即UARTx Divisor Latch LSB R

38、egister,UART除数锁存MSB寄存器。 这两个寄存器如表5.1所示。名称 描述 复位值UxDLL7:0 除数锁存寄存器低字节UxDLM7:0 除数锁存寄存器高字节两个寄存器一起构成一个 16位的除数,决定 UART0的波特率。 未定义表5.1 波特率控制UxDLL 和UxDLM 寄存器一起构成一个16 位除数,UxDLL 包含除数的低8 位,UxDLM 包含除数的高8 位。 值0x0000 被看作是0x0001,因为除数是不允许为0 的。波特率 时钟必须是波特率的16 倍,波特率 计算公式如下:23,16FpclkBaudRteUxDLM从上面的公式中,不能得到UxDLM 和UxDLL

39、的就算方法:,16pclkxBaudRte注意:由于UxDLL、UxDLM寄存器与其它寄存器的地址重叠,所以在访问它们时,UxLCR的除数锁存访问 位(DLAB)必须为1。在设定了通信速度之后,还需要进行通信格式的设置,所谓通信格式,指的是在通信过程数据传输的先后和如何启动、结束一次传输。只有通信格式相同的收发双方才能实现成功通信。在LPC21XX中,通信格式是通过UxLCR (UART Line Control Register,线控制寄存器)来控制的,该寄存器的内容如表5.2所示。UxLCR的位 功能 描述 复位值1:0 数据长度选择00:5 位字符长度01:6 位字符长度10:7 位字符

40、长度11:8 位字符长度02 停止位选择0:1 个停止位1:2 个停止位(如果 U0LCR1:0=00 则为1.5)03 校验允许 0:禁止奇偶产 生和校验1:使能奇偶产 生和校验 05:4 校验类型选择00:奇数01:偶数10:强制 为 111:强制 为 006 间隔控制0:禁止间隔发 送1:使能间隔发 送当 U0LCR6=1 时,输出管脚 UART0 TxD 强制为逻辑 0。07 除数锁存访问位 0:禁止访问除数 锁存1:使能访问除数 锁存 0表5.2 UxLCR寄存器24在物理连接已经建立的基础上如果收发双方都设置了相同的波特率和数据格式后,那么就可以进行数据的收发了。5.3 数据的发

41、送LPC21XX的UART发送模块如图5.5所示。U x T S RU x T H RT x D内 部 数 据 总 线图5.5 LPC21XX发送模 块数据从内部数据总线输出到发送器保持寄存器(UxTHR)中,然后再拷 贝到移位发送器(UxTSR) 中,最后按照设定的波特率和格式从TxD 引脚逐位发出。 如果需要发送数据,只需要把数据写进对应的UxTHR 寄存器即可。UART作为一种低速传输接口,并不是任何时候都可以传输数据的,它必 须在空闲的时候才能传输数据,如果其当前正在发送数据而且还没有发送完成,是不能启动一次新的数据发送的。LPC21XX的收发状 态可以通过UxLSR (UARTx L

42、ine Status Register,UARTx线状态寄存器)来 查看,该寄存器如表5.3所示。UxLSR的位 功能 描述 复位值0 接收数据就绪 (RDR)0:UxRBR 为空1:UxRBR 包含有效数据当 UxRBR 包含未读取的字符时, UxLSR0 置位;当 UART RBR FIFO为空 时, U0LSR0 清零。01 溢出错误 (OE)0:溢出错误状 态未激活1:溢出错误状 态激活溢出错误条件在错误发生后立即设置。UxLSR 读操作清零该位。当 UARTx RSR 已经有新的字符就绪而 UART0 RBR FIFO 已满时,该位置位。此时 UARTx RBR FIFO 不会被覆盖

43、,UARTx RSR中的字符将丢失。0252 奇偶错误 (PE)0:奇偶错误状 态未激活1:奇偶错误状 态激活当接收字符的奇偶位处于错误状态时产生一个奇偶错误。UxLSR 读操作清零 该位。奇偶错误检测时间取决于 UxFCR0。奇偶 错误与UART RBR FIFO 中读出的字符相关。03 帧错误 (FE)0:帧错误状态 未激活1:帧错误状态 激活当接收字符的停止位为 0 时, 产生帧错误。UxLSR 读操作清零该。帧错误检测时间取决于 UxFCR0。帧错误与 UARTx RBR FIFO 中读出的字符相关。当检测到一个 帧错误时,Rx 将尝试与数据重新同步并假设错误的停止位实际是一个超前的起

44、始位。但即使没有出现帧错误,它也不能假设下一个接收到的字节是正确的。04 间隔中断 (BI)0:间 隔中断状态未激活1:间 隔中断状态激活在发送整个字符(起始位、数据、奇偶位和停止位)过程中 RxD0如果都保持 逻辑 0,则产生间隔中断。当检测到中断条件 时,接收器立即进入空闲状态直到 RxD0 变为全 1 状态。UxLSR 读操作清零该状态位。间隔检测的时间取决于 UxFCR0。间隔中断与 UART RBRFIFO 中 读出的字符相关。05发送保持寄存器空(THRE)0:UxTHR 包含有效数据1:UxTHR 空当检测到 UART THR 空时,THRE 置位,UxTHR 写操作清零 该位。

45、16 发送器空 (TEMT)0:UxTHR 和/或 UxTSR 包含有效数据1:UxTHR 和 UxTSR 空当 UxTHR 和 UxTSR 都为空 时,TEMT 置位。当 UxTSR 或 UxTHR包含有效数据时,TEMT 清零。17 Rx FIFO 错误(RXFE)0:UxRBR 中没有 UART Rx 错误,或UxFCR0=01:UxRBR 包含至少一个 UART Rx 错误当一个带有 Rx 错误(例如帧错误 、奇偶错误或间隔中断)的字符装入 UxRBR 时,UxLSR7 置位。当读取 UxLSR 寄存器并且 UART FIFO中不再有错误时,UxLSR7 清零。0表5.3 UxLSR寄

46、存器26这个寄存器的内容很多,在发送的时候,只需要关心其第5 位发送保持器空和第6位发送器空即可,只要这两位其中一位为1,则意味这UART已经或者马上就要进入空闲状态。一般情况下,当发送保持器空时 即可以启动一次新的发送,此时只需要把待发送的数据写入到UxTHR寄存器中,然后通过查询发送保持器是否为空确定数据是否成功发送即可。比如使用UART0发送一个字节的子函数可以这样写:void UART0_SendByte(unsigned char data)/等待UART1进入空闲状态while(U0LSR /发送数据U0THR = data;/等待发送完成while(U0LSR 5.4数据的接收L

47、PC21XX的UART接收模块如图5.6所示。U x R S RU x R B RR x D内 部 数 据 总 线图5.6 UART接收模块从RxD引脚输 入的移位信号先在UART输入移位寄存器(UxRSR)中进行串并转换,得到一个字节的数据后拷贝到UxRBR (UART Receiver Buffer Register,接受缓冲寄存器)中,然后等待程序通 过内部数据总线将其读走。接收UART的数据主要有两种方式,分 别为查询方式和中断方式,中断方式将在中断系统中重点阐述,本章主要讲解查询方式。UART 数据的接收只有在接收到有效数据之后才能启动,在查询接收方式中,是否接受到有效的数据是通过查

48、询UxLSR寄存器的第0位即接收数据就绪位来实现的,如果该位为1 ,则意味着27UART接收到了有效的数据,此时可以从UxRBR读取数据。通过查询方式从URRT0中读取数据的例程如下所示。unsigned char UART0_RcvByte(void)/定义变 量unsigned char rcv_data; /等待UART0接收到有效的数据while(U0LSR /从 UART0读 取接收到的数据rcv_data = U0RBR;/返回收到的数据return(rcv_data);5.5 提高UART的效能UART是一种速度很慢的传输接口,高速 CPU不得不花费很多时间来处理其接收和发送过程

49、,大大降低了高速CPU的效能。 为了解决这个问题,最简单的办法就是在发送的时候CPU一次性将大量的数据传输给UART中,让UART 自行发送而CPU不做监 管,在接收的时候让UART 接收到了一定量的数据再通知CPU过来处理,从而缓解高速CPU和低速外设之间的瓶颈,解放CPU,提高其性能。 这种方案目前IC制作厂商的大量使用,最经常使用的实现手段就是FIFO(first input first output),LPC21XX的接收FIFO结构示意图如图5.7所示。432187651 21 11 091 61 51 41 3U x R S RU x R B R接 收 数 据 有效 触 发 点T x D数 据总 线图5.7 LPC21XX的接收FIFO示意图28从接收移位寄存器UxRSR中输入的数据不是直接输 送到接收缓冲(UxRBR ),而是首先放到了一个缓冲区中,这个缓冲

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报