31.01.2015 Views

下载PDF全文《32位MCU开发全攻略》(上) - 中国百科网

下载PDF全文《32位MCU开发全攻略》(上) - 中国百科网

下载PDF全文《32位MCU开发全攻略》(上) - 中国百科网

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 前 言<br />

前 言<br />

单 片 机 可 能 是 中 国 工 程 师 最 熟 悉 的 一 种 器 件 了 , 几 乎 每 个 工 科 大 学 生 都 接 触 过 这 个 器<br />

件 ,20 多 年 前 , 在 陈 章 龙 、 何 立 民 、 邵 贝 贝 等 我 国 单 片 机 应 用 前 辈 的 推 动 下 , 单 片 机 走 入 中<br />

国 , 在 工 业 控 制 、 家 庭 应 用 等 方 面 发 挥 出 巨 大 的 作 用 ! 目 前 , 虽 然 8 位 单 片 机 如 51 等 依 然 是 单<br />

片 机 应 用 的 主 体 , 但 是 32 位 单 片 机 ( 也 称 MCU) 的 应 用 呈 现 出 高 速 增 长 势 态 , 有 数 据 显 示 :<br />

仅 在 过 去 一 年 , 基 于 ARM Cortex-M3 的 MCU 的 出 货 量 增 长 率 就 达 到 200%! 这 些 高 性 能 、<br />

低 功 耗 的 MCU 广 泛 应 用 于 汽 车 电 子 、 工 业 应 用 、 医 疗 电 子 等 领 域 , 而 据 研 究 机 构 预 测 , 中 国<br />

MCU 的 可 用 市 场 总 量 (TAM) 将 从 2009 年 的 20 亿 美 元 增 长 到 2013 年 的 30 亿 美 元 以 上 , 其 增<br />

幅 为 全 球 水 平 的 两 倍 。 市 场 对 稳 定 、 可 靠 而 又 有 着 丰 富 外 设 集 成 的 通 用 微 控 制 器 有 着 迫 切 需<br />

求 , 这 也 从 侧 面 说 明 普 及 MCU 开 发 知 识 有 充 足 的 必 要 性 。<br />

另 一 个 有 趣 的 现 象 是 当 我 在 书 店 查 找 有 关 书 籍 时 , 却 发 现 在 查 找 的 400 多 本 有 关 单 片<br />

机 的 图 书 中 , 有 95% 左 右 的 是 关 于 51 单 片 机 的 , 还 有 3% 左 右 是 关 于 16 位 单 片 机 的 , 只 有<br />

2% 左 右 的 是 关 于 32 位 MCU 的 , 可 见 需 求 和 供 给 之 间 出 现 了 巨 大 的 落 差 , 这 也 是 电 子 创 新<br />

网 推 出 《32 位 MCU 开 发 全 攻 略 》 电 子 书 的 初 衷 之 一 。<br />

基 于 上 述 原 因 , 本 电 子 书 主 要 讲 述 32 位 MCU 应 用 开 发 知 识 , 对 于 8 位 单 片 机 的 开 发 , 因<br />

为 已 经 有 大 量 书 籍 , 这 里 不 再 赘 述 。 本 书 的 第 一 章 主 要 介 绍 了 嵌 入 式 系 统 的 背 景 知 识 、 基<br />

本 概 念 和 目 前 发 展 状 况 , 让 大 家 对 嵌 入 式 系 统 的 发 展 有 大 致 的 了 解 。 第 二 章 主 要 介 绍 了 微<br />

控 制 器 的 基 本 原 理 、 结 构 和 32 位 ARM MCU 供 应 商 的 信 息 。 第 三 章 主 要 介 绍 了 ARM 内 核 的<br />

一 些 特 点 及 ARM 指 令 集 。 第 四 章 以 恩 智 浦 公 司 的 MCU 为 例 详 细 介 绍 了 32 位 ARM MCU 的<br />

具 体 结 构 、 功 能 和 特 点 。 第 五 章 是 本 书 的 重 点 内 容 , 以 恩 智 浦 的 LPC17xx 系 列 MCU 为 例 ,<br />

分 模 块 详 细 介 绍 了 MCU 的 应 用 开 发 , 这 些 介 绍 把 软 硬 件 结 合 在 一 起 , 这 是 本 书 和 其 他 类<br />

似 书 籍 的 区 别 之 一 。 第 六 章 介 绍 了 MCU 开 发 工 具 及 开 发 流 程 。 第 七 章 我 们 搜 集 了 多 个 MCU<br />

开 发 应 用 实 例 , 通 过 这 些 实 例 , 进 一 步 强 化 MCU 开 发 技 巧 和 系 统 设 计 方 法 。 第 八 章 我 们 以<br />

问 答 的 形 式 介 绍 MCU 开 发 的 技 巧 , 这 些 问 答 具 有 一 定 的 基 础 性 和 代 表 性 , 可 以 帮 助 工 程 师<br />

解 决 MCU 应 用 开 发 中 遇 到 的 难 题 。 第 九 章 我 们 罗 列 了 一 些 MCU 开 发 资 源 信 息 , 工 程 师 朋<br />

友 可 以 通 过 链 接 获 得 所 需 的 知 识 。 第 十 章 是 有 关 本 书 的 编 委 信 息 。 第 十 一 章 是 本 书 的 版 权<br />

声 明 , 我 们 授 权 工 程 师 朋 友 和 媒 体 免 费 下 载 此 书 并 进 行 推 广 , 但 是 不 得 以 本 书 进 行 商 业 活<br />

动 。


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 前 言<br />

本 文 因 为 内 容 很 多 , 分 为 上 下 册 , 上 册 为 基 础 知 识 篇 , 从 第 一 章 到 第 五 章 , 下 册 为 开 发<br />

技 巧 篇 , 为 第 六 章 以 后 内 容 。<br />

本 书 可 以 作 为 MCU 应 用 工 程 师 、 大 中 专 学 生 或 MCU 爱 好 者 学 习 32 位 MCU 开 发 的 参 考 教<br />

材 。<br />

在 本 书 的 开 发 过 程 中 , 恩 智 浦 相 关 工 作 人 员 对 本 书 的 内 容 编 写 给 予 了 大 力 支 持 , 上 海 丰<br />

宝 电 子 有 限 公 司 牛 晓 东 先 生 以 及 南 京 航 空 航 天 学 院 白 延 敏 老 师 也 编 写 了 部 分 章 节 。 此 外 , 南<br />

京 航 空 航 天 大 学 的 解 书 钢 、 王 钦 玉 、 浙 江 大 学 的 余 凯 、 上 海 交 通 大 学 的 喻 焰 以 及 福 州 大 学 黄<br />

鹏 程 等 同 学 对 本 电 子 书 编 写 给 予 了 大 力 支 持 , 在 此 表 示 衷 心 地 感 谢 !<br />

科 技 在 不 断 进 步 , 工 程 师 对 知 识 的 渴 求 是 无 止 境 的 , 本 书 对 32 位 MCU 应 用 开 发 进 行 了<br />

粗 浅 地 探 讨 , 难 免 存 在 疏 漏 之 处 , 我 们 愿 意 收 集 来 自 工 程 师 朋 友 的 改 进 建 议 以 便 提 供 更 好<br />

的 内 容 , 任 何 有 关 该 书 的 建 议 见 请 发 信 到 richard@eetrend.com , 谢 谢 大 家 的 支 持 !<br />

《32 位 MCU 开 发 全 攻 略 》 电 子 书 主 编 张 国 斌<br />

电 子 创 新 网 CEO<br />

2009 年 8 月


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 目 录<br />

目 录<br />

前 言 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 2<br />

第 6 章 MCU 开 发 流 程 与 开 发 工 具 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 5<br />

6.1 MCU 开 发 基 本 开 发 流 程 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 5<br />

6.2 MCU 软 件 开 发 环 境 介 绍 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 7<br />

6.3 ReaIView MDK 与 ADS 比 较 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 43<br />

6.4 MCU 硬 件 开 发 调 试 工 具 介 绍 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 44<br />

第 7 章 MCU 应 用 开 发 实 例 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 50<br />

7.1 基 于 LPC2478 的 实 用 型 太 阳 能 发 电 控 制 系 统 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 50<br />

7.2 智 能 路 况 分 析 导 盲 杖 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 64<br />

7.3 通 用 人 体 呼 吸 气 体 检 测 电 子 鼻 仪 器 设 计 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 70<br />

7.4 基 于 LPC2000 系 列 MCU 的 定 位 与 监 控 系 统 实 现 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 75<br />

7.5 恩 智 浦 P89LPC922+PCF8576 电 表 微 控 制 器 方 案 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 81<br />

7.6 嵌 入 式 实 时 操 作 系 统 FreeRTOS 在 ARM7 上 移 植 的 实 现 • • • • • • • • • • • • • • • • • • • • • • • • • • 83<br />

第 8 章 MCU 应 用 开 发 百 问 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 90<br />

8.1 关 于 ARM 内 核 问 答 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 90<br />

8.2 有 关 开 发 工 具 问 答 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 95<br />

8.3 有 关 MCU 硬 件 设 计 问 答 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 99<br />

8.4 有 关 MCU 开 发 软 件 编 程 问 答 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 104<br />

8.5 有 关 MCU 开 发 调 试 问 答 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 121<br />

8.6 其 他 有 关 MCU 开 发 问 答 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 123<br />

第 9 章 MCU 开 发 资 源 总 汇 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 126<br />

第 10 章 编 和 信 息 与 后 记 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 127<br />

第 11 章 版 权 声 明 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 128<br />

参 考 文 献 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 129<br />

4


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

第 6 章 MCU 开 发 流 程 与 开 发 工 具<br />

6.1 MCU 基 本 开 发 流 程<br />

6.1.1 MCU 设 计 方 法<br />

MCU 系 统 设 计 是 使 用 一 组 物 理 硬 件 和 软 件 来 完 成 所 需 功 能 的 过 程 。 系 统 是 指 任 何 由 硬 件 、 软 件<br />

或 者 两 者 结 合 来 构 成 的 功 能 设 备 ,MCU 设 计 方 法 常 用 的 是 软 硬 件 协 同 设 计 , 是 指 在 MCU 产 品 的 设 计 过<br />

程 中 , 软 件 设 计 和 硬 件 设 计 是 紧 密 结 合 、 相 互 协 调 的 , 这 种 方 法 的 特 点 是 , 在 设 计 时 从 系 统 功 能 的 实 现<br />

考 虑 , 把 实 现 时 的 软 硬 件 同 时 考 虑 进 去 , 既 可 以 最 大 限 度 地 利 用 有 效 资 源 , 缩 短 开 发 周 期 , 又 能 取 得 更<br />

好 的 设 计 效 果 , 软 硬 件 协 同 设 计 过 程 如 图 6.1 所 示 。<br />

图 6.1 软 硬 件 协 同 设 计 过 程<br />

从 图 6.1 可 以 看 出 , 设 计 过 程 是 一 个 不 断 迭 代 的 过 程 。 整 个 设 计 流 程 就 是 为 了 达 到 系 统 的 功 能 、<br />

技 术 参 数 和 环 境 条 件 要 求 。 在 设 计 过 程 中 首 先 要 对 系 统 进 行 需 求 分 析 , 进 而 得 出 系 统 要 达 到 的 性 能 要<br />

求 。 接 着 对 系 统 进 行 软 硬 件 划 分 , 提 出 软 硬 件 设 计 方 案 , 然 后 根 据 得 出 的 软 硬 件 设 计 方 案 进 行 软 件 实<br />

现 、 硬 件 实 现 和 软 硬 件 接 口 综 合 。 最 后 进 行 系 统 测 试 , 若 测 试 结 果 符 合 要 求 即 设 计 完 成 , 若 不 符 合 要<br />

求 则 重 新 进 行 设 计 。<br />

5


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

6.1.2 MCU 开 发 流 程<br />

MCU 开 发 过 程 中 , 必 须 始 终 综 合 考 虑 各 个 方 面 的 因 素 。 面 向 具 体 应 用 的 MCU 开 发 决 定 了 它 的 方<br />

法 、 流 程 各 有 不 同 , 本 节 给 出 一 般 的 MCU 开 发 的 具 体 过 称 , 如 图 6.2 所 示 。<br />

图 6.2 MCU 系 统 开 发 流 程<br />

1. 系 统 定 义 与 需 求 分 析<br />

需 求 分 析 应 确 定 目 标 系 统 要 具 备 哪 些 功 能 ( 即 必 须 完 成 什 么 ), 需 求 分 析 就 是 要 求 密 切 配 合 用 户 , 经<br />

过 充 分 的 交 流 和 考 察 , 得 出 经 过 用 户 确 定 的 、 明 确 的 系 统 实 现 逻 辑 模 型 , 以 便 使 设 计 开 发 人 员 能 确 定<br />

最 终 的 设 计 目 标 。 由 此 确 定 的 系 统 逻 辑 模 型 是 以 后 设 计 和 实 现 的 目 标 系 统 基 础 , 必 须 能 够 准 确 、 完 整<br />

地 体 现 出 用 户 的 要 求 。<br />

2. 系 统 设 计 方 案 的 初 步 确 立<br />

包 括 系 统 设 计 的 初 步 说 明 文 档 、 设 计 方 案 和 设 计 描 述 文 档 , 具 体 包 括 以 下 文 档 : 系 统 总 体 设 计 、<br />

6


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

系 统 功 能 划 分 与 软 硬 件 协 同 设 计 、 处 理 器 选 择 与 基 本 接 口 器 件 选 择 、 操 作 系 统 选 择 和 开 发 环 境 选 择 。<br />

这 些 文 档 的 确 立 是 为 了 描 述 每 一 种 可 能 的 系 统 组 成 , 估 计 每 一 种 方 案 的 成 本 和 效 益 , 选 择 一 个 较 好 的<br />

系 统 方 案 , 并 且 制 定 出 该 系 统 的 详 细 计 划 。<br />

3. 初 步 设 计 方 案 性 价 比 评 估 与 方 案 评 审 论 证<br />

在 系 统 开 始 软 硬 件 具 体 设 计 之 前 , 需 要 最 后 确 定 设 计 方 案 与 用 户 需 求 之 间 的 合 理 性 , 并 对 设 计 方<br />

案 的 正 确 性 、 安 全 性 等 多 方 面 进 行 综 合 评 估 , 以 确 定 是 否 进 入 下 一 步 实 际 实 施 阶 段 。<br />

4. 完 善 初 步 方 案 、 初 步 方 案 实 施<br />

这 是 整 个 设 计 过 程 的 最 基 本 的 环 节 , 它 决 定 了 以 后 软 硬 件 设 计 的 方 向 与 各 自 完 成 的 目 标 , 划 分 的<br />

结 果 对 工 作 量 和 系 统 的 性 能 、 成 本 有 着 较 大 的 影 响 。<br />

5. 软 硬 件 集 成 测 试<br />

将 测 试 完 成 的 软 件 系 统 装 入 制 作 好 的 硬 件 系 统 中 , 进 行 系 统 的 综 合 测 试 , 验 证 系 统 功 能 是 否 能 被<br />

正 确 无 误 地 实 现 。<br />

6. 系 统 功 能 性 能 测 试 及 可 靠 性 测 试<br />

测 试 最 终 完 成 的 系 统 性 能 是 否 满 足 设 计 任 务 书 的 各 项 性 能 指 标 和 要 求 。<br />

6.2 MCU 软 件 开 发 环 境 介 绍<br />

根 据 功 能 不 同 ,MCU 应 用 软 件 的 开 发 工 具 分 别 有 : 编 译 软 件 、 汇 编 软 件 、 链 接 软 件 、 调 试 软 件 、 嵌<br />

入 式 实 时 操 作 系 统 、 函 数 库 、 评 估 板 、JTAG 仿 真 器 和 在 线 仿 真 器 等 。 当 用 户 选 用 ARM 处 理 器 开 发 嵌<br />

入 式 系 统 时 , 选 择 合 适 的 开 发 工 具 可 以 加 快 开 发 的 速 度 , 节 省 开 发 成 本 。 因 此 , 一 套 含 有 编 辑 软 件 、 编<br />

译 软 件 、 汇 编 软 件 、 链 接 软 件 、 调 试 软 件 、 工 程 管 理 及 函 数 库 的 集 成 开 发 环 境 (IDE) 一 般 来 说 是 必 不 可<br />

少 的 , 至 于 嵌 入 式 实 时 操 作 系 统 和 评 估 板 等 其 它 开 发 工 具 , 则 可 以 根 据 应 用 软 件 规 模 和 开 发 计 划 来 选<br />

用 。<br />

使 用 集 成 开 发 环 境 开 发 应 用 软 件 , 包 括 编 辑 、 编 译 、 汇 编 、 链 接 等 工 作 全 部 都 在 PC 机 上 即 可 完<br />

成 , 调 试 工 作 需 要 配 合 其 他 模 块 或 产 品 才 能 完 成 。 目 前 常 用 的 开 发 工 具 有 ARM SDT、ARM ADS、<br />

RealView MDK、Keil µVision、IAR EWARM、Green Hills MULTI、Hitools for ARM、Embest IDE<br />

for ARM 等 集 成 开 发 环 境 。 下 面 将 对 RealView MDK、IAR EWARM、ARM ADS 做 详 细 的 介 绍 , 对 Keil<br />

µVision、Green Hills MULTI 做 简 单 介 绍 。<br />

7


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

6.2.1 RealView MDK 开 发 环 境 介 绍<br />

ARM 开 发 的 集 成 开 发 环 境 RealView Microcontroller Development Kit( 简 称 为 RealView MDK 或<br />

者 MDK) 将 ARM 开 发 工 具 RealView Development Suite( 简 称 为 RVDS) 的 编 译 器 RVCT 与 Keil 的 工 程<br />

管 理 、 调 试 仿 真 工 具 集 成 在 一 起 。<br />

RealView MDK 开 发 工 具 源 自 德 国 Keil 公 司 , 被 全 球 超 过 10 万 的 嵌 入 式 开 发 工 程 师 验 证 和 使 用 ,<br />

它 是 ARM 公 司 目 前 最 新 推 出 的 针 对 各 种 嵌 入 式 处 理 器 的 软 件 开 发 工 具 (2006 年 ARM 公 司 并 购 了 Keil<br />

公 司 ),RealView MDK 集 成 了 业 内 最 领 先 的 技 术 , 包 括 μVision3 集 成 开 发 环 境 与 RealView 编 译 器 。<br />

支 持 ARM7、ARM9 和 最 新 的 Cortex-M3 核 处 理 器 , 自 动 配 置 启 动 代 码 , 集 成 Flash 烧 写 模 块 , 强 大 的<br />

Simulation 设 备 模 拟 , 性 能 分 析 等 功 能 , 与 ARM 之 前 的 工 具 包 ADS 等 相 比 ,RealView 编 译 器 的 最 新 版<br />

本 可 将 性 能 改 善 超 过 20%。<br />

由 Keil 开 发 的 MDK 尽 管 是 针 对 16 位 和 32 位 处 理 器 的 , 但 所 使 用 的 仍 是 中 国 工 程 师 非 常 熟 悉 的 开<br />

发 环 境 。 这 样 当 面 对 有 更 高 性 能 需 求 的 16 位 和 32 位 MCU 开 发 时 , 中 国 开 发 人 员 可 以 利 用 原 有 开 发 经 验<br />

轻 松 实 现 过 渡 。<br />

ARM MDK 大 大 提 高 了 工 程 师 开 发 的 速 度 和 质 量 。 基 于 RealView 编 译 器 , 代 码 更 小 , 性 能 更 高 。<br />

MDK 可 以 自 动 生 成 完 善 的 启 动 代 码 , 无 论 对 于 初 学 者 还 是 有 经 验 的 开 发 工 程 师 , 都 能 大 大 节 省 时 间 ,<br />

提 高 开 发 效 率 。MDK 设 备 模 拟 器 可 以 仿 真 整 个 目 标 硬 件 , 开 发 工 程 师 在 无 硬 件 的 情 况 下 即 可 开 始 软 件<br />

开 发 和 调 试 , 使 软 硬 件 开 发 同 步 进 行 , 大 大 缩 短 开 发 周 期 。MDK 能 够 辅 助 查 看 代 码 覆 盖 情 况 , 程 序 运<br />

行 时 间 , 函 数 调 用 次 数 等 高 端 控 制 功 能 。 这 些 优 势 使 得 中 国 工 程 师 能 够 将 更 多 的 时 间 和 精 力 投 入 到 创<br />

新 中 去 。<br />

下 面 我 们 结 合 LPC1700 开 发 板 来 详 细 介 绍 RealView MDK 硬 件 调 试 与 代 码 固 化 知 识 。 该 开 发 板<br />

采 用 最 新 Cortex-M3 内 核 , 主 芯 片 是 LPC1766/LPC1758, 主 频 达 100MHz, 具 有 512K 字 节 的 闪 存 和<br />

64K 字 节 的 SRAM, 采 用 2.4‘TFT-LCD 显 示 , 接 口 有 USB Host/Device/OTG、 双 CAN、RS232 串 口 、<br />

10M/100M Ethernet 等 。<br />

8


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 6.3 LPC1700 开 发 板<br />

1. 创 建 工 程<br />

首 先 , 新 建 一 个 文 件 夹 用 于 存 放 工 程 文 件 , 此 处 文 件 名 为 “Blinky”, 放 在 F 盘 ( 可 自 行 选 择 ); 然<br />

后 , 在 Blinky 文 件 夹 中 新 建 四 个 子 文 件 夹 :<br />

“Sorce” ------- 存 放 .c 源 文 件 和 .s 启 动 代 码 , 脚 本 文 件 , 分 散 加 载 文 件 等 ;<br />

“Include”------- 存 放 .h 头 文 件 ;<br />

“Temp” ------- 存 放 编 译 调 试 过 程 中 生 成 的 中 间 文 件 ( 最 后 可 删 除 );<br />

“Document”----- 存 放 文 本 文 件 ;<br />

这 些 文 件 夹 在 后 面 会 用 到 。<br />

创 建 步 骤 如 下 :<br />

1) 单 击 Project–New μVision Project…. 菜 单 项 , 如 下 图 6.4 所 示 。<br />

图 6.4 创 建 工 程 第 一 步<br />

2)μVision 3 打 开 一 个 标 准 对 话 框 , 输 入 新 建 工 程 的 名 字 “blink y”, 新 工 程 保 存 在 文 件 夹<br />

9


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

“Blinky” 下 ,μVision 将 会 创 建 以 blinky.UV2 为 名 字 的 新 工 程 文 件 , 如 图 6.5 所 示 。<br />

图 6.5 创 建 “Blinky” 新 工 程 文 件<br />

3) 上 图 中 点 击 “ 保 存 ” 后 , 要 求 为 工 程 选 择 一 款 对 应 处 理 器 , 此 处 选 择 LPC1768, 如 图 6.6 所 示 。<br />

图 6.6 创 建 时 要 对 应 一 款 处 理 器<br />

4) 启 动 代 码 设 置 ,μVision 自 动 添 加 启 动 代 码 , 选 择 “ 是 ”, 工 程 新 建 完 毕 , 如 图 6.7 所 示 。<br />

看 到 。<br />

图 6.7 添 加 启 动 代 码<br />

5) 新 工 程 包 含 了 一 个 缺 省 的 目 标 (target) 和 文 件 组 名 。 这 些 内 容 Project Workspace 窗 口 中 可 以<br />

10


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

2、 创 建 新 的 源 文 件<br />

图 6.8 新 工 程 包 含 了 一 个 缺 省 的 目 标 (target) 和 文 件 组 名<br />

所 示 。<br />

1) 选 择 菜 单 项 File–New, 或 者 直 接 点 击 , 将 会 打 开 一 个 空 的 编 辑 窗 口 用 以 输 入 源 程 序 , 如 图 6.9<br />

图 6.9 创 建 新 的 源 文 件<br />

2) 保 存 源 文 件 : 代 码 输 入 完 后 , 选 择 File - Save As“ 菜 单 项 保 存 源 程 序 , 保 存 路 径 选 择 “blinky”<br />

文 件 夹 下 的 Sorce 子 文 件 夹 , 文 件 名 “binky.c”: 如 下 图 6.10 所 示 。<br />

图 6.10 保 存 源 文 件<br />

注 意 : 如 需 脚 本 文 件 , 相 同 方 法 创 建 脚 本 文 件 , 并 存 放 在 Source 子 文 件 夹 中 ; 同 上 , 可 创 建 .h<br />

文 件 , 存 放 在 Include 子 文 件 夹 中 ; 此 处 , 因 为 工 程 没 有 用 到 这 些 文 件 , 所 以 无 须 创 建 。<br />

3. 工 程 管 理<br />

1) 在 Project–Manage-Components,Environment,Books 对 话 框 中 创 建 自 己 的 文 件 组 Sysem<br />

Files 来 管 理 CPU 启 动 代 码 和 其 它 系 统 配 置 文 件 等 , 或 者 直 接 点 击 。<br />

11


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

此 处 我 们 在 projects target 这 一 项 中 添 加 如 下 工 程 组 :<br />

a)“LPC1768 Flash”----- 在 Flash 中 调 试 , 固 化 ;<br />

b)“LPC1768 RAM”----- 在 RAM 中 调 试 ;<br />

c)“Simulation”----- 用 于 模 拟 器 调 试 。<br />

在 Groups 中 添 加 :<br />

a)“Sartup Code”--- 启 动 代 码 组 ;<br />

b)“Source Code”--- 源 文 件 组 ;<br />

c)“Core Code” --- 内 核 代 码 组 ;<br />

d)“System Code”--- 系 统 代 码 组 ;<br />

e)“Documents” --- 文 本 文 件 组 。<br />

如 图 6.11 所 示 。<br />

图 6.11 添 加 工 程 组 文 件<br />

2) 点 击 上 图 OK 按 钮 后 , 工 程 右 侧 显 示 下 图 所 示 的 创 建 列 表 , 如 图 6.12 所 示 。<br />

图 6.12 创 建 列 表<br />

3) 在 工 程 中 添 加 源 文 件 : 双 击 startup code, 在 Blinky/Source 中 , 添 加 启 动 代 码 , 保 存 即 可 。 如<br />

图 6.13 所 示 。<br />

12


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 6.13 添 加 源 文 件<br />

4) 添 加 Soruce Code: 双 击 Source Code, 在 blinky/Source 文 件 夹 中 选 中 blinky.c, 点 击 add 添 加<br />

源 文 件 , 如 图 6.14 所 示 。<br />

图 6.14 添 加 Soruce Code<br />

5) 添 加 Core code: 工 程 右 侧 双 击 Core Code, 在 Blinky/Source 路 径 下 添 加 内 核 初 始 化 文 件 , 如<br />

图 6.15 所 示 。<br />

图 6.15 添 加 Core code<br />

13


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

6.16 所 示 。<br />

6) 添 加 System code: 双 击 System Code, 在 Blinky/Source 路 径 下 添 加 系 统 初 始 化 文 件 , 如 图<br />

图 6.16 添 加 Core code<br />

7) 添 加 文 本 文 件 : 双 击 Documents, 在 Blinky/documents 路 径 下 添 加 文 本 文 件 , 如 图 6.17 所 示 。<br />

图 6.17 添 加 文 本 文 件<br />

经 过 以 上 步 骤 , 则 工 程 文 件 添 加 完 毕 , 如 图 6.18 所 示 。<br />

图 6.18 工 程 文 件 添 加 完 毕<br />

14


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

4. 工 程 基 本 配 置<br />

工 程 基 本 配 置 操 作 如 图 6.19 所 示 , 可 以 对 Flash 和 RAM 的 起 始 位 置 和 大 小 进 行 选 择 。<br />

图 6.19 工 程 基 本 配 置<br />

1) 指 定 输 出 文 件 存 放 文 件 夹 , 如 图 6.20 所 示 。<br />

图 6.20 指 定 输 出 文 件 存 放 文 件 夹<br />

2) 指 定 路 径 Blinky/Temp, 如 图 6.21 所 示 。<br />

图 6.21 指 定 路 径 Blinky/Temp<br />

15


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

3) 指 定 头 文 件 路 径 : 若 工 程 中 有 添 加 .h 文 件 , 需 在 此 处 指 定 路 径 , 点 击 OK, 如 图 6.22 所 示 。<br />

图 6.22 指 定 头 文 件 路 径<br />

4) 选 择 USB Memory layout from Target Dialog,“ok” 保 存 , 若 使 用 分 散 加 载 文 件 , 在 此 处 指<br />

定 路 径 , 如 图 6.23 所 示 。<br />

图 6.23 使 用 分 散 加 载 文 件<br />

5. 仿 真 器 、 目 标 板 的 连 接 。<br />

PC 机 通 过 ULINK2 USB-JTAG 仿 真 器 与 目 标 板 连 接 ,Ulink2 JTAG 口 接 LPC170020 Pin JTAG<br />

口 ,USB 口 通 过 一 根 USB 线 与 PC 相 接 ; 最 后 给 开 发 板 上 电 , 使 用 一 根 USB 线 给 LPC1700 供 电 , 如 图<br />

6.24 所 示 。<br />

图 6.24 PC 机 通 过 ULINK2 USB-JTAG 仿 真 器 与 目 标 板 连 接<br />

16


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

1) 选 择 硬 件 仿 真 , 若 工 程 中 用 到 .ini 脚 本 文 件 , 需 在 此 处 指 定 其 路 径 , 如 图 6.25 所 示 。<br />

图 6.25 选 择 硬 件 仿 真<br />

2) 硬 件 仿 真 : 使 用 ULINK2 仿 真 器 , 为 仿 真 器 选 择 合 适 的 驱 动 以 及 为 应 用 程 序 和 可 执 行 文 件 下 载<br />

进 行 配 置 , 如 图 6.26 和 图 6.27 所 示 。<br />

图 6.26 为 仿 真 器 选 择 合 适 的 驱 动<br />

图 6.27 为 仿 真 器 选 择 合 适 的 应 用 程 序<br />

ULINK2 连 接 :Project->Project-Option for Target->Debuger->Settings, 检 查 ulink2 连 接 是 否 成<br />

功 , 如 图 6.28 所 示 。<br />

17


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 6.28 ULINK2 连 接<br />

3) 工 具 配 置 Project->Project-Option for Target->Utilities, 做 如 下 配 置 , 如 图 6.29 所 示 。<br />

4)Flash 算 法 添 加<br />

图 6.29 工 具 配 置 示 意 图<br />

a) 在 上 图 中 点 击 Setting 进 入 如 下 对 话 框 , 点 击 add 添 加 , 如 图 6.30 所 示 。<br />

图 6.30 Flash 算 法 添 加<br />

18


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

b) 此 处 选 择 512k 片 内 flash, 点 击 ok 即 可 , 如 图 6.31 所 示 。<br />

图 6.31 选 择 512k 片 内 flash<br />

注 意 : 所 以 的 配 置 均 要 点 击 “OK” 来 保 存 配 置 !<br />

6. 工 程 的 编 译 链 接<br />

点 击<br />

编 译 工 程 , 同 时 将 在 输 出 窗 口 的 Build 子 窗 口 输 出 编 译 信 息 : 当 显 示 0 Eorror,0<br />

Warning 时 , 可 进 行 代 码 固 化 了 。 如 图 6.32 所 示 。<br />

7. 代 码 下 载 与 运 行<br />

1) 程 序 烧 写 到 FLASH<br />

图 6.32 工 程 的 编 译 链 接<br />

点 击<br />

将 目 标 文 件 下 载 到 目 标 系 统 的 指 定 存 储 区 中 , 输 出 窗 口 显 示 烧 写 信 息 , 如 图 6.33 所<br />

示 。<br />

19


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 6.33 程 序 烧 写 到 FLASH<br />

2) 代 码 运 行<br />

此 时 代 码 固 化 完 毕 , 按 LPC1700 开 发 板 上 reset 按 钮 或 者 可 以 点 击<br />

进 入 工 程 调 试 界 面 全<br />

速 运 行 来 查 看 代 码 运 行 效 果 : 会 看 到 LED 灯 轮 流 点 亮 ! 如 图 6.34 所 示 。<br />

图 6.34 代 码 运 行<br />

以 上 为 RealView MDK 硬 件 调 试 与 代 码 固 化 操 作 介 绍 。<br />

6.2.2 IAR EWARM 开 发 环 境 介 绍<br />

IAR Embedded Workbench for ARM 是 IAR Systems 公 司 为 ARM 微 处 理 器 开 发 的 一 个 集 成 开 发<br />

环 境 ( 下 面 简 称 IAR EWARM)。 比 较 其 他 的 ARM 开 发 环 境 ,IAR EWARM 具 有 入 门 容 易 、 使 用 方 便 和<br />

代 码 紧 凑 等 特 点 。<br />

IAR Systems 公 司 目 前 推 出 的 最 新 版 本 是 IAR Embedded Workbench for ARM version 5.40 一 个<br />

64 码 限 制 学 习 版 或 30 天 时 间 限 制 的 免 费 评 估 版 , 可 以 到 IAR 公 司 的 网 站 www.iar.com/ewarm 下 载 。<br />

20


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

IAR EWARM 中 包 含 一 个 全 软 件 的 模 拟 程 序 (simulator)。 用 户 不 需 要 任 何 硬 件 支 持 就 可 以 模 拟<br />

各 种 ARM 内 核 、 外 部 设 备 甚 至 中 断 的 软 件 运 行 环 境 。 从 中 可 以 了 解 和 评 估 IAR EWARM 的 功 能 和 使 用<br />

方 法 。<br />

IAR EWARM 是 一 套 支 持 ARM 所 有 处 理 器 的 集 成 开 发 环 境 , 包 含 项 目 管 理 器 、 编 辑 器 、C/C++ 编<br />

译 器 、 汇 编 器 、 连 接 器 和 调 试 器 。 在 EWARM 环 境 下 可 以 使 用 C/C++ 和 汇 编 语 言 方 便 地 开 发 ARM 嵌<br />

入 式 应 用 程 序 , 比 较 其 他 的 ARM 开 发 环 境 ,IAR 的 EWARM 具 有 入 门 容 易 、 使 用 方 便 、 代 码 紧 凑 等 特<br />

点 。 通 过 其 内 置 的 针 对 不 同 芯 片 的 代 码 优 化 器 ,IAR EWARM 可 以 为 ARM 芯 片 生 成 非 常 高 效 和 可 靠 的<br />

FLASH/PROMable 代 码 。 不 仅 有 这 些 可 靠 的 技 术 ,IAR Systems 还 为 您 提 供 专 业 的 全 球 技 术 支 持 。<br />

注 意 : 本 文 中 实 例 所 涉 及 版 本 暂 为 V4.42, 基 于 NXP 1700 开 发 板 的 EWARM5.40 实 例 将 在 下 一 版<br />

本 中 更 新 。( 当 前 最 新 版 本 :V5.40)<br />

IAR EWARM 的 关 键 元 素 :<br />

* 高 度 优 化 的 C/C++ 的 ARM 编 译 器 ;<br />

* 遵 从 ARM EABI<br />

* 有 各 大 芯 片 厂 商 ARM 芯 片 的 配 置 文 件 ;<br />

* 广 泛 的 硬 件 目 标 系 统 支 持 ;<br />

* 可 选 IAR J-Link 以 及 J-Trace 仿 真 器 ;<br />

* 含 源 代 码 的 实 时 库 ;<br />

* 可 重 定 位 宏 汇 编 器 ;<br />

* 链 接 器 和 库 工 具 ;<br />

* C-SPY 调 试 器 包 含 ARM simulator、JTAG 支 持 , 且 支 持 RTOS 内 核 识 别 调 试 ;<br />

* 常 用 代 码 结 构 的 代 码 模 板 ;<br />

* 印 刷 版 以 及 PDF 格 式 的 用 户 参 考 手 册 ;<br />

* 在 线 帮 助 ;<br />

广 泛 的 ARM 内 核 支 持 :<br />

EWARM 支 持 所 有 的 ARM 内 核 , 并 为 绝 大 多 数 的 芯 片 提 供 外 设 级 的 编 译 和 调 试 。<br />

* ARM7 (ARM7TDMI, ARM7TDMI-S and ARM720T)<br />

* ARM9E (ARM926EJ-S, ARM946E-S and ARM966E-S)<br />

* SecurCore (SC100, SC110, SC200, SC210)<br />

* ARM9 (ARM9TDMI, ARM920T, ARM922T and ARM940T)<br />

* ARM10E (ARM1020E AND ARM1022E), ARM11<br />

* CortexM3, Cortex-M1,XScale, Cortex-A8<br />

21


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

下 面 我 们 以 图 解 的 形 式 讲 解 IAR EWARM 开 发 。<br />

1. 在 IAR EWARM 中 生 成 一 个 新 项 目<br />

EWARM 是 按 项 目 进 行 管 理 的 , 它 提 供 了 应 用 程 序 和 库 程 序 的 项 目 模 板 。 项 目 下 面 可 以 分 级 或 分<br />

类 管 理 源 文 件 。 允 许 为 每 个 项 目 定 义 一 个 或 多 个 编 译 连 接 (build) 配 置 。 在 生 成 新 项 目 之 前 , 必 须 建 立<br />

一 个 新 的 工 作 区 (Workspace)。 一 个 工 作 区 中 允 许 存 放 一 个 或 多 个 项 目 。<br />

另 外 用 户 最 好 建 立 一 个 专 用 的 目 录 存 放 自 己 的 项 目 文 件 。 本 章 中 我 们 生 成 一 个 C:\Program files\<br />

IAR System\My project 目 录 。 现 在 双 击 桌 面 上 的 IAR Embedded Workbench 图 标 , 出 现 IAR EWARM<br />

开 发 环 境 窗 口 。<br />

创 建 步 骤 如 下 :<br />

1) 生 成 新 的 工 作 区 (Workspace)<br />

选 择 主 菜 单 File > New > Workspace 生 成 新 工 作 区 。<br />

2) 生 成 新 项 目<br />

a) 选 择 主 菜 单 Project > Create New Project, 弹 出 生 成 新 项 目 窗 口 , 如 图 6.35 所 示 。<br />

本 例 选 择 项 目 模 板 (Project template) 中 的 Empty project。<br />

图 6.35 生 成 新 项 目 窗 口<br />

b) 在 Tool chain 栏 中 选 择 ARM, 然 后 点 击 OK 按 钮 。<br />

c) 在 弹 出 的 另 存 为 窗 口 中 浏 览 和 选 择 新 建 的 My projects 目 录 , 输 入 文 件 名 project1, 然 后 保 存 。<br />

这 时 在 屏 幕 左 边 的 Workspace 窗 口 中 将 显 示 新 建 的 项 目 名 , 如 图 6.36 所 示 。<br />

图 6.36 Workspace 窗 口<br />

22


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

IAR EWARM 提 供 两 种 缺 省 的 项 目 生 成 配 置 , 即 Debug 和 Release。 本 例 在 Workspace 窗 口 顶<br />

部 的 下 拉 菜 单 中 选 取 Debug。 现 在 My projects 目 录 下 已 生 成 一 个 project1.ewp 文 件 。 该 文 件 中 包 含 与<br />

project1 项 目 设 置 有 关 的 信 息 , 如 build 选 件 等 。 项 目 名 后 缀 上 的 * 号 表 示 该 工 作 区 有 改 变 但 还 没 有 被<br />

保 存 。 本 例 调 用 printf 库 函 数 , 这 是 在 C-SPY 模 拟 器 中 的 一 个 低 级 write 函 数 。 如 果 用 户 希 望 在 真 实 硬 件<br />

上 以 release 配 置 运 行 例 子 , 就 必 须 提 供 与 硬 件 相 适 配 的 write 函 数 。<br />

d) 保 存 工 作 区 : 先 选 择 主 菜 单 File > Save Workspace, 浏 览 并 选 择 My projects 目 录 。 然 将 工<br />

作 区 取 名 为 tutorials 输 进 File name 输 入 框 , 按 保 存 按 钮 退 出 。 这 时 在 My projects 目 录 下 将 生 成 一 个<br />

tutorials.eww 文 件 , 该 文 件 中 保 存 了 用 户 添 加 到 tutorials 工 作 区 中 的 所 有 项 目 。 窗 口 和 断 点 放 置 等 与 当<br />

前 操 作 有 关 的 其 他 信 息 则 被 存 储 在 My projects\ settings 目 录 下 的 文 件 中 。<br />

3) 给 项 目 添 加 文 件<br />

本 例 我 们 将 采 用 arm\tutor 目 录 下 的 两 个 源 文 件 ,Tutor.c 和 Utilities.c。<br />

Tutor.c 是 一 个 只 用 到 标 准 C 语 言 的 简 单 程 序 。 它 用 Fibonacci 数 列 的 前 十 个 数 初 始 化 一 个 数 组 ,<br />

并 把 结 果 打 印 到 stdout;Utilities.c 包 含 计 算 Fibonacci 数 列 的 实 用 程 序 。<br />

IAR EWARM 允 许 生 成 若 干 个 源 文 件 组 。 用 户 可 以 根 据 项 目 需 要 来 组 织 自 己 的 源 文 件 。<br />

a) 在 Workspace 中 选 择 希 望 添 加 文 件 的 目 的 地 , 可 以 是 项 目 或 源 文 件 组 。 本 章 直 接 选 project1。<br />

b) 选 择 主 菜 单 Project > Add Files 打 开 标 准 浏 览 窗 口 , 如 图 6.37。 选 择 安 装 目 录 ARM\tutor 下 的<br />

上 述 2 个 文 件 , 点 击 打 开 按 钮 , 把 它 们 添 加 到 Project1 目 录 下 。<br />

图 6.37. 添 加 文 件 窗 口<br />

4) 设 置 项 目 选 件<br />

生 成 新 项 目 和 添 加 文 件 后 就 应 该 为 项 目 设 置 选 件 。IAR EWARM 允 许 为 任 何 一 级 目 录 和 文 件 单 独<br />

设 置 选 件 , 但 是 用 户 必 须 为 整 个 项 目 设 置 通 用 的 编 译 连 接 (build) 选 件 。<br />

a) 选 择 通 用 选 件<br />

选 中 Workspac e 中 的 project1– Debug, 然 后 选 择 主 菜 单 Project>Options, 也 可 以 先 选 择<br />

project1– Debug, 然 后 选 择 鼠 标 右 键 命 令 中 的 Options。<br />

23


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 6.38 项 目 通 用 选 件 窗 口<br />

在 打 开 的 Options 窗 口 左 边 的 Category 中 选 择 General Options。 然 后 分 别 在 :<br />

Target 页 面 /Core 条 目 下 选 择 ARM7TDMI-S;<br />

Output 页 面 中 ,Output file 条 目 下 选 择 Executable;<br />

Library Configuration 页 面 中 ,Library 条 目 下 选 择 Normal。<br />

b) 选 择 编 译 器 选 件<br />

在 Options 窗 口 的 Category 中 选 择 C/C++ Compiler, 如 图 6.39 所 示 。<br />

图 6.39 C/C++ Compiler 选 件 窗 口<br />

然 后 在 :<br />

Language 页 面 中 , 选 择 C,Allow IAR extensions 等 ;<br />

Optimization 页 面 中 , 选 择 Generate debug information;<br />

Output 页 面 中 , 选 择 Output list file 和 Assemble mnemonics;<br />

List 页 面 中 , 选 择 Output list file。 并 选 择 Assembler mnemonics 和 Diagnostics。<br />

24


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

点 击 OK 按 钮 , 确 认 选 择 的 选 件 。<br />

在 设 置 项 目 选 件 窗 口 中 有 许 多 其 他 信 息 。 由 于 本 例 比 较 简 单 , 所 以 不 涉 及 这 些 内 容 。<br />

2. 编 译 和 连 接 应 用 程 序<br />

这 一 步 编 译 和 连 接 (build) 项 目 程 序 , 同 时 生 成 一 个 编 译 器 列 表 文 件 (compiler list file) 和 一 个<br />

连 接 器 存 储 器 分 配 文 件 (linker map file)。<br />

步 骤 如 下 :<br />

1) 编 译 源 文 件<br />

a) 选 中 workspace 中 utilities.c 文 件 。<br />

b) 选 择 主 菜 单 Project > Compile, 或 工 具 条 中 的 Compile 按 钮 , 或 按 右 键 后 选 择 Compile 命<br />

令 。 编 译 结 束 后 在 消 息 窗 口 中 出 现 如 图 6.40 中 的 信 息 。<br />

图 6.40 Build 窗 口 中 的 编 译 处 理 消 息<br />

c) 用 同 样 的 方 法 编 译 tutor.c。<br />

编 译 完 成 后 在 My projects 目 录 下 将 生 成 一 批 新 子 目 录 。 因 为 我 们 在 建 立 新 项 目 时 选 择 Debug 配<br />

置 , 所 以 在 My projects 目 录 下 自 动 生 成 一 个 Debug 子 目 录 。Debug 子 目 录 下 又 包 含 另 3 个 子 目 录 , 名 字<br />

分 别 为 List、Obj、Exe。 它 们 的 用 途 如 下 :<br />

List 目 录 存 下 放 列 表 文 件 , 列 表 文 件 的 后 缀 是 lst;<br />

Obj 目 录 下 存 放 Compiler 和 Assembler 生 成 的 目 标 文 件 , 这 些 文 件 的 后 缀 为 r79, 可 以 用 作 IAR<br />

XLINK 连 接 器 的 输 入 文 件 ;<br />

Exe 目 录 下 存 放 可 执 行 文 件 , 这 些 文 件 的 后 缀 为 d79, 可 以 用 作 IAR C-SPY 调 试 器 的 输 入 文 件 ,<br />

注 意 在 执 行 连 接 处 理 之 前 这 个 目 录 是 空 的 。<br />

点 击 project1–Debug 前 面 的 + 号 将 目 录 展 开 。 你 可 以 从 自 动 生 成 的 Output 目 录 中 看 到 所 有 生 成<br />

的 输 出 文 件 名 以 及 反 映 相 互 依 赖 关 系 的 的 头 文 件 名 。<br />

25


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 6.41 编 译 处 理 后 的 文 件 结 构<br />

2) 查 看 编 译 器 列 表 文 件<br />

现 在 我 们 通 过 改 变 编 译 器 选 件 中 的 优 化 级 别 (Optimization) 来 观 察 list 文 件 是 如 何 自 动 更 新 生<br />

成 的 代 码 量 的 。<br />

a) list 文 件 的 结 构<br />

双 击 Workspace 窗 口 中 的 Utilities.lst, 打 开 list 文 件 , 它 包 含 以 下 信 息 :<br />

文 件 头 : 显 示 编 译 器 的 版 本 信 息 , 列 表 文 件 生 成 时 间 ,source 文 件 、list 文 件 和 object 文 件 的 名<br />

字 和 路 径 , 编 译 命 令 行 及 选 件 等 信 息 。<br />

文 件 体 : 显 示 每 条 源 语 句 生 成 的 汇 编 代 码 和 二 进 制 代 码 , 以 及 变 量 如 何 被 分 配 到 不 同 的 段 。<br />

文 件 尾 : 显 示 所 需 的 堆 栈 、 程 序 代 码 以 及 数 据 存 储 器 的 总 量 , 同 时 报 告 错 误 和 警 告 信 息 。<br />

b) 选 择 主 菜 单 Tools>Options 弹 出 IDE Options 对 话 窗 口 , 选 择 Editor 页 面 。 选 择 Scan for<br />

Change Files 选 件 。 此 选 件 将 自 动 打 开 编 辑 窗 口 中 的 文 件 , 目 前 是 Utilities.lst 文 件 。 按 OK 按 钮 。<br />

26


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 6.42 IDE Option 窗 口<br />

c) 选 中 Workspace 窗 口 中 的 Utilities.c, 按 鼠 标 右 键 选 择 弹 出 框 中 的 Options…。 从 弹 出 的 对 话<br />

框 左 边 的 Category 中 选 择 C/C++ Compiler 并 确 定 Override inherited settings。 打 开 Optimization 页<br />

面 , 把 优 化 级 别 从 None 改 定 为 High。 然 后 按 OK 按 钮 。<br />

d) 重 新 编 译 Utilities.c, 请 注 意 这 时 编 辑 窗 口 中 的 Utilities.lst 文 件 已 经 自 动 被 刷 新 。 文 件 尾 显 示<br />

的 代 码 大 小 已 经 因 优 化 级 别 的 升 高 而 减 小 。<br />

e) 对 本 例 而 言 ,Optimization 应 选 择 None。 所 以 在 连 接 处 理 前 应 该 将 优 化 级 别 恢 复 到 原 来 的<br />

设 置 。 这 时 应 选 中 Utilities.c, 按 鼠 标 右 键 选 择 弹 出 框 中 的 Options…。 选 择 C/C++ Compiler 并 取 消<br />

Override inherited settings。 然 后 重 新 编 译 Utilities.c。<br />

3) 连 接 应 用 程 序<br />

a) 先 选 中 Workspace 窗 口 中 的 Project1– Debug, 然 后 选 择 主 菜 单 Project>Options, 弹 出<br />

Options 对 话 窗 口 , 见 图 6.43。 在 左 边 的 Category 中 选 择 Linker, 显 示 IAR XLINK 的 各 选 件 页 面 。<br />

图 6.43 XLINK 参 数 选 件 窗 口<br />

本 例 全 部 采 用 缺 省 的 连 接 处 理 选 件 。 但 是 仍 需 要 强 调 一 下 输 出 文 件 格 式 和 Linker 命 令 行 文 件 的 选<br />

择 方 法 :<br />

* 输 出 格 式 :<br />

选 择 合 适 的 输 出 格 式 十 分 重 要 。 你 可 能 需 要 将 输 出 文 件 送 给 一 个 调 试 器 进 行 调 试 , 这 时 就 要 求<br />

输 出 格 式 带 有 调 试 信 息 。 本 例 采 用 适 合 C-SPY 调 试 器 的 缺 省 输 出 选 件 , 它 们 是 Debug information for<br />

C-SPY、With runtime control modules 和 With I/O emulation modules, 指 示 需 要 连 接 将 stdin 和 stdout<br />

指 向 C-SPY 的 I/O 窗 口 的 低 级 例 程 。<br />

如 果 用 户 希 望 把 应 用 下 载 到 一 个 PROM 或 Flash 编 程 器 , 则 其 输 出 格 式 不 需 要 带 调 试 信 息 , 如<br />

Intel-hex 或 Motorola S-records。<br />

27


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

EWARM 在 生 成 适 合 C-SPY 调 试 器 的 缺 省 输 出 文 件 的 同 时 , 还 可 以 生 成 第 二 个 输 出 文 件 , 供 编 程<br />

器 或 其 它 调 试 器 使 用 。 第 二 个 输 出 文 件 的 格 式 可 以 在 Extra Output 页 面 中 选 择 。<br />

在 List 页 面 中 选 择 Generate linker listing 和 Segment map( 见 图 6.44), 允 许 生 成 存 储 器 分 配<br />

MAP 文 件 。<br />

图 6.44 XLINK 选 件 中 的 List 页 面<br />

* 连 接 器 命 令 文 件<br />

连 接 器 命 令 文 件 (Linker Command File) 包 含 了 连 接 器 的 各 项 命 令 行 参 数 , 主 要 用 于 控 制 代 码 段<br />

和 数 据 段 在 存 储 器 中 如 何 分 布 。 本 例 使 用 缺 省 的 连 接 器 命 令 文 件 , 请 见 图 6.45 中 的 Config 页 面 。<br />

图 6.45 XLINK 选 件 中 的 Config 页 面<br />

( 注 ) 本 例 连 接 器 命 令 文 件 中 的 定 义 不 与 任 何 特 定 的 硬 件 相 关 联 。EWARM 提 供 的 连 接 器 命 令<br />

文 件 模 板 都 可 以 在 模 拟 器 (simulator) 中 使 用 , 但 是 如 果 要 把 它 们 用 于 目 标 系 统 则 必 须 与 实 际 的 硬 件<br />

存 储 器 分 布 相 适 配 , 因 此 熟 悉 连 接 器 命 令 文 件 的 格 式 和 各 段 的 定 义 十 分 重 要 。 用 户 可 以 从 arm\src\<br />

examples 目 录 中 找 到 与 评 估 板 相 关 的 连 接 器 命 令 文 件 。<br />

用 户 如 果 要 检 查 连 接 器 命 令 文 件 , 需 用 合 适 的 文 本 编 辑 器 , 例 如 IAR EWARM 的 编 辑 器 。 也 可 以<br />

28


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

打 印 出 来 , 检 查 各 项 定 义 是 否 符 合 要 求 。<br />

关 于 连 接 器 命 令 文 件 的 定 制 方 法 和 连 接 器 命 令 行 参 数 的 详 细 语 法 , 请 参 阅 手 册 IAR C/C++<br />

Compiler Reference Guide 和 IAR Linker and Library Tools Reference Guide 的 相 关 章 节 。 最 常 用 的<br />

几 个 连 接 器 命 令 行 参 数 包 括 :<br />

-c: 指 定 目 标 处 理 器 种 类<br />

例 :-carm<br />

-D: 定 义 常 量<br />

例 :-DROMSTART=00000000<br />

-DROMEND=00100000<br />

-Z: 将 段 放 置 在 连 续 的 存 储 器 空 间 中<br />

例 :-Z(CONST)MYSEGA,MYSEGB=008000-0FFFFF<br />

-P: 将 段 放 置 在 非 连 续 的 存 储 器 空 间 中<br />

例 :-P(DATA)MYDATA=100000-101FFF,120000-121FFF<br />

b) 点 击 OK 按 钮 保 存 IAR XLINK 选 件 ;<br />

c) 选 择 主 菜 单 Project>Make 或 鼠 标 右 键 Make 命 令 , 连 接 目 标 文 件 , 生 成 可 执 行 代 码 。<br />

B uild 消 息 窗 口 中 将 显 示 连 接 处 理 的 消 息 。 连 接 的 结 果 将 生 成 一 个 带 调 试 信 息 的 代 码 文 件<br />

project1.d79 和 一 个 存 储 器 分 配 (MAP) 文 件 project1.map。<br />

4) 查 看 MAP 文 件<br />

双 击 Workspace 中 的 project1.map 文 件 名 , 编 辑 器 窗 口 中 将 显 示 该 MAP 文 件 。 从 MAP 文 件 中 我 们<br />

可 以 了 解 以 下 内 容 :<br />

* 文 件 头 中 显 示 连 接 器 版 本 , 输 出 文 件 名 以 及 连 接 命 令 使 用 的 选 件 ;<br />

* CROSS REFERENCE 段 显 示 程 序 入 口 地 址 ;<br />

* RUNTIME MODEL 段 显 示 使 用 的 运 行 时 模 块 的 属 性 ;<br />

* MODULE MAP 段 显 示 所 有 被 连 接 的 文 件 。 每 个 文 件 中 , 作 为 应 用 程 序 一 部 分 加 载 的 有 关 模<br />

块 的 信 息 , 包 括 各 段 和 每 个 段 中 声 明 的 全 局 符 号 都 列 出 来 ;<br />

* SEGMENTS IN ADDRESS ORDER 段 列 出 了 组 成 应 用 程 序 的 所 有 段 的 起 始 地 址 和 结 束 地<br />

址 , 字 节 数 , 类 型 和 对 齐 标 准 等 ;<br />

* END OF CROSS REFERENCE 段 落 显 示 总 的 代 码 和 数 据 字 节 数 。<br />

到 此 为 止 , 已 经 生 成 project1.d79 应 用 程 序 并 可 以 用 于 在 IAR C-SPY 中 调 试 。<br />

3. 用 C-SPY 调 试 应 用 程 序<br />

29


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

本 例 使 用 C-SPY 的 模 拟 器 (Simulator) 来 展 现 IAR C-SPY 调 试 器 的 基 本 特 点 。 前 面 各 节 生 成 的<br />

project1.d79 应 用 程 序 已 经 可 以 用 C-SPY 调 试 器 进 行 调 试 。 用 户 利 用 调 试 器 可 以 查 看 变 量 、 设 置 断 点 、<br />

观 察 反 汇 编 代 码 、 监 视 寄 存 器 和 存 储 器 、 在 Terminal I/O 窗 口 打 印 输 出 。<br />

1) 开 始 调 试<br />

在 开 始 调 试 之 前 必 须 设 置 几 个 C-SPY 选 件 。 具 体 操 作 如 下 :<br />

a) 选 择 主 菜 单 Project>Option, 选 择 Category 中 的 Debugger。 在 Setup 页 面 , 在 Driver 的 下 拉 菜<br />

单 中 选 择 Simulator, 同 时 选 择 Run to main, 点 击 OK。<br />

如 果 用 户 已 经 购 买 了 IAR 的 JTAG 仿 真 器 , 请 选 择 J-Link。<br />

b) 选 择 主 菜 单 Project>Debug 或 工 具 条 上 的 Debugger 按 钮 。IAR C-SPY 将 开 始 装 载 project1.<br />

d79。 除 了 已 经 打 开 的 窗 口 外 , 将 显 示 一 组 C-SPY 专 用 窗 口 。<br />

2) 组 织 窗 口<br />

在 EWARM 中 可 以 固 定 窗 口 ( 所 谓 dock), 也 可 以 组 织 成 书 签 形 式 , 也 可 以 让 它 们 浮 动 。 改 变 浮 动<br />

窗 口 的 大 小 时 其 他 窗 口 不 受 影 响 。<br />

注 意 EWARM IDE 窗 口 最 底 部 的 状 态 条 中 包 含 如 何 安 排 窗 口 的 有 用 信 息 。<br />

在 开 始 调 试 前 请 确 认 如 图 6.52, 所 示 的 各 窗 口 和 内 容 已 经 显 示 在 屏 幕 上 。 在 编 辑 器 窗 口 应 能 看<br />

到 源 文 件 Tutor.c 和 Utilities.c 以 及 Debug Log 消 息 窗 口 。<br />

3) 检 查 源 语 句<br />

a) 检 查 源 语 句 , 双 击 Workspace 中 的 Tutor.c;<br />

b) 在 编 辑 器 显 示 文 件 Tutor.c 后 , 用 Debug>Step Over 命 令 ( 或 F10) 步 进 到 init_fib 函 数 调 用 语<br />

句 ;<br />

c) 用 Debug>Step Into 命 令 ( 或 F11) 进 入 函 数 init_fib;<br />

( 注 )Step Over 命 令 用 来 执 行 源 程 序 中 的 一 条 语 句 或 一 条 指 令 , 即 使 这 条 语 句 是 一 函 数 调 用<br />

语 句 。 而 Step Into 命 令 则 进 入 到 函 数 或 子 程 序 调 用 的 内 部 ;<br />

当 执 行 Step Into 后 , 活 跃 窗 口 已 经 切 换 到 Utilities.c, 因 为 init_fib 在 这 个 文 件 里 。<br />

d) 继 续 用 Step Into 命 令 直 到 for 循 环 语 句 ;<br />

e) 再 用 Step Over 命 令 回 到 for 循 环 的 头 。 请 注 意 , 现 在 是 在 函 数 调 用 级 上 而 不 是 语 句 级 步 进 。<br />

( 注 ) 还 有 一 种 语 句 级 步 进 的 命 令 ,Debug>Next statement 或 工 具 条 上 的 Next statement 按<br />

钮 。 这 条 命 令 与 Step Into 和 Step over 不 同 。<br />

30


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 6.46 C-SPY 调 试 窗 口<br />

4) 检 查 变 量<br />

C-SPY 允 许 在 源 程 序 上 查 看 变 量 或 表 达 式 , 所 以 可 以 在 执 行 程 序 过 程 中 跟 踪 它 们 的 值 的 变 化 。<br />

查 看 变 量 的 方 法 有 几 种 , 在 源 码 窗 口 用 鼠 标 双 击 变 量 名 、 然 后 打 开 Locals、Live Watch 或 Auto 窗 口 。<br />

( 注 ) 当 采 用 None 优 化 级 时 , 所 有 的 非 静 态 变 量 在 它 们 的 活 动 范 围 内 都 是 活 跃 的 , 所 以 这 些 变 量<br />

是 完 全 能 够 调 试 的 。 但 如 果 使 用 更 高 级 别 的 优 化 , 变 量 可 能 不 能 完 全 调 试 。<br />

a) 利 用 Auto 窗 口 查 看 变 量 ;<br />

选 择 View>Auto 打 开 Auto 窗 口 。Auto 窗 口 显 示 最 近 修 改 过 的 表 达 式 的 当 前 值 , 单 步 执 行 程 序 观<br />

察 变 量 如 何 变 化 。<br />

图 6.47 Auto 窗 口 中 检 查 变 量<br />

b) 设 置 一 个 Watchpoint, 利 用 Watch 窗 口 查 看 变 量 ;<br />

选 择 View>Watch 打 开 Watch 窗 口 。 请 注 意 Watch 窗 口 和 Auto 窗 口 按 书 签 形 式 显 示 。 按 以 下 步 骤<br />

在 变 量 i 上 设 置 一 个 Watchpoint。<br />

* 点 击 Watch 窗 口 中 的 虚 线 框 , 当 输 入 区 出 现 时 输 入 i, 然 后 按 Enter 键 。 也 可 以 从 编 辑 器 窗 口 拖<br />

一 个 变 量 到 Watch 窗 口 ;<br />

* 双 击 init_fib 函 数 中 的 root 数 组 名 , 将 其 拖 到 Watch 窗 口 ;<br />

Watch 窗 口 将 显 示 i 和 root 的 值 。 将 root 展 开 观 察 每 个 元 素 的 值 。<br />

31


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 6.48 Watch 窗 口<br />

* 继 续 执 行 单 步 , 观 察 i 和 root 值 的 变 化 ;<br />

* 从 Watch 窗 口 中 除 去 一 个 变 量 时 , 只 需 选 择 它 然 后 删 除 。<br />

5) 设 置 和 监 视 断 点<br />

IAR C-SPY 具 有 强 大 的 断 点 功 能 。 设 置 断 点 最 简 单 的 方 法 是 将 光 标 定 位 到 某 条 语 句 , 然 后 按 鼠 标<br />

右 键 选 择 Toggle Breakpoint 命 令 。 实 验 方 法 如 下 :<br />

a) 设 置 断 点<br />

用 下 面 方 法 在 get_fib(i) 语 句 上 设 置 断 点 。 在 编 辑 器 窗 口 显 示 utilities.c。 点 击 要 设 置 断 点 的 语<br />

句 , 选 择 主 菜 单 Edit>Toggle Breakpoint。 也 可 以 按 工 具 条 上 的 Toggle Breakpoint 按 钮 。 这 时 该 语 句 上<br />

将 出 现 断 点 标 记 。<br />

如 果 要 查 看 刚 定 义 的 断 点 , 选 择 主 菜 单 View>Breakpoint 打 开 Breakpoint 窗 口 。 在 Debug Log 窗<br />

口 也 显 示 有 关 断 点 执 行 的 信 息 。<br />

图 6.49 设 置 断 点<br />

b) 执 行 到 断 点<br />

选 择 主 菜 单 Debug>Go 或 者 工 具 条 上 的 Go 按 钮 都 可 以 让 程 序 执 行 到 断 点 。Watch 窗 口 将 显 示<br />

root 表 达 式 的 值 。Debug Log 窗 口 将 显 示 关 于 断 点 的 信 息 。<br />

c) 消 除 断 点<br />

可 用 主 菜 单 Edit>Toggle Breakpoint 或 按 鼠 标 右 键 选 择 Toggle Breakpoint。<br />

6) 在 反 汇 编 窗 口 上 调 试<br />

32


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

通 常 , 在 C\C++ 程 序 上 调 试 应 该 更 快 速 和 更 直 接 。 但 是 如 果 用 户 希 望 在 反 汇 编 程 序 上 调 试 ,<br />

C-SPY 也 提 供 了 这 种 功 能 , 而 且 C-SPY 允 许 方 便 地 在 两 种 方 式 上 切 换 。 反 汇 编 程 序 的 调 试 方 法 如 下 :<br />

a) 按 Reset 按 钮 复 位 应 用 程 序 。<br />

b) 调 试 时 反 汇 编 窗 口 通 常 是 打 开 的 。 如 果 没 打 开 可 选 择 主 菜 单 View>Disassembly 打 开 反 汇 编<br />

窗 口 。<br />

图 6.50 反 汇 编 窗 口<br />

反 汇 编 窗 口 如 图 6.50 所 示 。 可 以 看 到 汇 编 代 码 与 C 语 句 一 一 对 应 。 用 上 面 介 绍 的 几 种 单 步 命 令<br />

执 行 程 序 观 察 结 果 。<br />

7) 监 视 寄 存 器<br />

寄 存 器 窗 口 允 许 用 户 监 视 和 修 改 CPU 寄 存 器 的 内 容 。 具 体 方 法 如 下 :<br />

a) 选 择 主 菜 单 View>Register 打 开 寄 存 器 窗 口 , 如 图 6.51;<br />

图 6.51 寄 存 器 窗 口<br />

b) 用 Step Over 命 令 执 行 下 一 条 指 令 , 观 察 寄 存 器 窗 口 中 的 数 据 如 何 变 化 ;<br />

c) 关 闭 寄 存 器 窗 口 。<br />

8) 查 看 存 储 器<br />

33


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

用 户 可 以 在 存 储 器 窗 口 监 视 所 选 择 的 存 储 器 区 域 。 下 面 是 检 查 与 变 量 root 有 关 的 存 储 器 内 容 。<br />

a) 选 择 主 菜 单 View>Memory 打 开 存 储 器 窗 口 , 见 图 6.52( 用 8-bit 显 示 数 据 );<br />

b) 激 活 Utilities.c 窗 口 并 双 击 变 量 root。 用 鼠 标 将 其 拖 到 存 储 器 窗 口 ;<br />

c) 如 果 希 望 以 16-bit 显 示 数 据 , 在 存 储 器 窗 口 顶 部 的 下 拉 菜 单 中 选 择 2x Units 命 令 。<br />

如 果 C 应 用 程 序 的 init_fib 函 数 没 有 初 始 化 所 有 的 存 储 器 单 元 , 继 续 执 行 单 步 , 同 时 观 察 存 储 器<br />

的 内 容 是 如 何 修 改 的 。 用 户 可 以 在 存 储 器 窗 口 修 改 存 储 单 元 的 内 容 。 只 需 把 插 入 点 放 在 希 望 修 改 的 地<br />

方 , 然 后 输 入 新 值 就 可 以 了 。<br />

d) 关 闭 存 储 器 窗 口 。<br />

图 6.52 8 位 模 式 显 示 存 储 器 窗 口<br />

图 6.53 16 位 模 式 显 示 存 储 器 窗 口<br />

9) 观 察 Terminal I/O<br />

用 户 有 时 可 能 希 望 调 试 应 用 程 序 中 的 stdin 和 stdout, 但 是 又 没 有 实 际 的 硬 件 支 持 。C-SPY 允 许 用<br />

户 使 用 Terminal I/O 模 拟 stdin 和 stdout。<br />

( 注 )Terminal I/O 只 有 在 使 用 了 连 接 输 出 文 件 选 件 With I/O emulation module 时 才 可 用 。 也 就 是<br />

说 , 某 些 把 stdin 和 stdout 指 向 Terminal I/O 的 低 级 例 程 将 被 连 接 进 应 用 程 序 。<br />

a) 选 择 主 菜 单 View>Terminal I/O 显 示 I/O 操 作 的 输 出 , 如 图 6.54。<br />

Terminal I/O 窗 口 显 示 的 内 容 取 决 于 应 用 程 序 执 行 了 多 远 。<br />

图 6.54. Terminal I/O 窗 口<br />

34


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

10) 执 行 程 序 到 结 束<br />

a) 选 择 主 菜 单 Debug>Go 或 工 具 条 上 的 Go 按 钮 。 因 为 只 有 一 个 断 点 , 所 以 程 序 一 直 执 行 到 结<br />

束 。 同 时 在 Debug Log 窗 口 显 示 已 经 到 达 程 序 exit 的 消 息 , 见 图 6.55。<br />

图 6.55 Debug Log 窗 口<br />

b) 如 果 要 求 复 位 应 用 程 序 , 选 择 主 菜 单 Debug>Reset 或 工 具 条 上 的 Reset 按 钮 。<br />

c) 如 果 要 退 出 C-SPY, 选 择 Debug>Stop Debugging, 或 工 具 条 上 的 Stop Debugging 按 钮 。<br />

C-SPY 还 提 供 许 多 其 他 的 调 试 功 能 , 如 宏 和 中 断 模 拟 等 , 请 参 考 相 关 技 术 资 料 。<br />

6.2.3 ARM ADS 开 发 环 境 介 绍<br />

A D S 集 成 开 发 环 境 是 A R M 公 司 推 出 的 A R M 核 微 控 制 器 集 成 开 发 工 具 , 英 文 全 称 为 A R M<br />

Developer Suite, 成 熟 版 本 为 ADS1.2, 用 来 取 代 之 前 的 ARM SDT, 它 是 一 种 快 速 而 节 省 成 本 的 完 整<br />

软 件 开 发 解 决 方 案 。<br />

ARM ADS 起 源 于 ARM SDT, 它 对 SDT 的 模 块 进 行 了 增 强 , 并 替 换 了 一 些 SDT 的 组 成 部 分 , 用 户 可<br />

以 感 受 到 的 最 大 的 变 化 是 :ADS 使 用 CodeWarrior IDE 集 成 开 发 环 境 代 替 了 SDT 的 APM, 使 用 AXD 替<br />

换 了 ADW。 现 成 集 成 开 发 环 境 的 一 些 基 本 特 性 在 ADS 中 才 得 以 体 现 , 如 源 文 件 编 辑 器 语 法 高 亮 和 窗 口<br />

驻 留 等 功 能 。<br />

ADS1.2 支 持 ARM10 之 前 的 所 有 ARM 系 列 微 控 制 器 , 支 持 软 件 调 试 及 JTAG 硬 件 仿 真 调 试 , 支 持<br />

汇 编 、C、C++ 源 程 序 , 具 有 编 译 效 率 高 、 系 统 库 功 能 强 等 特 点 , 可 以 在 Windows98、Windows XP、<br />

Windows2000、 及 RedHat Linux 上 运 行 。<br />

这 里 将 详 细 介 绍 使 用 ADS1.2 建 立 工 程 , 编 译 连 接 设 置 , 调 试 操 作 等 等 。<br />

1.ADS 1.2 集 成 开 发 环 境 的 组 成<br />

ADS 1.2 由 6 个 部 分 组 成 , 如 表 5.1 所 示 。<br />

表 5.1 ADS 1.2 的 组 成 部 分<br />

名 称 描 述 使 用 方 法<br />

代 码 生 成 工 具<br />

ARM 汇 编 器 ,<br />

ARM 的 C、C++ 编 译 器 ,<br />

Thumb 的 C、C++ 编 译 器 ,<br />

ARM 连 接 器<br />

由 CodeWarrior IDE 调 用<br />

35


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

名 称 描 述 使 用 方 法<br />

集 成 开 发 环 境 CodeWarrior IDE 工 程 管 理 , 编 译 连 接<br />

调 试 器<br />

AXD,<br />

ADW/ADU,armsd<br />

仿 真 调 试<br />

指 令 模 拟 器 ARMulator 由 AXD 调 用<br />

ARM 开 发 包 一 些 底 层 的 例 程 ,<br />

实 用 程 序 ( 如 fromELF)<br />

一 些 实 用 程 序 由 CodeWarrior<br />

IDE 调 用<br />

ARM 应 用 库 C、C++ 函 数 库 等 用 户 程 序 使 用<br />

由 于 使 用 者 一 般 直 接 操 作 的 是 CodeWarrior IDE 集 成 开 发 环 境 和 AXD 调 试 器 , 所 以 这 节 只 介 绍 这<br />

两 部 分 软 件 的 使 用 。<br />

1)CodeWarrior IDE 简 介<br />

ADS 1.2 使 用 了 CodeWarrior IDE 集 成 开 发 环 境 , 并 集 成 了 ARM 汇 编 器 、ARM 的 C/C++ 编 译 器 、<br />

Thumb 的 C/C++ 编 译 器 、ARM 连 接 器 , 包 含 工 程 管 理 器 、 代 码 生 成 接 口 、 语 法 敏 感 ( 对 关 键 字 以 不 同 颜<br />

色 显 示 ) 编 辑 器 、 源 文 件 和 类 浏 览 器 等 等 。<br />

CodeWarrior IDE 主 窗 口 如 图 6.56 所 示 。<br />

图 6.56 CodeWarrior 开 发 环 境<br />

2)AXD 调 试 器 简 介<br />

AXD 调 试 器 为 ARM 扩 展 调 试 器 ( 即 ARM eXtended Debugger), 包 括 ADW/ADU 的 所 有 特 性 , 支 持<br />

硬 件 仿 真 和 软 件 仿 真 (ARMulator)。AXD 能 够 装 载 映 像 文 件 到 目 标 内 存 , 具 有 单 步 、 全 速 和 断 点 等 调 试<br />

功 能 , 可 以 观 察 变 量 、 寄 存 器 和 内 存 的 数 据 等 等 。<br />

AXD 调 试 器 主 窗 口 如 图 6.57 所 示 。<br />

36


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 6.57 AXD 调 试 器<br />

2. 工 程 的 编 辑<br />

1) 建 立 工 程<br />

点 击 W I N D O W S 操 作 系 统 的 【 开 始 】->【 程 序 】->【A R M D e v e l o p e r S u i t e v 1. 2】-><br />

【CodeWarrior for ARM Developer Suite】 起 动 Metrowerks CodeWarrior 或 双 击 “CodeWarrior for<br />

ARM Developer Suite” 快 捷 方 式 起 动 。 启 动 ADS1.2 IDE 如 图 6.58 所 示 。<br />

图 6.58 启 动 ADS1.2 IDE<br />

点 击 【File】 菜 单 , 选 择 【New…】 即 弹 出 New 对 话 框 , 如 图 6.59 所 示 。<br />

图 6.59 New 对 话 框<br />

选 择 工 程 模 板 为 ARM 可 执 行 映 象 (ARM Executable Image) 或 Thumb 可 执 行 映 象 ( Thumb<br />

Executable Image) 或 Thumb、ARM 交 织 映 象 (Thumb ARM Interworking Image), 然 后 在 【Location】<br />

项 选 择 工 程 存 放 路 径 , 并 在 【Project name】 项 输 入 工 程 名 称 , 点 击 【 确 定 】 按 钮 即 可 建 立 相 应 工 程 ,<br />

37


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

工 程 文 件 名 后 缀 为 mcp( 下 文 有 时 也 把 工 程 称 为 项 目 ) 。<br />

2) 建 立 文 件<br />

建 立 一 个 文 本 文 件 , 以 便 输 入 用 户 程 序 。 点 击 “New Text File” 图 标 按 钮 , 如 图 6.60 所 示 。<br />

图 6.60 “New Text File” 图 标 按 钮<br />

然 后 在 新 建 的 文 件 中 编 写 程 序 , 点 击 “ S a v e” 图 标 按 钮 将 文 件 存 盘 ( 或 从 【F i l e】 菜 单 选 择<br />

【Save】), 输 入 文 件 全 名 , 如 main.c。 注 意 , 请 将 文 件 保 存 到 相 应 工 程 的 目 录 下 , 以 便 于 管 理 和 查 找 。<br />

当 然 , 您 也 可 以 用 New 对 话 框 选 择 【File】 页 来 建 立 源 文 件 , 如 图 5.4 所 示 , 或 使 用 其 它 文 本 编 辑 器<br />

建 立 或 编 辑 源 文 件 。<br />

3) 添 加 文 件 到 工 程<br />

如 图 6 . 61 所 示 , 在 工 程 窗 口 中 【F i l e s】 页 空 白 处 点 击 鼠 标 右 键 , 弹 出 浮 动 菜 单 , 选 择 “A d d<br />

Files…” 即 可 弹 出 “Select files to add…” 对 话 框 , 选 择 相 应 的 源 文 件 ( 可 按 着 Ctrl 键 一 次 选 择 多 个 文<br />

件 ), 点 击 【 打 开 】 按 钮 即 可 。<br />

另 外 , 用 户 也 可 以 在 【Project】 菜 单 中 选 择 【Add Files…】 来 添 加 源 文 件 , 或 使 用 New 对 话 框 选 择<br />

【File】 页 来 建 立 源 文 件 时 选 择 加 入 工 程 ( 即 选 中 “Add to Project” 项 )。 添 加 完 毕 后 如 图 6.62 所 示 。<br />

图 6.61 在 工 程 窗 口 中 添 加 源 文 件<br />

38


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 6.62 完 整 的 工 程 文 件<br />

4) 编 译 连 接 工 程<br />

如 图 6.63 所 示 为 工 程 窗 口 中 的 图 标 按 钮 , 通 过 这 些 图 标 按 钮 , 您 可 以 快 速 的 进 行 工 程 设 置 、 编 译<br />

连 接 、 启 动 调 试 等 等 ( 在 不 同 的 菜 单 项 上 可 以 分 别 找 到 对 应 的 菜 单 命 令 )。 它 们 从 左 至 右 分 别 为 ( 其 中 加<br />

粗 的 为 经 常 用 到 的 ):<br />

a) DebugRel Settings… 工 程 设 置 , 如 地 址 设 置 、 输 出 文 件 设 置 、 编 译 选 项 等 , 其 中 DebugRel 为<br />

当 前 的 生 成 目 标 (target system)。<br />

b) Synchronize Modification Dates 同 步 修 改 日 期 , 检 查 工 程 中 每 个 文 件 的 修 改 日 期 , 若 发 现 有 更<br />

新 ( 如 使 用 其 它 编 辑 器 编 辑 源 文 件 ), 则 在 Touch 栏 标 记 “√”。<br />

c) Make 编 译 连 接 ( 快 捷 键 为 F7)。<br />

d) Debug 启 动 AXD 进 行 调 试 ( 快 捷 键 为 F5)。<br />

e) Run 启 动 AXD 进 行 调 试 , 并 直 接 运 行 程 序 。<br />

Project Inspector 工 程 检 查 , 查 看 和 配 置 工 程 中 源 文 件 的 信 息 。<br />

图 6.63 工 程 窗 口 中 的 图 标 按 钮<br />

但 是 这 样 的 工 程 还 并 不 能 正 确 地 被 编 译 , 还 需 要 对 工 程 的 编 译 选 项 进 行 适 当 配 置 。 点 击<br />

“DebugRel Settings…” 图 标 按 钮 , 即 可 进 行 工 程 的 地 址 设 置 、 输 出 文 件 设 置 、 编 译 选 项 等 , 如 图 6.64<br />

所 示 。<br />

首 先 选 中 Target Setting, 将 其 中 的 Post-linker 设 置 为 ARM fromELF, 使 得 工 程 在 连 接 后 再 通 过<br />

fromELF 产 生 二 进 制 代 码 , 如 图 6.65 所 示 。 接 着 在 ARM fromELF 项 中 设 置 输 出 文 件 类 型 , 如 Intel 32<br />

39


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

bit Hex。 然 后 设 置 输 出 文 件 名 到 指 定 目 录 , 若 不 指 定 目 录 , 则 生 成 文 件 存 放 在 当 前 工 程 的 目 录 中 , 然 后<br />

再 选 中 ARM Linker, 对 连 接 器 进 行 设 置 , 如 图 6.66 所 示 ,mem_b.scf 内 包 含 了 存 储 器 地 址 分 配 。<br />

图 6.64 DebugRel Settings 窗 口<br />

图 6.65 ARM fromELF 窗 口<br />

图 6.66 ARM Linker 窗 口<br />

对 于 简 单 的 软 件 调 试 , 可 以 不 进 行 连 接 地 址 的 设 置 , 直 接 点 击 工 程 窗 口 的 “Make” 图 标 按 钮 , 即<br />

可 完 成 编 译 连 接 。 若 编 译 出 错 , 会 有 相 应 的 出 错 提 示 , 双 击 出 错 提 示 行 信 息 , 编 辑 窗 即 会 使 用 光 标 指 出<br />

40


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

当 前 出 错 的 源 代 码 行 , 编 译 连 接 输 出 窗 口 如 图 6.67 所 示 。 同 样 , 可 以 在 【Project】 菜 单 中 找 到 相 应 的 命<br />

令 。<br />

图 6.67 编 译 连 接 输 出 窗 口<br />

5) 打 开 旧 工 程<br />

点 击 【File】 菜 单 , 选 择 【Open…】 即 弹 出 “ 打 开 ” 对 话 框 , 找 到 相 应 的 工 程 文 件 (*.mcp), 单 击 【 打<br />

开 】 即 可 。 在 工 程 窗 口 的 【Files】 页 中 , 双 击 源 程 序 的 文 件 名 即 可 打 开 该 文 件 进 行 编 辑 。<br />

3. 工 程 的 调 试<br />

1) 选 择 调 试 目 标<br />

当 工 程 编 译 连 接 通 过 后 , 在 工 程 窗 口 中 点 击 “Debug” 图 标 按 钮 , 即 可 启 动 AXD 进 行 调 试 ( 也 可 以<br />

通 过 【 开 始 】 菜 单 起 动 AXD)。 点 击 菜 单 【Options】 选 择 【Configure Target…】, 即 弹 出 Choose Target<br />

窗 口 , 如 图 6.68 所 示 。 在 没 有 添 加 其 它 仿 真 驱 动 程 序 前 ,Target 项 中 只 有 两 项 , 分 别 为 ADP(JTAG 硬 件<br />

仿 真 ) 和 ARMUL( 软 件 仿 真 ), 本 例 程 中 添 加 的 是 H-JTAG 仿 真 器 驱 动 。<br />

图 6.68 Choose Target 窗 口<br />

2) 调 试 界 面 及 工 具 条<br />

调 试 界 面 如 图 6.69 所 示 , 关 于 调 试 介 绍 请 参 考 有 关 技 术 资 料 。<br />

41


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 6.69 调 试 界 面<br />

6.2.5 Keil µVision 开 发 环 境 介 绍<br />

Keil 公 司 的 µVision 开 发 环 境 是 业 界 最 受 欢 迎 的 51 单 片 机 开 发 工 具 之 一 , 它 拥 有 流 畅 的 用 户 界 面 与<br />

强 大 的 仿 真 功 能 , 目 前 Keil 公 司 已 被 ARM 公 司 收 购 , 开 发 环 境 的 最 新 版 本 为 µVision4。<br />

µVision4 集 成 开 发 环 境 (IDE), 用 来 在 微 控 制 器 和 智 能 卡 设 备 上 创 建 、 仿 真 和 调 试 嵌 入 式 应 用 。<br />

µVision4 IDE 是 为 增 强 开 发 人 员 的 工 作 效 率 设 计 的 , 有 了 它 可 以 更 快 速 、 更 高 效 地 开 发 和 检 验 程 序 。<br />

通 过 µVision4 IDE 中 引 入 的 灵 活 的 窗 口 管 理 系 统 , 开 发 人 员 可 以 使 用 多 台 监 视 器 , 在 可 视 界 面 任 何 地<br />

方 全 面 控 制 窗 口 放 置 。 新 用 户 界 面 可 以 更 好 地 利 用 屏 幕 空 间 , 更 有 效 地 组 织 多 个 窗 口 , 为 开 发 应 用 提<br />

供 整 齐 高 效 的 环 境 。<br />

µVision4 在 µVision3 的 成 功 经 验 的 基 础 上 增 加 了 :<br />

* System Viewer( 系 统 查 看 程 序 ) 窗 口 , 提 供 了 设 备 外 围 寄 存 器 信 息 , 这 些 信 息 可 以 在 System<br />

Viewer 窗 口 内 部 直 接 更 改 。<br />

* Debug Restore Views( 调 试 恢 复 视 图 ) 允 许 保 存 多 个 窗 口 布 局 , 为 程 序 分 析 迅 速 选 择 最 适 合 的<br />

调 试 视 图 。<br />

* Multi-Project Workspace( 多 项 目 工 作 空 间 ) 为 处 理 多 个 并 存 的 项 目 提 供 了 简 化 的 方 法 , 如 引 导<br />

加 载 程 序 和 应 用 程 序 。<br />

* 为 基 于 ARM Corte-M 处 理 器 的 MCU 提 供 了 Data and instruction trace( 数 据 和 指 令 追 踪 ) 功<br />

能 。<br />

* 扩 展 了 Device Simulation( 设 备 仿 真 ) 功 能 以 支 持 许 多 新 设 备 , 如 Luminary、 恩 智 浦 和 东 芝 生<br />

产 的 基 于 ARM Cortex-M3 处 理 器 的 MCU、Atmel SAM7/9 及 新 的 8051 衍 生 品 , 如 Infineon XC88x 和<br />

SiLABS 8051Fxx。<br />

42


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

* 支 持 许 多 debug adapter interfaces( 调 试 适 配 器 接 口 ), 包 括 ADI miDAS Link、Atmel SAM-<br />

ICE、Infineon DAS 和 ST-Link。<br />

6.2.6 Green Hills MULTI 开 发 环 境 介 绍<br />

Green Hills 公 司 成 立 于 1982 年 , 是 最 先 提 供 32 位 微 处 理 器 编 译 器 技 术 的 公 司 ,Green Hills 公 司<br />

提 供 多 种 嵌 入 式 系 统 工 具 , 包 括 RTOS、 编 译 器 、 调 试 器 、 集 成 开 发 环 境 等 。<br />

Green Hills 的 MULTI 集 成 环 境 综 合 了 软 件 开 发 和 调 试 过 程 中 要 用 到 的 各 种 工 具 , 如 源 级 调 试 器 、<br />

工 程 管 理 器 、 版 本 控 制 器 、 文 本 编 辑 器 、 性 能 分 析 器 、 图 形 浏 览 器 、 运 行 出 错 检 测 器 、ARM 指 令 集 仿 真<br />

器 以 及 底 层 调 试 接 口 等 。 用 户 可 方 便 地 在 MULTI 环 境 中 利 用 上 述 工 具 来 开 发 应 用 程 序 。<br />

MULTI 开 发 环 境 主 要 特 点 :<br />

* 提 供 标 准 开 放 接 口 , 允 许 用 户 在 集 成 环 境 中 使 用 自 己 熟 悉 的 工 具 构 件 。 用 户 可 使 用 自 己 熟 悉 的<br />

编 辑 器 、 生 成 系 统 、 配 置 管 理 工 具 等 , 在 项 目 开 发 中 不 受 某 一 ICE、RTOS 和 处 理 器 的 限 制 。<br />

* 提 供 在 线 帮 助 。<br />

* 既 可 使 用 Green Hills 的 Optimizing Compilers 编 译 器 , 也 可 使 用 其 它 支 持 EABI 标 准 的 编 译<br />

器 。<br />

* 支 持 多 进 程 调 试 。 为 每 一 个 进 程 提 供 一 个 独 立 的 调 试 窗 口 , 每 个 进 程 都 可 独 立 进 行 单 步 执 行 、<br />

断 点 设 置 、 变 量 检 查 , 可 观 察 进 程 间 通 信 状 况 。<br />

* 支 持 多 处 理 器 系 统 的 调 试 。<br />

* 支 持 多 种 第 三 方 产 品 , 如 ClearCase,SNIFF+,CAE PLUS Timing Accurate Simulators,<br />

Editors(vi、emacs、brief、etc.),In-Circuit Emulators,Processor Probes,Hardware/software Cosimulation<br />

tools 等 。<br />

6.3 ReaIView MDK 与 ADS 比 较<br />

RealView MDK 与 ADS 相 比 较 , 从 外 观 、 仿 真 流 程 以 及 内 部 二 进 制 编 译 链 接 工 具 上 都 有 了 不 少 改<br />

进 , 用 法 稍 有 不 同 , 主 要 表 现 在 如 下 几 个 方 面 :<br />

1. 工 具 结 构 的 改 进<br />

作 为 ARM 的 新 一 代 微 控 制 器 开 发 工 具 ,RealView MDK 不 但 包 含 ARM 的 最 新 版 本 编 译 链 接 工 具 ,<br />

即 RVDS3.0 的 编 译 链 接 工 具 , 而 且 根 据 微 控 制 器 调 试 开 发 的 特 点 采 用 了 与 ADS、RVDS 完 全 不 同 的 调<br />

试 、 仿 真 环 境 ,μVision debugger 与 simulator。 因 此 ,MDK 与 ADS 在 工 具 架 构 组 成 上 有 一 些 不 同 , 包 括<br />

了 不 同 的 工 程 管 理 器 , 不 同 版 本 的 ARM 编 译 器 (compiler), 不 同 的 调 试 器 (debugger), 不 同 的 仿 真<br />

器 (simulator), 以 及 不 同 的 硬 件 调 试 单 元 。<br />

43


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

2.POSIX 格 式<br />

MDK 集 成 了 RVDS 的 编 译 工 具 RVCT, 与 ADS 相 比 除 去 编 译 、 链 接 工 具 的 可 执 行 二 进 制 文 件 不 同<br />

之 外 , 两 个 不 同 版 本 编 译 器 的 很 多 编 译 链 接 选 项 也 有 所 不 同 。RVCT 采 用 了 POSIX 格 式 的 编 译 链 接<br />

选 项 , 所 有 的 多 字 符 选 项 前 必 须 使 用 双 下 划 线 。 例 如 :ADS 的 编 译 选 项 -cpu, 在 MDK 中 需 要 改 写 成 --<br />

cpu, 否 则 用 户 在 MDK 中 直 接 使 用 ADS 的 makefile 时 , 工 具 会 产 生 一 个 如 下 警 告 :Warning:L3910W:Old<br />

syntax,please use ‘--cpu’。<br />

3.ARM ABI 的 变 化<br />

ARM ABI 是 Application Binary Interface for the ARM Architecture 的 简 称 , 是 一 系 列 ARM 体 系<br />

架 构 标 准 的 集 合 , 囊 括 了 ARM 二 进 制 代 码 交 互 、 开 发 工 具 以 及 操 作 系 统 等 方 面 。<br />

对 目 标 文 件 进 行 链 接 之 前 ,MDK 工 具 的 链 接 器 会 严 格 检 查 各 个 目 标 文 件 (objects), 判 断 它 们 是<br />

否 符 合 ARM 体 系 结 构 的 ABI 标 准 。 而 MDK 与 ADS 编 译 链 接 工 具 所 遵 循 的 ARM ABI 是 不 同 版 本 的 。 使 用<br />

者 可 以 通 过 简 单 修 改 代 码 并 重 新 编 译 链 接 , 或 者 使 用 特 殊 的 编 译 选 项 来 解 决 。<br />

4. 分 散 加 载 注 意 事 项<br />

MDK 同 样 支 持 ADS 的 分 散 加 载 文 件 , 但 是 当 分 散 加 载 文 件 中 涉 及 到 必 须 被 放 置 在 ROOT Region<br />

中 的 C 库 函 数 时 , 有 时 使 用 者 需 要 作 少 量 修 改 。<br />

ROOT Region 的 load address 与 execution address 相 同 , 所 以 这 部 分 代 码 在 系 统 初 始 化 时 无 须<br />

进 行 搬 移 操 作 , 很 多 库 函 数 , 如 _ _scatter*.o 或 者 _ _dc*.o, 必 须 被 放 置 在 Root Region 中 。<br />

5.C 库 函 数 的 差 异<br />

ADS 中 的 _ _rt_* 库 函 数 被 替 换 为 _ _ae abi_*。 如 果 使 用 者 的 ADS 工 程 中 曾 经 重 定 义 (retarget) 过<br />

这 些 库 函 数 , 那 么 在 移 植 到 MDK 时 , 需 要 重 新 实 现 这 些 函 数 , 以 满 足 新 ABI 的 要 求 。<br />

6.4 MCU 硬 件 开 发 调 试 工 具 介 绍<br />

MCU 硬 件 开 发 调 试 首 选 工 具 是 仿 真 器 , 一 般 植 于 MCU 和 总 线 之 间 的 电 路 中 , 用 于 监 视 和 控 制 所<br />

有 信 号 的 输 入 和 输 出 , 以 及 MCU 的 内 部 工 作 情 况 和 软 件 的 执 行 状 态 。 因 为 它 是 异 体 , 可 能 会 引 起 不 稳<br />

定 。 但 是 仿 真 器 在 总 线 级 别 上 给 出 一 个 系 统 正 在 发 生 情 况 的 清 晰 的 描 绘 , 为 解 决 硬 件 故 障 提 供 强 有 力<br />

的 工 具 大 大 缩 短 了 开 发 周 期 。<br />

ARM 的 硬 件 开 发 工 具 主 要 包 括 两 类 仿 真 器 , 一 是 JTAG 仿 真 器 , 二 是 全 功 能 在 线 仿 真 器 , 前 者 是<br />

利 用 ARM 处 理 器 中 的 调 试 模 块 的 功 能 , 通 过 其 JTAG 边 界 扫 描 口 来 与 仿 真 器 连 接 。 这 种 方 式 的 仿 真<br />

器 比 较 便 宜 , 连 接 比 较 方 便 。 但 由 于 仅 通 过 十 几 条 线 来 调 试 , 因 而 功 能 有 局 限 。 目 前 ARM 处 理 器 的<br />

JTAG 仿 真 器 在 市 场 上 比 较 流 行 的 是 EPI 公 司 的 JEENI 和 MAJIC, 著 名 的 德 国 Lauterbach 公 司 有 一 款 通<br />

44


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

用 JTAG/BDM/ONCE 仿 真 器 TRACE32-ICD 也 能 够 很 好 的 支 持 ARM 系 列 处 理 器 。 对 于 全 功 能 在 线 仿<br />

真 器 来 说 , 由 于 其 访 真 头 完 全 取 代 目 标 板 上 的 CPU, 因 而 功 能 非 常 强 大 。 但 这 类 仿 真 器 为 了 能 够 全 速<br />

仿 真 时 钟 速 度 高 于 100MHz 的 处 理 器 , 通 常 必 须 采 用 极 其 复 杂 的 设 计 和 工 艺 , 因 而 其 价 格 比 较 昂 贵 ,<br />

Lauterbach 公 司 的 TRACE32-Fire 就 是 这 类 产 品 的 佼 佼 者 。<br />

JTAG(Joint Test Action Group- 联 合 测 试 行 动 小 组 ) 是 一 种 国 际 标 准 测 试 协 议 (IEEE 1149.1 兼<br />

容 ), 主 要 用 于 芯 片 内 部 测 试 。 现 在 多 数 的 高 级 器 件 都 支 持 JTAG 协 议 , 如 DSP、FPGA 器 件 等 , 标 准 的<br />

JTAG 接 口 是 4 线 :TMS、TCK、TDI、TDO, 分 别 为 模 式 选 择 、 时 钟 、 数 据 输 入 和 数 据 输 出 线 。<br />

JTAG 最 初 是 用 来 对 芯 片 进 行 测 试 的 , 基 本 原 理 是 在 器 件 内 部 定 义 一 个 TAP(Test Access Port-<br />

测 试 访 问 口 ) 通 过 专 用 的 JTAG 测 试 工 具 对 内 部 节 点 进 行 测 试 。JTAG 测 试 允 许 多 个 器 件 通 过 JTAG 接 口<br />

串 联 在 一 起 , 形 成 一 个 JTAG 链 , 能 实 现 对 各 个 器 件 分 别 测 试 。 现 在 ,JTAG 接 口 还 常 用 于 实 现 ISP(In-<br />

System rogrammable— 在 线 编 程 ), 对 FLASH 等 器 件 进 行 编 程 。<br />

JTAG 编 程 方 式 是 在 线 编 程 , 传 统 生 产 流 程 中 先 对 芯 片 进 行 预 编 程 现 再 装 到 板 上 因 此 而 改 变 , 简<br />

化 的 流 程 为 先 固 定 器 件 到 电 路 板 上 , 再 用 JTAG 编 程 , 从 而 大 大 加 快 工 程 进 度 。<br />

下 面 简 单 介 绍 几 款 仿 真 器 :<br />

1.ULINK<br />

ULINK 仿 真 器 是 由 Keil 公 司 开 发 ,KEIL(ARM 子 公 司 ) 嵌 入 式 开 发 工 具 专 业 制 造 商 ,Keil 软 件 公 司<br />

的 产 品 包 括 C 编 译 器 、 宏 汇 编 器 、 实 时 内 核 、 调 试 器 、 模 拟 器 、 集 成 开 发 环 境 以 及 8051、251、ARM7/<br />

ARM9/Cortex-M3 和 XC16x/C16x/ST10 系 列 微 控 制 器 仿 真 开 发 装 置 。<br />

Keil ULINK USB 接 口 仿 真 器 , 一 款 多 功 能 ARM 调 试 工 具 , 可 以 通 过 JTAG 或 CODS 接 口 连 接 到 目<br />

标 系 统 仿 真 或 下 载 程 序 , 目 前 已 经 成 为 国 内 主 流 的 ARM 开 发 工 具 , 实 物 图 如 图 6.70 所 示 。Keil ULINK<br />

的 软 件 环 境 为 Keil uVision3。ULINK 与 其 他 仿 真 器 特 点 比 较 如 表 6.2 所 示 。<br />

图 6.70 ULINK 实 物 图<br />

45


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

表 6.2 ULINK 与 其 他 仿 真 器 特 点 比 较<br />

接 口 类 型<br />

开 发 环 境<br />

支 持 的 编 译 器<br />

ULINK<br />

USB 口<br />

Keil uVision3/4<br />

KEIL CARM 编 译 器<br />

RealView 编 译 器 GNU<br />

编 译 器<br />

备 注<br />

目 前 市 场 上 , 大 多 数 仿 真 器 与 PC 的 接 口 为 并 口 或 串 口 , 在 很 多 笔<br />

记 本 上 , 这 两 种 接 口 已 趋 于 淘 汰 。USB 接 口 的 仿 真 器 不 仅 可 灵 活 用<br />

于 各 种 品 牌 的 笔 记 本 上 , 还 方 便 携 带 , 便 于 现 场 调 试 开 发 。<br />

Keil uVision3/4 已 经 成 为 目 前 国 内 最 流 行 的 嵌 入 式 软 件 开 发 平 台 ,<br />

平 台 的 人 机 交 互 界 面 非 常 人 性 化 , 且 编 译 器 性 能 优 异 , 编 译 出 代 码<br />

的 大 小 及 执 行 速 率 , 系 统 运 行 稳 定 度 均 领 先 于 市 场 上 同 类 产 品 。<br />

与 其 他 的 仿 真 器 相 比 ,Keil ULINK 的 uVision3/4 开 发 平 台 支 持 多 款<br />

编 译 器 。 客 户 可 以 根 据 自 己 的 喜 好 选 择 。<br />

另 外 ULINK 还 具 有 的 一 些 特 点 如 下 :<br />

* USB 通 讯 接 口 高 速 下 载 用 户 代 码 ;<br />

* 存 储 区 域 / 寄 存 器 查 看 ;<br />

* 快 速 单 步 程 序 运 行 ;<br />

* 多 种 程 序 断 点 ;<br />

* 片 内 Flash 编 程 ;<br />

* 支 持 数 十 家 公 司 的 芯 片 , 不 仅 支 持 ARM 内 核 ,Cortex-M3 内 核 , 还 支 持 某 些 8 位 或 16 位 单 片<br />

机 , 如 ST 公 司 的 uPSD 系 列 ,Infinion 公 司 的 XC886 系 列 。<br />

2.IAR J-Link 仿 真 器<br />

I A R J - Link 仿 真 器 是 一 款 用 于 A R M 处 理 器 的 小 型 USB - JTAG /SW D 调 试 工 具 , 可 以 直 接 与<br />

EWARM 集 成 开 发 环 境 无 缝 连 接 , 无 需 安 装 任 何 驱 动 程 序 , 操 作 方 便 、 连 接 方 便 、 简 单 易 学 , 是 学 习 开<br />

发 ARM 最 实 用 的 开 发 工 具 。<br />

J-Link ARM 技 术 参 数 :<br />

业 内 最 高 下 载 速 度 800K/S;<br />

支 持 JTAG、SWD/SWV 调 试 接 口 (SWD/SWV 接 口 信 息 );<br />

支 持 ARM7/9/11/CortexM3;<br />

与 IAR Embedded Workbench 无 缝 集 成 ;<br />

JTAG 速 度 最 高 达 12MHZ;<br />

宽 电 压 支 持 1.2v-3.3V, 使 用 适 配 器 可 达 5.0V;<br />

通 过 USB 对 目 标 板 供 电 ;<br />

即 插 即 拔 ;<br />

20 针 标 准 JTAG 接 口 ;<br />

支 持 ETB;<br />

46


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

SWD 调 试 支 持 :SWO 速 度 最 高 达 6MHZ(J-Link v7 版 本 );<br />

自 动 识 别 内 核 ;<br />

自 动 速 度 识 别 ;<br />

能 监 控 JTAG 的 所 有 信 号 线 , 衡 量 目 标 板 的 电 压 ;<br />

在 扫 描 链 中 支 持 多 种 器 件 ;<br />

第 19 针 能 供 电 。<br />

* IAR J-Link 的 最 新 驱 动 和 固 件 升 级<br />

驱 动 下 载 ;<br />

固 件 升 级 包 下 载 J-Link 的 额 外 功 能 : 无 限 断 点 。<br />

Flash 断 点 是 你 的 IAR J-Link 调 试 工 具 的 软 件 更 新 。Flash 断 点 增 加 了 在 Flash 存 储 器 中 设 置 无<br />

限 量 软 件 断 点 的 功 能 , 而 不 是 标 准 硬 件 断 点 。<br />

特 别 注 意 : LPC2*** 客 户 可 免 费 使 用 设 置 无 限 个 软 件 断 点 。<br />

* IAR J-Link 使 用 注 意 事 项<br />

请 先 将 J-Link 连 接 到 目 标 板 上 , 再 连 接 到 电 脑 上 。<br />

图 6.71 IAR J-Link 信 真 器<br />

3.JEENI 仿 真 器<br />

试 界 面 。<br />

这 是 一 种 价 位 较 低 的 JTAG 仿 真 器 。 它 能 够 很 好 地 与 SDT2.5 工 具 连 接 。 用 户 可 使 用 其 编 译 器 和 调<br />

4.MAJIC 仿 真 器<br />

与 JEENI 相 比 ,MAJIC 能 够 通 过 100base-T 以 太 网 与 主 机 相 连 , 支 持 多 处 理 器 和 低 电 压 I/O。<br />

5.TRACE32-ICD<br />

这 是 一 种 通 用 J TAG / B D M / O N C E 仿 真 器 , 既 能 够 支 持 M o t o r o l a 系 列 的 6 8 K、C o l d F i r e、<br />

MPC5XX/8XX、MPC82XX, 又 能 够 通 过 更 换 模 块 来 支 持 ARM7 系 列 CPU, 同 时 也 能 够 支 持 SIEMENS<br />

的 ONCE 方 式 , 如 TriCore、C166 等 。 另 外 ,TRACE32-ICD 提 供 独 特 的 RISC 逻 辑 追 踪 功 能 。<br />

6.EasyJTAG 和 EasyJTAG-H<br />

47


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

EasyJTAG 仿 真 器 是 广 州 周 立 功 单 片 机 发 展 有 限 公 司 开 发 的 LPC2000 系 列 ARM7 微 控 制 器 的<br />

JTAG 仿 真 器 ,EasyJTAG-H 是 其 升 级 版 , 支 持 ADS1.2 集 成 开 发 环 境 , 支 持 单 步 、 全 速 及 断 点 等 调 试 功<br />

能 , 支 持 下 载 程 序 到 片 内 FLASH 和 特 定 型 号 的 片 外 FLASH, 采 用 ARM 公 司 提 出 的 标 准 20 脚 JTAG 仿 真<br />

调 试 接 口 。 实 物 图 如 图 6.72 所 示 其 主 要 特 点 如 下 :<br />

* 采 用 RDI 通 讯 接 口 , 无 缝 嵌 接 ADS1.2 和 其 它 采 用 RDI 接 口 的 IDE 调 试 环 境 ;<br />

* 高 达 1M 速 率 的 JTAG 时 钟 驱 动 ;<br />

* 采 用 同 步 Flash 刷 新 技 术 (synFLASH), 同 步 下 载 用 户 代 码 到 Flash 中 , 即 下 即 调 ;<br />

* 采 用 同 步 时 序 控 制 技 术 (synTIME), 仿 真 可 靠 稳 定 ;<br />

* 支 持 32 位 ARM 指 令 /16 位 THUMB 指 令 的 混 合 调 试 ;<br />

* 增 加 映 射 寄 存 器 窗 口 , 方 便 用 户 查 看 / 修 改 寄 存 器 数 值 ;<br />

* 微 型 体 积 设 计 , 方 便 用 户 灵 活 使 用 。<br />

图 6.72 EasyJTAG 实 物 图<br />

在 6.2.3 小 节 工 程 调 试 中 用 到 的 就 是 EasyJTAG-H, 在 使 用 之 前 需 要 安 装 驱 动 , 驱 动 程 序 可 在 周 立<br />

功 网 站 上 下 载 , 使 用 之 前 还 需 要 对 其 进 行 设 置 , 如 图 6.73 所 示 , 是 对 开 发 所 用 的 MCU 芯 片 进 行 选 择 ,<br />

从 而 也 得 出 芯 片 的 Flash 大 小 、 字 宽 等 信 息 。<br />

图 6.73 EasyJTAG-H 仿 真 器 Flash 设 置<br />

图 6.74 显 示 了 使 用 EasyJTAG-H 仿 真 器 固 化 程 序 的 方 式 , 在 这 之 间 可 以 点 击 Check 按 钮 查 看 按 钮<br />

48


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

对 处 理 器 进 行 检 测 , 如 果 检 测 不 到 则 弹 出 出 错 对 话 框 , 将 无 法 对 处 理 器 调 试 ; 如 果 检 测 到 处 理 器 , 则<br />

处 理 器 信 息 会 显 示 在 Check 按 钮 左 边 。 另 外 可 选 择 调 试 时 自 动 下 载 (Auto Flash Download)、Hex 文 件<br />

下 载 (Intel Hex Format)、Bin 文 件 下 载 (Plain Binary Format)。<br />

图 6.74 固 化 方 式 选 择<br />

此 外 , 除 了 仿 真 器 还 有 一 些 其 它 调 试 工 具 , 如 下 :<br />

1) 串 行 口<br />

许 多 MCU 都 具 有 一 个 RS232 串 行 口 , 它 允 许 将 调 试 信 息 传 送 到 PC 工 作 站 上 标 准 的 串 口 上 。 通 过 串<br />

行 口 可 以 很 方 便 的 发 送 有 用 的 调 试 信 息 。<br />

2) 发 光 二 极 管<br />

一 个 简 单 的 LED 状 态 显 示 能 够 极 为 有 效 地 帮 助 调 试 。 除 了 看 到 LED 在 代 码 某 个 点 处 开 始 发 光 或<br />

者 闪 烁 所 带 来 的 提 示 之 外 , 还 可 以 使 用 长 或 者 短 闪 烁 来 表 示 大 量 的 错 误 和 状 态 报 告 。 虽 然 看 似 非 常 简<br />

单 , 但 对 于 嵌 入 式 系 统 的 开 发 者 LED 发 光 二 极 管 用 来 指 示 运 行 过 程 从 而 利 用 调 试 的 功 能 不 可 小 视 。<br />

3) 示 波 器<br />

示 波 器 是 调 试 工 具 中 功 能 最 强 大 的 一 种 仪 器 , 而 且 它 不 仅 仅 只 能 够 用 于 调 试 硬 件 。 示 波 器 又 分 为<br />

模 拟 示 波 器 和 数 字 示 波 器 两 种 , 其 中 数 字 示 波 器 性 能 优 越 但 价 格 较 高 , 动 辄 上 万 , 而 模 拟 示 波 器 上 千<br />

的 价 格 可 以 接 收 , 但 数 字 示 波 可 以 存 储 以 及 捕 获 脉 冲 的 功 能 是 模 拟 示 波 器 所 无 法 比 拟 的 , 通 过 示 波 器<br />

能 够 看 到 程 序 对 外 部 端 口 和 外 设 的 访 问 , 并 能 够 监 测 软 件 的 活 动 。<br />

4) 逻 辑 分 析 仪<br />

逻 辑 分 析 仪 是 分 析 硬 件 的 有 力 工 具 , 一 般 拥 有 多 条 输 入 通 道 , 一 定 容 量 的 缓 存 , 还 拥 有 多 个 波 形 窗<br />

口 、 时 序 微 分 指 针 测 量 、 波 形 和 方 案 保 护 / 修 复 等 功 能 。 对 于 总 线 时 序 分 析 非 常 有 效 。 但 一 般 价 格 较<br />

高 。<br />

49


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

第 7 章 MCU 应 用 开 发 实 例<br />

在 了 解 了 很 多 MCU 的 开 发 基 本 知 识 后 , 很 多 朋 友 可 能 已 经 想 跃 跃 欲 试 了 , 本 章 我 们 搜 集 了 一 些 基<br />

于 恩 智 浦 MCU 的 开 发 实 例 , 大 家 可 以 从 这 些 开 发 实 例 中 了 解 MCU 的 具 体 开 发 过 程 , 并 结 合 自 己 的 需 要<br />

进 行 开 发 。<br />

7.1 基 于 LPC2478 的 实 用 型 太 阳 能 发 电 控 制 系 统<br />

作 者 : 解 书 钢 刘 春<br />

南 京 航 空 航 天 大 学<br />

联 系 方 式 : 13675114547( 解 书 钢 ) xsgon@hotmail.com<br />

指 导 老 师 : 马 维 华 ( 教 授 )<br />

7.1.1 项 目 概 述<br />

本 项 目 为 了 在 总 功 率 输 出 相 同 的 情 况 下 使 用 最 少 的 光 伏 电 池 , 拟 采 用 CPC 聚 光 器 提 高 光 伏 电 池 转<br />

换 效 率 。 并 针 对 自 动 跟 踪 系 统 研 究 其 设 计 , 使 光 伏 电 池 始 终 跟 踪 太 阳 光 的 方 向 ; 利 用 步 进 式 扰 动 观 察<br />

算 法 , 设 计 出 太 阳 能 电 池 的 MPPT 功 率 适 配 器 ; 为 输 出 恒 定 的 电 压 , 满 足 负 载 的 要 求 , 设 计 非 对 称 结 构<br />

的 D 类 升 降 压 变 换 器 , 对 输 出 电 压 进 行 控 制 ; 为 提 高 太 阳 能 电 力 的 使 用 效 率 , 系 统 采 用 蓄 电 池 作 为 辅 助<br />

电 源 , 并 计 划 设 计 能 自 动 对 一 组 蓄 电 池 进 行 充 放 电 的 切 换 装 置 ; 整 个 系 统 是 以 ARM LPC2478 为 核 心 对<br />

DC/DC、MPPT、 蓄 电 池 充 放 电 进 行 控 制 的 一 套 软 硬 件 控 制 系 统 , 并 通 过 串 口 将 系 统 各 项 参 数 实 时 地<br />

发 送 至 PC, 同 时 通 过 LCD 接 口 将 其 显 示 出 来 。 并 将 相 关 数 据 存 储 在 铁 电 存 储 器 FRAM 中 , 方 便 对 数 据<br />

的 分 析 , 合 理 利 用 太 阳 能 !<br />

本 项 目 拟 达 到 以 下 指 标 :<br />

* 光 伏 电 池 的 实 际 转 换 率 达 到 30% 以 上 ;<br />

* 步 进 电 机 角 度 位 移 精 度 达 到 5'' 之 内 ;<br />

* 电 池 寿 命 达 到 10 年 以 上 。<br />

50


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

7.1.2 系 统 实 现 原 理<br />

1. 自 动 跟 踪 太 阳 光 原 理<br />

传 感 器 的 设 置 结 构 与 原 理 :<br />

该 跟 踪 器 的 传 感 器 部 分 具 体 结 构 见 图 1: 设 置 一 个 圆 筒 形 外 壳 , 在 圆 筒 外 部 , 东 、 南 、 西 、 北 四 个<br />

方 向 上 分 别 布 置 4 只 光 敏 电 阻 ; 其 中 P1、P3 东 西 对 称 安 装 在 圆 筒 的 两 侧 , 用 来 粗 略 地 检 测 太 阳 由 东 往<br />

西 运 动 的 偏 转 角 度 即 方 位 角 ;P2、P4 南 北 对 称 安 装 在 圆 筒 的 两 侧 , 用 来 粗 略 检 测 太 阳 的 视 高 度 即 高 度<br />

角 ; 在 圆 筒 内 部 , 东 、 南 、 西 、 北 四 个 方 向 上 也 分 别 布 置 4 只 光 敏 电 阻 , 用 来 精 确 检 测 太 阳 由 东 往 西 运 动<br />

的 偏 转 角 度 和 太 阳 的 视 高 度 。<br />

图 1 传 感 器 结 构 示 意 图<br />

立 柱 转 动 式 跟 踪 器<br />

跟 踪 器 的 结 构 见 图 2: 步 进 电 机 1 固 定 在 底 座 上 , 主 轴 及 其 支 撑 轴 承 安 装 在 底 座 上 面 ( 主 轴 相 对 于<br />

底 座 可 以 转 动 ), 转 动 架 以 及 支 架 固 定 安 装 在 主 轴 上 , 光 伏 电 池 、 步 进 电 机 2 安 装 在 支 架 上 面 ( 光 伏 电<br />

池 相 对 于 支 架 可 以 转 动 ), 步 进 电 机 2 的 输 出 轴 连 接 在 光 伏 电 池 上 。<br />

图 2 立 柱 转 动 式 跟 踪 器 示 意 图<br />

当 光 线 发 生 偏 移 , 控 制 部 分 发 出 控 制 信 号 驱 动 步 进 电 机 1 带 动 转 动 架 以 及 固 定 在 转 动 架 上 的 主<br />

轴 、 支 架 以 及 光 伏 电 池 转 动 ; 同 时 控 制 信 号 驱 动 步 进 电 机 2 带 动 光 伏 电 池 相 对 与 支 架 转 动 , 通 过 步 进 电<br />

机 1、 步 进 电 机 2 的 共 同 工 作 实 现 对 太 阳 方 位 角 和 高 度 角 的 跟 踪 [2]。<br />

51


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

2.MPPT 控 制 器<br />

光 伏 电 池 的 输 出 功 率 与 它 的 工 作 电 压 有 关 (U-P 曲 线 一 般 呈 先 上 升 后 下 降 的 光 滑 曲 线 , 中 间 的 某 个<br />

电 压 值 取 得 最 大 功 率 ), 只 有 工 作 在 最 合 适 的 电 压 下 , 它 的 输 出 功 率 才 会 有 个 唯 一 的 最 大 值 。 如 : 在 日<br />

照 强 度 为 1000W/m2 下 ,U=24V,I=1A;U=30V,I=0.9A,U=36V,I=0.7A; 可 见 30V 的 电 压 下 输 出 功 率<br />

更 大 。MPPT( 最 大 功 率 点 跟 踪 ) 控 制 器 主 要 功 能 是 : 检 测 主 回 路 直 流 电 压 及 输 出 电 流 , 计 算 出 太 阳 电 池<br />

阵 列 的 输 出 功 率 , 并 实 现 对 最 大 功 率 点 的 追 踪 [3]。 图 3 为 实 际 应 用 扰 动 与 观 察 法 来 实 现 最 大 功 率 点 追<br />

踪 的 示 意 图 。<br />

图 3 MPPT 控 制 实 现 示 意 图<br />

扰 动 电 阻 R 和 MOSFET 串 连 在 一 起 , 在 输 出 电 压 基 本 稳 定 的 条 件 下 , 通 过 改 变 MOSFET 的 占 空<br />

比 , 来 改 变 通 过 电 阻 的 平 均 电 流 , 因 此 产 生 了 电 流 的 扰 动 [4]。 同 时 , 光 伏 电 池 的 输 出 电 流 和 输 出 电 压 亦<br />

将 随 之 变 化 , 通 过 测 量 扰 动 前 后 光 伏 电 池 输 出 功 率 和 电 压 的 变 化 , 以 决 定 下 一 周 期 的 扰 动 方 向 , 当 扰<br />

动 方 向 正 确 时 太 阳 能 光 电 板 输 出 功 率 增 加 , 下 一 周 期 继 续 朝 同 一 方 向 扰 动 , 反 之 , 当 太 阳 能 光 电 板 输 出<br />

功 率 减 少 时 , 表 示 扰 动 方 向 错 误 , 下 一 周 期 朝 反 向 扰 动 , 如 此 反 复 进 行 着 扰 动 与 观 察 来 使 太 阳 能 光 电<br />

板 输 出 达 最 大 功 率 点 。<br />

7.1.3 硬 件 平 台 描 述<br />

硬 件 平 台 主 控 制 平 台 选 用 周 立 功 LPC2478 板 的 核 心 板 , 该 核 心 板 包 括 处 理 器 和 Flash 等 电 路 , 其<br />

他 的 外 围 电 路 自 行 设 计 。<br />

硬 件 设 计 原 理 图<br />

52


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 4 硬 件 模 块 描 述<br />

1. 电 源 电 路 模 块<br />

电 源 模 块 选 用 9V 的 电 源 适 配 器 , 输 入 为 9VDC, 采 用 去 耦 、 滤 波 等 方 法 后 , 经 过 电 源 芯 片 分 别 转 换<br />

为 +5V、+3.3V, 这 些 电 源 都 为 整 个 控 制 平 台 提 供 良 好 的 电 源 保 证 。 具 体 的 电 路 图 如 图 5 所 示 。<br />

图 5 具 体 电 源 电 路<br />

2. 复 位 电 路 模 块<br />

由 于 ARM 芯 片 的 高 速 、 低 功 耗 和 低 工 作 电 压 导 致 其 噪 声 容 限 较 低 , 对 电 源 的 纹 波 、 瞬 态 响 应 性<br />

能 、 时 钟 源 的 稳 定 性 和 电 源 监 控 可 靠 性 等 诸 多 方 面 也 提 出 了 更 高 的 要 求 。 本 系 统 的 复 位 电 路 使 用 了 专<br />

53


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

用 处 理 器 电 源 监 控 芯 片 MAX811, 以 提 高 系 统 的 可 靠 性 。 电 路 如 图 6 所 示 。<br />

图 6 复 位 电 路<br />

在 图 6 中 , 当 复 位 按 键 RESET 按 下 时 ,MAX811 的 引 脚 RESET 立 即 输 出 复 位 信 号 。 平 时 , 上 拉 电 阻<br />

R12 将 信 号 nRESET 上 拉 为 高 电 平 , 系 统 可 正 常 运 行 。<br />

3. 系 统 时 钟 电 路 和 实 时 时 钟 电 路<br />

LPC2000 系 列 ARM7 控 制 器 可 使 用 外 部 晶 振 或 外 部 时 钟 源 , 内 部 PLL 电 路 可 调 整 系 统 时 钟 , 使 系<br />

统 运 行 速 度 更 快 (CPU 最 大 工 作 时 钟 为 60MHz)。 倘 若 不 使 用 片 内 PLL 功 能 及 ISP 下 载 功 能 , 则 外 部 晶<br />

振 频 率 范 围 是 1~30MHz, 外 部 时 钟 频 率 范 围 是 1~50MHz; 若 使 用 片 内 PLL 功 能 或 ISP 下 载 功 能 , 则 外<br />

部 晶 振 频 率 范 围 是 10~25MHz, 外 部 时 钟 频 率 范 围 是 10~25MHz。<br />

系 统 时 钟 电 路 如 图 7 左 边 部 分 。 使 用 了 外 部 12MHz 晶 振 , 同 时 能 够 支 持 CPU 内 部 的 PLL 功 能 和 ISP<br />

功 能 。RTC 时 钟 电 路 如 图 8 右 边 部 分 。 使 用 了 32.768kHz 的 晶 振 。 两 个 时 钟 电 路 中 , 晶 振 的 两 端 需 接 与<br />

晶 振 频 率 相 应 的 对 地 电 容 。<br />

图 7 系 统 时 钟 电 路<br />

4.JTAG 接 口 电 路<br />

54


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

采 用 ARM 公 司 提 出 的 标 准 20 脚 JTAG 仿 真 器 调 试 接 口 ,JTAG 信 号 的 定 义 如 图 7 所 示 。 由 于 在 进 行<br />

JTAG 调 试 时 ,nRESET 是 可 以 由 JTAG 仿 真 器 控 制 复 位 的 , 所 以 JTAG 接 口 上 的 信 号 nRESET 与 复 位 电<br />

路 连 接 ( 参 考 图 7), 形 成 线 “ 与 ” 的 关 系 , 并 接 到 CPU 的 复 位 引 脚 上 , 达 到 共 同 控 制 系 统 复 位 的 目 的 。<br />

在 RTCK 引 脚 接 一 个 10K 的 下 拉 电 阻 R22, 使 系 统 复 位 后 LPC2478 内 部 的 JTAG 接 口 使 能 。 跳 线 JP3 短<br />

接 使 R22 下 拉 接 地 , 使 用 JTAG 时 ,JP3 必 须 短 接 。<br />

图 8 RTC 时 钟 电 路<br />

5.ISP 电 路<br />

LPC2000 系 列 ARM7 微 控 制 器 具 有 ISP 功 能 , 若 复 位 时 P0.14 引 脚 为 低 电 平 ,<br />

则 进 入 ISP 状 态 。JP4 跳 线 就 是 连 接 到 P0.14 引 脚 上 , 短 接 此 跳 线 时 即 会 把 P0.14 口 强 制 为 低 电 平 ,<br />

复 位 系 统 后 即 进 入 ISP 状 态 。 电 路 如 图 9 所 示 。<br />

图 9 ISP 电 路<br />

6.LCD 接 口 电 路<br />

LCD 采 用 OCMJ48C 液 晶 屏 ,OCMJ48C 可 以 显 示 字 母 、 数 字 符 号 、 中 文 字 型 及 图 形 , 具 有 绘 图 及<br />

文 字 画 面 混 合 显 示 功 能 。 接 口 电 路 如 图 10 所 示 。<br />

55


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 10 LCD 电 路<br />

LCD 工 作 电 压 为 5V, 由 VDD 供 给 。 为 了 降 低 功 耗 , 背 光 有 时 需 要 关 掉 , 所 以 背 光 电 压 LEAD 的 供 给<br />

由 软 件 控 制 , 当 LCD_LEAD 为 高 电 平 时 , 光 藕 U9 3、4 脚 不 导 通 , 由 于 上 拉 电 阻 R25 的 作 用 , 三 极 管 Q3<br />

的 基 极 为 高 电 平 5V, 所 以 三 极 管 Q3 不 导 通 ,LEAD 无 供 电 ; 当 LCD_LEAD 为 低 电 平 时 , 光 藕 U9 3、4 脚<br />

导 通 , 三 极 管 Q3 基 极 为 低 电 平 , 所 以 Q3 导 通 ,VDD5V 给 LEAD 供 电 。LCD_CS 为 数 据 或 指 令 的 选 择 信<br />

号 , 为 高 电 平 时 , 表 示 数 据 , 为 低 电 平 时 , 表 示 指 令 代 码 ;LCD_SID 为 读 写 选 择 信 号 , 高 为 读 , 低 为 写 ,<br />

并 且 当 液 晶 数 据 输 入 方 式 选 择 串 行 方 式 时 , 作 为 串 行 数 据 的 输 入 引 脚 ;LCD_SCL 为 使 能 信 号 , 高 电 平<br />

有 效 ;PSB 为 液 晶 数 据 输 入 方 式 的 选 择 信 号 , 高 为 并 行 , 低 为 串 行 , 本 设 计 中 直 接 接 地 , 即 使 用 串 行 方<br />

式 ;LCD_nRST 为 Reset 信 号 ;DB0~DB7 为 数 据 线 , 当 选 用 并 行 方 式 时 才 用 到 这 8 根 数 据 线 。<br />

7.A/D 采 集 电 路<br />

光 敏 电 阻 采 用 的 型 号 为 GM5516, 亮 电 阻 :5-10KΩ, 暗 电 阻 :200KΩ 以 上 。 系 统 通 过 对 4 对 8 路 (R1<br />

对 应 图 1 中 的 P1,R2 对 应 图 1 中 的 P3,R3-R8 同 理 ) 光 敏 电 阻 即 时 进 行 A/D 采 集 , 原 理 如 图 11。<br />

图 11 光 敏 电 阻 采 集 电 路<br />

MAX1230 是 MAXIM 公 司 推 出 的 具 有 温 度 补 偿 功 能 的 12 位 模 数 转 换 芯 片 , 功 耗 低 , 工 作 方 式 灵 活<br />

多 样 , 应 用 于 系 统 监 视 、 数 据 采 集 工 业 控 制 等 多 种 领 域 。 内 置 了 温 度 传 感 器 (±1℃ 精 度 ), 采 用 单 电 源<br />

56


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

5V 供 电 ,4.096V 内 部 基 准 或 外 部 差 分 基 准 , 也 可 使 用 外 部 差 分 基 准 或 外 部 时 钟 输 入 , 具 有 真 正 差 分 跟<br />

踪 / 保 持 的 模 拟 多 路 复 用 器 , 每 个 输 入 通 道 均 可 按 单 端 或 差 分 方 式 进 行 配 置 , 单 端 方 式 下 可 配 置 为 16<br />

个 通 道 , 差 分 方 式 下 可 配 置 为 8 个 通 道 , 原 理 图 如 图 12。<br />

图 12 MAX1230 电 路<br />

AIN 0 - AIN7 为 光 敏 电 阻 8 路 采 集 , 即 对 应 PHOTO_1- PHOTO_ 8。M A X123 0 的 20 -24 引 脚 和<br />

LPC2478 的 SPI 总 线 相 连 , 通 过 此 总 线 可 以 控 制 AD 采 集 。LPC2478 作 为 主 机 ,MAX1230 作 为 从 机 ,<br />

Dout 接 LPC2478 的 MISO,Din 接 LPC2478 的 MOSI, 设 置 从 机 为 单 端 模 式 , 这 样 可 采 集 16 路 , 用 到 其 中<br />

12 路 , 另 外 4 路 悬 空 不 接 。(U0_9 采 集 的 是 光 伏 电 池 两 端 电 压 ,I0_10 采 集 的 是 电 阻 总 电 流 ,U_1 采 集 升<br />

压 后 电 路 电 压 ,U_2 采 集 降 压 为 蓄 电 池 充 电 的 电 压 , 以 下 有 详 细 描 述 。<br />

8. 驱 动 电 路<br />

将 所 采 集 的 模 拟 量 转 化 为 数 字 量 , 判 断 方 位 角 和 俯 仰 角 的 变 化 , 并 通 过 I/O(OUT1-OUT8) 给 步 进<br />

电 机 1 个 正 转 或 反 转 脉 冲 , 控 制 步 进 电 机 转 向 正 确 的 方 向 , 然 后 继 续 进 行 A/D 采 集 和 控 制 , 直 到 信 号 差<br />

在 一 定 范 围 之 内 , 此 时 光 伏 电 池 正 对 太 阳 , 原 理 图 如 图 13。<br />

图 13 步 进 电 机 驱 动 电 路<br />

57


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

步 进 电 机 57BYG007,GSP-24RW- 046, 皆 为 四 相 八 拍 。OUT1、OUT2、OUT3、OUT4 依 次 取<br />

高 电 平 ,ULN2803( 步 进 电 机 驱 动 芯 片 , 集 电 极 输 出 ) 的 1 脚 到 4 脚 依 次 为 高 电 平 , 这 样 就 给 步 进 电 机 1<br />

(57BYG007) 正 转 一 步 的 脉 冲 信 号 , 步 进 电 机 正 转 1.8 度 ; 反 之 ,OUT4、OUT3、OUT2、OUT1 依 次 取<br />

高 电 平 , 步 进 电 机 反 转 1.8 度 ,GSP-24RW-046 驱 动 原 理 与 之 相 同 。<br />

9.DC/DC、MPPT 电 路<br />

系 统 所 采 用 光 伏 电 池 正 常 工 作 电 压 10-14V, 工 作 电 流 1A 左 右 , 所 采 用 的 蓄 电 池 为 12V-7AH, 由 于<br />

12V 的 蓄 电 池 一 般 需 要 13-15V 的 电 压 为 之 充 电 , 而 光 伏 电 池 如 果 不 经 过 DC/DC 处 理 , 无 法 保 证 为 蓄 电<br />

池 稳 压 充 电 。 因 此 设 计 通 过 BOOST 升 压 电 路 将 光 伏 电 池 电 压 升 高 20V( 大 功 率 步 进 电 机 需 要 较 大 电<br />

压 , 此 处 可 以 为 将 来 系 统 升 级 做 准 备 ), 然 后 降 压 到 14V 为 蓄 电 池 稳 压 充 电 [5], 电 路 图 如 图 14 所 示 。<br />

图 14 DC/DC 及 MPPT 电 路<br />

电 路 左 端 为 光 伏 电 池 , 右 端 输 出 电 压 为 U o( 图 14 的 U o 为 图 15 的 U i n), 我 们 需 要 得 到 右 端<br />

Uo=20V。<br />

(1) 首 先 通 过 并 联 50K、10K 电 阻 组 成 的 电 路 , 并 对 10K 电 阻 两 端 A/D 采 集 , 采 集 电 压 Uad1, 间 接 得<br />

到 蓄 电 池 两 端 电 压 Uin=6Uad1;<br />

(2)Uo 要 求 为 20V, 通 过 Uo=Uin/(1-D) 可 计 算 出 需 要 的 D(Q1 的 占 空 比 ), 输 出 控 制 PWM1 波 形 , 由<br />

于 所 采 用 的 大 功 率 MOSFET 驱 动 电 压 要 求 15V, 所 以 PWM1 需 要 经 过 上 拉 电 压 15V 和 光 耦 开 关 组 合 后<br />

对 Q1 控 制 , 不 是 简 单 的 控 制 Q1, 原 理 图 较 为 简 单 , 与 图 6 类 似 , 在 此 不 画 出 ;<br />

(3) 通 过 R5、R6 组 成 的 电 路 ( 原 理 同 R3、R4) 采 集 R6 两 端 电 压 Uad2, 间 接 得 到 Uo=6 Uad2, 将 Uo<br />

与 20V 比 较 , 即 时 调 整 实 际 的 D, 使 得 D=D-△D 或 D=D+△D(△D 取 PMW 脉 冲 周 期 的 5%), 然 后 延 时 、<br />

采 集 、 判 断 , 直 到 得 到 精 确 的 占 空 比 D, 能 够 准 确 输 出 电 压 Uo=20V;<br />

(4) 在 输 出 电 压 基 本 稳 定 的 基 础 上 , 设 置 Q4 的 PWM2, 改 变 R7 扰 动 电 阻 的 占 空 比 , 来 改 变 输 出 电<br />

流 , 通 过 对 R8 两 端 电 压 的 A/D 采 集 , 采 集 电 压 Uad3, 得 到 电 路 总 电 流 I=Uad3/R8, 因 此 得 到 太 阳 能 电<br />

池 输 出 总 功 率 P=Uin*I( 因 为 电 路 是 电 流 连 续 工 作 , 电 感 上 的 纹 波 电 流 可 以 小 到 接 近 平 滑 的 直 流 电 流 ,<br />

58


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

C1 电 流 可 忽 略 , 甚 至 电 容 C1 可 除 去 , 且 光 伏 电 池 左 端 的 采 集 电 阻 相 当 大 , 电 流 极 小 , 亦 可 忽 略 ), 改 变<br />

光 伏 电 池 即 时 输 出 实 际 功 率 , 来 实 现 MPPT。<br />

10. 蓄 电 池 充 放 电 控 制 电 路<br />

白 天 , 继 电 器 1、 继 电 器 2、 继 电 器 3 都 为 常 开 状 态 A, 继 电 器 2 控 制 信 号 choose1, 当 光 信 号 从 白 天 到<br />

黑 夜 时 , 继 电 器 在 A、B 间 互 跳 , 以 此 实 现 2 个 蓄 电 池 的 轮 流 充 放 电 。 继 电 器 1 和 继 电 器 3 公 用 choose2 信<br />

号 , 在 白 天 时 候 , 为 状 态 A, 夜 晚 状 态 B。 说 明 : 假 设 某 天 , 继 电 器 2 工 作 在 状 态 A, 光 伏 电 池 为 蓄 电 池 1 充<br />

电 , 蓄 电 池 1 不 工 作 , 蓄 电 池 2 为 ARM 和 步 进 电 机 供 电 供 电 , 负 载 ( 路 灯 ) 不 工 作 。 从 白 天 到 了 夜 晚 ( 或 光<br />

线 很 差 ), 继 电 器 1、2、3 都 跳 到 B 状 态 。 蓄 电 池 1 工 作 , 并 对 路 灯 和 ARM 板 供 电 , 步 进 电 机 不 工 作 ( 此 时<br />

转 动 角 度 已 无 必 要 )。 这 一 套 充 放 电 控 制 电 路 需 要 用 到 3 个 继 电 器 , 硬 件 设 计 电 路 如 图 15 所 示 。<br />

图 15 蓄 电 池 充 放 电 控 制 电 路<br />

图 15: 电 路 右 端 Uin=20V 作 为 输 入 电 压 , 通 过 BUCK 降 压 电 路 将 电 压 降 到 14V 为 蓄 电 池 充 电 ,<br />

Uo=Uin*D, 要 得 到 14V 电 压 , 设 置 Q2 的 占 空 比 为 70%。 白 天 :2 个 继 电 器 皆 为 常 开 状 态 A, 光 伏 电 池 为 步<br />

进 电 机 和 ARM 供 电 ( 采 用 7805 稳 压 管 降 压 到 5V), 并 为 蓄 电 池 充 电 , 蓄 电 池 正 极 接 反 相 截 止 二 极 管 , 保<br />

证 充 电 同 时 不 放 电 。 夜 间 ( 或 日 照 极 差 , 由 光 敏 电 阻 判 断 ): 继 电 器 1、2 被 吸 合 到 B, 步 进 电 机 停 止 工 作 ,<br />

蓄 电 池 为 ARM 供 电 , 并 带 动 负 载 ( 路 灯 ) 工 作 。<br />

11. 软 件 程 序 描 述<br />

软 件 部 分<br />

主 体 函 数 部 分<br />

59


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 16 软 件 流 程 图<br />

12.MAX1230<br />

MAX1230 的 工 作 方 式 由 其 内 部 的 控 制 寄 存 器 决 定 , 这 些 寄 存 器 主 要 有 转 换 方 式 寄 存 器 、 工 作 方<br />

式 寄 存 器 、 均 值 方 式 寄 存 器 和 复 位 寄 存 器 等 。<br />

按 照 采 样 和 转 换 过 程 中 时 钟 工 作 方 式 的 不 同 ,MAX1230 的 工 作 方 式 分 为 四 种 , 可 根 据 情 况 灵 活 选<br />

择 , 本 系 统 采 用 第 三 种 工 作 方 式 : 采 样 和 转 换 都 使 用 内 部 时 钟 , 并 通 过 串 行 口 写 入 命 令 字 来 进 行 初 始<br />

化 , 该 模 式 的 时 序 如 下 图 所 示 。 写 入 命 令 字 后 转 换 开 始 , 转 换 完 成 时 ,EOC 信 号 变 为 低 电 平 , 数 据 可 以<br />

从 DOUT 读 取 。<br />

信 号 采 样 的 软 件 设 计 主 要 包 括 如 下 几 个 函 数 :<br />

⑴ SPI 初 始 化 函 数 : 设 置 SPI 时 钟 和 接 口 模 式 。<br />

void SpiIni(uint8 Fdiv)<br />

60


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

{<br />

If(Fdiv


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

液 晶 是 系 统 与 用 户 交 互 的 主 要 媒 介 , 是 系 统 的 重 要 输 出 设 备 。 通 过 液 晶 可 以 显 示 光 伏 电 池 电 压 、 电<br />

流 、 功 率 等 信 息 , 还 可 以 显 示 系 统 的 工 作 状 态 。<br />

本 部 分 主 要 实 现 了 OCMJ4X8 液 晶 模 块 的 底 层 驱 动 , 为 上 层 应 用 提 供 接 口 函 数 。 主 要 有 以 下 功 能 :<br />

图 17 8 位 并 行 接 口 模 式 数 据 传 输 的 时 序 图<br />

图 18 串 行 接 口 模 式 数 据 传 输 的 时 序 图<br />

LCD 串 行 传 输 模 式 下 的 函 数<br />

LCD 命 令 写 入 函 数 :LCD_W_COM(uint16 CMD);<br />

LCD 数 据 写 入 函 数 :LCD_W_DATA(uint16 DATA);<br />

向 LCD 对 应 位 置 写 入 连 续 几 个 字 符 :LCD_W_HZ(char *str,uint8 num, uint8 pos);<br />

LCD 初 始 化 函 数 :LCD_SETUP(void);<br />

LCD 清 屏 函 数 :LCD_CLEAR(void)。<br />

14. 驱 动 电 机 设 计<br />

#define motor 0x00003c00 /* 设 置 P0.10,P0.11,P0.12,P0.13 控 制 uln2803 4 个 输 入 端 */<br />

#define motor_a 0x00000400<br />

#define motor_b 0x00000800<br />

#define motor_c 0x00001000<br />

#define motor_d 0x00002000<br />

62


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

void E_W_Run(uint8);<br />

void S_N_Run(uint8);<br />

void E_W_Run(uint8 EWO_Flag)<br />

{<br />

IO0SET = motor;<br />

if(EWO_Flag==0)<br />

IO0CLR = motor_a;<br />

else if(EWO_Flag==1) IO0CLR = motor_b;<br />

else if(EWO_Flag==2) IO0CLR = motor_c;<br />

else if(EWO_Flag==3) IO0CLR = motor_d;<br />

DelayNS(10);<br />

}<br />

void S_N_Run(uint8 SNO_Flag)<br />

{<br />

IO0SET = motor;<br />

if(SNO_Flag==0)<br />

IO0CLR = motor_d;<br />

else if(SNO_Flag==1) IO0CLR = motor_c;<br />

else if(SNO_Flag==2) IO0CLR = motor_b;<br />

else if(SNO_Flag==3) IO0CLR = motor_a;<br />

DelayNS(10);<br />

}<br />

15.MPPT 设 计<br />

(1) 首 先 通 过 并 联 50K、10K 电 阻 组 成 的 电 路 , 并 对 10K 电 阻 两 端 A/D 采 集 , 采 集 电 压 Uad1, 间 接 得<br />

到 蓄 电 池 两 端 电 压 Uin=6Uad1。<br />

(2)Uo 要 求 为 20V, 通 过 Uo = Uin/(1-D1) 可 计 算 出 需 要 的 D(Q1 的 占 空 比 ):D1-=1-U0/20。<br />

(3) 通 过 R5、R6 组 成 的 电 路 ( 原 理 同 R3、R4) 采 集 R6 两 端 电 压 Uad2, 间 接 得 到 Uo=6 Uad2, 将<br />

Uo 与 20V 比 较 , 即 时 调 整 实 际 的 D, 使 得 D1=D1-△D 或 D=D+△D(△D 取 PMW 脉 冲 周 期 的 5%), 然 后 延<br />

时 、 采 集 、 判 断 , 直 到 得 到 精 确 的 占 空 比 D, 能 够 准 确 输 出 电 压 Uo=20V。<br />

(4) 在 输 出 电 压 基 本 稳 定 的 基 础 上 , 设 置 Q4 的 PWM2, 改 变 R7 扰 动 电 阻 的 占 空 比 , 来 改 变 输 出 电<br />

流 , 通 过 对 R8 两 端 电 压 的 A/D 采 集 , 采 集 电 压 Uad3, 得 到 电 路 总 电 流 I=Uad3/R8, 因 此 得 到 太 阳 能 电 池<br />

输 出 总 功 率 P=Uin*I( 因 为 电 路 是 电 流 连 续 工 作 , 电 感 上 的 纹 波 电 流 可 以 小 到 接 近 平 滑 的 直 流 电 流 ,C1<br />

63


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

电 流 可 忽 略 , 甚 至 电 容 C1 可 除 去 , 且 光 伏 电 池 左 端 的 采 集 电 阻 相 当 大 , 电 流 极 小 , 亦 可 忽 略 ), 改 变 光<br />

伏 电 池 即 时 输 出 实 际 功 率 , 来 实 现 MPPT。<br />

(5) 设 置 D2=0.7, 来 得 到 20*0.7=14V 的 电 压 , 可 根 据 实 际 测 量 的 电 压 微 调 D2, 原 理 如 下 。<br />

7.2 智 能 路 况 分 析 导 盲 杖<br />

作 者 : 喻 焰 , 徐 超 , 杜 晋 博 上 海 交 通 大 学<br />

指 导 老 师 : 戚 正 伟<br />

通 信 地 址 : 上 海 市 闵 行 区 东 川 路 800 号<br />

7.2.1 项 目 概 述<br />

64


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

关 爱 残 障 人 士 是 一 种 和 谐 社 会 的 表 现 , 本 项 目 立 足 于 改 善 盲 人 朋 友 的 行 走 问 题 , 帮 助 他 们 更 好 地<br />

融 入 外 面 的 世 界 。 从 整 个 系 统 的 角 度 来 说 , 本 设 计 利 用 超 声 波 阵 列 识 别 路 况 和 电 子 罗 盘 纠 正 方 向 两 大<br />

功 能 来 提 高 盲 人 的 行 走 速 度 和 安 全 系 数 。<br />

现 有 的 超 声 波 导 盲 产 品 往 往 只 能 够 判 断 出 前 方 是 否 有 障 碍 以 及 障 碍 的 距 离 , 而 这 些 并 不 能 够 给 盲<br />

人 带 来 实 质 性 的 帮 助 。 我 们 的 设 计 则 关 注 于 前 方 障 碍 大 体 形 状 的 识 别 , 利 用 多 个 超 声 波 接 收 器 形 成 阵<br />

列 , 对 导 盲 杖 前 一 米 左 右 的 范 围 进 行 探 测 , 采 用 超 声 波 阵 列 进 行 采 样 , 通 过 机 器 学 习 , 根 据 物 体 典 型<br />

的 特 征 把 障 碍 归 入 盲 人 自 己 定 义 的 路 况 类 型 中 ; 我 们 又 为 导 盲 杖 加 入 了 电 子 罗 盘 , 这 不 仅 能 够 有 效 地<br />

辅 助 路 况 识 别 和 节 能 , 还 可 以 按 需 通 过 语 音 模 块 提 醒 盲 人 行 走 方 向 。 在 实 际 应 用 中 可 以 解 决 过 马 路 偏<br />

离 斑 马 线 , 路 口 转 向 不 准 确 等 问 题 。<br />

7.2.2 系 统 实 现 原 理<br />

智 能 路 况 分 析 导 盲 杖 实 现 的 主 要 原 理 包 括 超 声 波 传 感 器 测 距 及 其 电 气 特 性 ; 机 器 学 习 领 域 使 用 支<br />

持 向 量 机 (SVM) 的 方 法 对 样 本 进 行 训 练 、 学 习 与 识 别 。<br />

7.2.3 硬 件 平 台 描 述<br />

智 能 路 况 分 析 导 盲 杖 主 要 由 LPC2478 开 发 板 , 超 声 波 阵 列 、 语 音 模 块 、 电 子 罗 盘 和 电 源 模 块 等 构<br />

成 。<br />

1. 系 统 构 成 概 述<br />

65


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 1 系 统 架 构 图<br />

如 上 图 所 示 , 语 音 模 块 和 超 声 波 阵 列 接 收 端 通 过 LPC2478 开 发 板 的 通 用 输 入 输 出 口 (GPIO) 接 入<br />

系 统 , 超 声 波 发 射 端 的 驱 动 信 号 由 脉 冲 宽 度 调 制 器 (PWM) 生 成 , 电 子 罗 盘 则 通 过 I 2 C 口 进 行 数 据 的 传<br />

输 。<br />

2. 超 声 波 阵 列<br />

1) 发 射 端<br />

利 用 开 发 板 上 的 PWM 生 成 40KHz 方 波 , 通 过 超 声 波 发 射 电 路 触 发 超 声 波 传 感 器 , 生 成 40KHz 的<br />

超 声 波 .<br />

2) 接 收 端<br />

超 声 波 经 过 障 碍 的 反 射 , 被 接 收 器 捕 获 , 经 过 接 收 电 路 的 放 大 、 滤 波 、 整 形 , 使 接 收 到 的 正 弦 波<br />

模 拟 信 号 转 化 为 数 字 信 号 , 然 后 传 入 LPC2478 的 GPIO 口 触 发 中 断 。<br />

3)LPC2478T 系 统 集 成<br />

LPC2478 基 于 ARM7TDMI-S 处 理 器 , 运 行 频 率 高 达 72MHz。 具 有 2 个 ARM 高 速 总 线 (AHB), 可<br />

以 使 得 高 频 宽 外 设 ( 如 Ethernet、OTG、USB 主 机 端 、CAN、SDRAM 等 片 上 内 存 ) 同 时 运 行 。 除 此 之<br />

外 , 还 有 许 多 串 行 通 信 控 制 器 , 多 用 途 的 时 钟 功 能 和 存 储 器 特 性 , 使 得 LPC2478 特 别 适 用 于 对 实 时 性<br />

要 求 很 高 的 系 统 。<br />

语 音 模 块 采 用 可 重 复 录 音 的 语 音 录 放 板 , 录 音 在 flash 中 分 段 存 放 , 开 发 板 通 过 GPIO 接 口 连 接 语<br />

音 模 块 来 控 制 语 音 播 放 。<br />

电 子 罗 盘 采 用 基 于 I 2 C 和 RS232 接 口 的 周 立 功 电 子 指 南 针 模 块 , 模 块 通 过 输 出 角 度 来 表 示 现 时 的<br />

方 向 。 此 模 块 具 有 正 北 矫 正 , 硬 铁 补 偿 , 非 正 交 补 偿 功 能 , 误 差 小 于 3 度 。<br />

7.2.4 软 件 程 序 描 述<br />

此 智 能 路 况 分 析 导 盲 杖 的 软 件 部 分 由 2 部 分 构 成 : 导 盲 杖 嵌 入 式 部 分 ( 采 用 µC/OS-II 操 作 系 统 运<br />

行 在 LPC2478 开 发 板 ) 和 PC 端 支 持 向 量 机 样 本 集 训 练 及 训 练 结 果 代 码 导 出 的 工 具 。 预 定 义 样 本 训 练<br />

是 在 导 盲 杖 投 入 使 用 前 一 次 性 完 成 的 , 将 其 放 入 导 盲 杖 内 不 仅 导 致 了 系 统 资 源 的 浪 费 , 还 增 加 了 开 发 、<br />

测 试 和 使 用 上 难 度 , 所 以 将 此 部 分 放 到 PC 端 , 采 用 .NET Framework 2.0 编 写 运 行 于 Windows 操 作 系<br />

统 , 提 供 友 好 的 用 户 体 验 。<br />

1. 寻 盲 杖 嵌 入 式 部 分<br />

此 部 分 采 用 µC/OS-II 操 作 系 统 来 进 行 任 务 管 理 。µC/OS-II 作 为 一 个 免 费 的 源 码 开 放 的 实 时 嵌 入<br />

66


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

式 操 作 系 统 , 提 供 了 多 任 务 的 切 换 、 中 断 和 UART 的 驱 动 等 功 能 , 完 全 可 以 满 足 本 系 统 的 要 求 。 软 件 实<br />

现 主 要 包 括 主 控 任 务 、 探 测 任 务 、 电 子 罗 盘 任 务 、 批 量 采 样 任 务 四 个 任 务 , 探 测 任 务 流 程 图 如 下 图 所<br />

示 :<br />

图 2 嵌 入 式 部 分 探 测 任 务 流 程 图<br />

1) 超 声 波 探 测 任 务<br />

超 声 波 探 测 任 务 在 系 统 开 机 后 即 可 以 自 动 启 动 实 现 路 况 探 测 功 能 。 以 1 秒 为 一 个 探 测 周 期 , 在 此<br />

周 期 内 系 统 对 前 方 路 况 采 样 5 次 , 每 次 采 样 先 通 过 脉 冲 宽 度 调 制 器 (PWM) 发 射 10 个 40KHz 的 方 波 ,<br />

激 发 超 声 波 发 射 器 发 射 超 声 波 。 然 后 等 待 处 理 超 声 波 接 收 器 发 来 的 中 断 。LPC2478 的 GPIO 引 脚 具 有<br />

中 断 功 能 ,P0 和 P2 端 口 的 每 一 个 引 脚 都 可 以 配 置 为 上 升 沿 中 断 或 下 降 沿 中 断 。 超 声 波 接 收 器 通 过 高<br />

速 GPIO 连 接 到 LPC2478 开 发 板 , 由 于 最 终 设 计 有 8 个 接 收 器 , 本 系 统 在 实 现 中 使 用 查 询 方 式 来 处 理 这<br />

些 中 断 , 程 序 通 过 查 询 外 部 中 断 标 志 寄 存 器 和 下 降 沿 寄 存 器 的 GPIO 中 断 状 态 IO0IntStatF 相 应 位 是 否<br />

置 位 , 来 判 断 相 应 引 脚 上 是 否 有 中 断 事 件 发 生 。 中 断 处 理 程 序 中 会 记 录 超 声 波 阵 列 中 每 个 接 收 器 收 到<br />

返 回 波 的 时 间 , 从 而 得 到 一 个 样 本 , 程 序 将 这 个 样 本 交 给 分 类 模 块 根 据 预 学 习 导 出 的 结 果 对 这 个 样 本<br />

进 行 分 析 。 在 每 个 探 测 周 期 5 次 采 样 中 , 分 析 计 算 出 的 5 个 分 类 值 , 计 算 分 类 概 率 , 取 概 率 超 过 阈 值 ( 暂<br />

定 为 80%) 的 分 类 值 作 为 我 们 的 探 测 结 果 。 将 这 个 探 测 结 果 发 送 给 语 音 模 块 任 务 , 语 音 模 块 任 务 通 过<br />

67


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

GPIO 接 口 向 语 音 模 块 发 送 指 令 向 盲 人 报 出 前 方 路 况 。<br />

电 子 罗 盘 任 务 在 相 应 按 键 触 发 时 才 工 作 , 首 先 会 记 录 下 按 键 触 发 时 的 方 位 信 息 并 设 置 定 时 器 , 方<br />

位 信 息 可 以 通 过 读 取 I 2 C 接 口 相 应 地 址 取 得 。 每 隔 1 秒 钟 timer 中 断 会 触 发 , 监 测 当 前 方 位 信 息 是 否 与 初<br />

始 值 偏 差 过 大 , 如 果 过 大 会 调 用 语 音 模 块 进 行 播 报 , 提 醒 盲 人 当 前 行 走 路 线 偏 左 或 偏 右 。<br />

2) 批 量 采 样 任 务<br />

这 个 任 务 只 有 在 需 要 训 练 时 被 使 用 , 主 要 功 能 是 批 量 采 样 并 通 过 UART0 交 给 PC 机 进 行 训 练 ; 接<br />

收 PC 机 的 训 练 结 果 并 刷 新 当 前 知 识 库 。<br />

2. 采 样 分 类 设 计 及 分 析<br />

基 于 分 类 区 分 度 尽 可 能 高 和 尽 可 能 帮 助 盲 人 识 别 经 典 地 形 的 原 则 , 此 导 盲 杖 目 前 对 地 形 分 类 如 下<br />

表 所 示 :<br />

训 练 次 数 识 别 次 数 识 别 正 确 次 数 识 别 率<br />

无 障 碍 50 5 5 100%<br />

有 不 可 通 过 障 碍 50 10 10 100%<br />

前 方 可 绕 行 障 碍 50 10 9 90%<br />

左 侧 有 障 碍 50 10 10 100%<br />

右 侧 有 障 碍 50 10 9 90%<br />

有 楼 梯 50 5 3 60%<br />

合 计 300 50 46 92%<br />

7.2.5 总 结 与 展 望<br />

本 文 详 细 介 绍 了 基 于 LPC2478 开 发 板 和 µC/OS-II 操 作 系 统 开 发 的 智 能 路 况 分 析 导 盲 杖 的 实 现 原<br />

理 、 硬 件 设 计 、 软 件 设 计 、 开 发 进 度 、 测 试 数 据 分 析 等 , 通 过 对 超 声 波 阵 列 的 分 析 和 基 于 支 持 向 量 机 的<br />

机 器 学 习 的 方 法 , 在 导 盲 杖 上 通 过 主 控 的 LPC2478 集 成 运 用 了 超 声 波 模 块 、 语 音 模 块 、 电 子 罗 盘 , 以 此<br />

对 6 种 特 殊 分 类 的 地 形 进 行 识 别 并 达 到 了 较 高 的 识 别 率 。<br />

将 来 的 工 作 将 把 重 点 放 在 丰 富 样 本 集 和 添 加 用 户 训 练 模 式 , 使 设 计 更 加 的 实 用 。( 附 图 如 下 )<br />

图 3 超 声 波 阵 列 实 物 图<br />

68


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 4 产 品 概 念 图<br />

参 考 文 献<br />

[1] 何 希 才 编 著 . 传 感 器 及 其 应 用 电 路 . 电 子 工 业 出 版 社 . 2001;<br />

[2] J. R. LLATA, E. G. SARABIA and J. P. ORIA, Three-Dimensional Robotic Vision Using<br />

Ultrasonic Sensors, Journal of Intelligent and Robotic Systems 33: 267–284, 2002;<br />

[3] Krautkr,mer, J. and Krautkr,mer, H.: Ultrasonic Testing of Materials, Springer, Berlin,<br />

1990;<br />

[4] Nello Cristianini and John Shawe-Taylor,An Introduction to Support Vector Machines and<br />

other kernel-based learning methods. Cambridge University Press, 2000;<br />

[5] 周 立 功 等 编 著 《ARM 嵌 入 式 系 统 应 用 技 术 笔 记 — 基 于 LPCLPC2400》, 广 东 致 远 电 子 有 限<br />

公 司 ;<br />

[6] 周 立 功 等 编 著 《 深 入 浅 出 ARM7— 基 于 LPC2400》, 广 东 致 远 电 子 有 限 公 司 ;<br />

[7] 周 立 功 等 编 著 《µC/OS-II 微 小 内 核 分 析 与 程 序 设 计 — 基 于 LPC2400》, 广 东 致 远 电 子 有 限 公<br />

司 ;<br />

[8] 张 学 工 , 关 于 统 计 学 习 理 论 与 支 持 向 量 机 ,2000。<br />

69


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

7.3 通 用 人 体 呼 吸 气 体 检 测 电 子 鼻 仪 器 设 计<br />

作 者 : 余 凯 王 怡 珊 胡 宁 浙 江 大 学 生 物 医 学 工 程<br />

指 导 老 师 : 王 平 教 授<br />

浙 江 大 学 生 物 传 感 器 国 家 专 业 实 验 室 副 主 任 , 生 物 医 学 工 程 教 育 部 重 点 实 验 室 副 主 任 。<br />

7.3.1 项 目 概 述<br />

通 过 人 体 的 体 液 检 测 健 康 状 况 , 这 在 临 床 应 用 中 已 非 常 成 熟 , 也 确 实 为 诊 断 过 程 提 供 了 十 分 宝 贵<br />

的 信 息 , 然 而 体 液 检 测 一 方 面 需 要 依 赖 于 检 测 试 剂 , 成 本 较 高 , 另 一 方 面 大 部 分 检 测 手 段 基 于 “ 有 创 ”<br />

过 程 , 均 不 适 合 进 行 较 高 频 率 的 检 测 。 作 为 身 体 健 康 状 况 的 另 一 条 反 映 途 径 , 人 体 的 呼 吸 气 体 ( 肺 呼<br />

吸 气 体 与 消 化 道 挥 发 气 体 ) 也 能 反 映 一 些 重 要 的 生 理 过 程 与 代 谢 信 息 , 且 检 测 的 方 法 可 以 在 一 定 程 度<br />

上 弥 补 前 者 的 不 足 。<br />

本 项 目 设 计 的 目 的 是 利 用 以 ARM7TDMI-S 为 核 心 的 LPC2478 处 理 器 实 现 对 电 子 鼻 仪 器 系 统 的<br />

控 制 、 对 气 体 检 测 信 号 的 分 析 与 判 别 , 以 及 实 现 在 脱 离 PC 机 的 情 况 下 , 提 供 友 好 的 图 形 用 户 交 互 接 口<br />

(GUI), 使 用 户 通 过 自 己 的 操 作 就 能 掌 握 并 记 录 自 己 的 身 体 健 康 状 况 。<br />

本 项 目 的 设 计 初 衷 在 于 能 将 本 系 统 应 用 于 家 庭 成 员 人 体 健 康 体 征 的 监 测 , 并 主 要 着 眼 于 检 测 人<br />

体 呼 吸 气 体 中 的 乙 醇 、 芳 香 烃 类 气 体 化 合 物 和 由 人 体 消 化 道 挥 发 出 的 气 体 硫 化 物 、 胺 化 物 等 的 含 量 ,<br />

从 而 为 酗 酒 、 吸 烟 人 群 以 及 呼 吸 道 、 胃 肠 道 不 适 人 群 的 健 康 状 况 作 直 观 和 方 便 的 检 查 。 系 统 在 线 实<br />

现 对 气 体 检 测 信 号 的 主 成 份 分 析 (PCA), 而 由 于 需 要 大 量 的 样 本 训 练 过 程 , 故 系 统 将 人 工 神 经 网 络<br />

(ANN) 对 气 体 进 一 步 分 析 的 原 始 数 据 通 过 USB Host 写 入 U 盘 中 , 以 便 于 数 据 的 移 植 , 而 将 数 据 拷 贝<br />

至 SD 存 储 卡 中 , 则 便 于 将 用 户 长 期 观 察 的 结 果 存 档 。<br />

7.3.2 系 统 实 现 原 理<br />

系 统 对 人 体 呼 吸 气 体 的 检 测 主 要 是 通 过 高 效 的 气 路 及 其 控 制 得 以 实 现 的 。 对 于 进 样 的 气 体 , 系 统<br />

有 两 种 不 同 的 检 测 手 段 : 对 于 较 高 浓 度 的 气 体 , 步 进 电 机 驱 动 六 通 阀 , 切 换 至 “ 直 接 进 样 ” 状 态 , 即 气<br />

体 由 进 样 口 进 入 气 室 , 在 气 室 中 与 处 于 加 热 状 态 的 金 属 氧 化 物 气 体 传 感 器 阵 列 (Gas Sensor Array) 接<br />

触 ; 而 对 于 较 低 浓 度 的 气 体 , 六 通 阀 将 切 换 至 “ 吸 附 进 样 ” 状 态 , 即 气 体 从 进 样 口 进 入 气 路 之 后 , 在 吸<br />

附 解 吸 附 单 元 (EDU) 中 进 行 富 集 ( 常 温 ), 并 在 富 集 程 序 完 毕 之 后 , 载 气 由 载 气 口 进 入 , 将 标 志 物 气<br />

体 从 PID 控 温 状 态 下 的 EDU 中 带 出 , 并 进 入 气 室 , 这 是 本 系 统 实 现 气 体 检 测 功 能 基 本 的 检 测 原 理 与 流<br />

程 。 在 这 个 过 程 中 需 要 LPC2478 对 气 路 状 态 ( 六 通 阀 切 换 、EDU 控 温 、 真 空 泵 抽 气 速 率 与 气 体 传 感 器<br />

阵 列 信 号 采 样 等 ) 进 行 全 程 监 控 与 测 量 , 并 通 过 TFT 液 晶 、 键 盘 阵 列 与 用 户 实 现 友 好 的 交 互 。<br />

在 检 测 得 到 气 体 信 号 之 后 , 需 要 LPC2478 对 数 据 进 行 主 成 份 分 析 (PCA), 通 过 数 学 建 模 的 方 法 ,<br />

本 项 目 小 组 改 进 了 传 统 PCA 分 析 的 算 法 , 并 将 数 据 变 换 为 在 两 维 主 成 份 坐 标 系 中 的 “ 点 群 ”, 利 用 这 些<br />

70


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

点 群 , 对 样 本 气 体 中 的 主 成 份 进 行 聚 类 判 断 。<br />

在 气 体 检 测 的 整 个 过 程 中 , 均 需 要 为 气 体 在 气 路 中 的 流 动 提 供 动 力 , 本 系 统 利 用 LPC2478 的 10 位<br />

DAC 对 真 空 泵 的 驱 动 电 路 进 行 控 制 , 在 实 现 对 真 空 泵 转 速 调 节 的 同 时 , 对 气 路 中 气 体 的 流 动 速 度 进 行<br />

较 为 精 确 的 控 制 , 一 方 面 适 应 “ 吸 附 进 样 ” 过 程 中 气 体 吸 附 的 速 率 , 另 一 方 面 又 能 兼 顾 气 体 与 传 感 器 充<br />

分 接 触 时 传 感 器 的 响 应 时 间 。<br />

7.3.3 硬 件 平 台 描 述<br />

该 呼 吸 气 体 检 测 电 子 鼻 实 验 样 机 采 用 了 广 州 致 远 电 子 有 限 公 司 生 产 的 SmartARM2400 开 发 板 和<br />

项 目 小 组 自 制 的 扩 展 板 , 以 实 现 对 气 路 硬 件 模 块 的 控 制 和 模 拟 信 号 的 前 置 处 理 等 功 能 。 气 路 硬 件 模 块<br />

包 括 吸 附 解 吸 附 单 元 、 真 空 泵 、 六 通 阀 、 电 磁 阀 、 步 进 电 机 、 气 室 (TGS 系 列 金 属 氧 化 物 气 体 传 感 器 阵<br />

列 ) 以 及 气 体 采 样 袋 等 。 系 统 的 硬 件 设 计 框 图 如 图 1 所 示 。<br />

图 1 系 统 硬 件 框 图<br />

该 电 子 鼻 仪 器 采 用 的 嵌 入 式 系 统 微 控 制 器 是 由 思 智 浦 研 发 生 产 , 基 于 A R M7 TDMI - S 内 核 的<br />

LPC2478, 它 具 有 512KB 片 上 Flash 程 序 存 储 器 ,98KB 片 内 SRAM, 双 AHB 总 线 系 统 , 先 进 的 向 量 中 断<br />

控 制 器 (VIC), 支 持 多 达 32 个 向 量 中 断 , 优 秀 的 真 彩 液 晶 控 制 器 , 支 持 STN 和 TFT 显 示 屏 的 显 示 , 具 有<br />

包 括 USB Host、USB OTG、2 通 道 CAN、SPI、2 个 SSP 和 4 路 UART 控 制 器 等 在 内 的 串 行 接 口 , 以 及 3<br />

71


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

个 I 2 C 总 线 接 口 和 I 2 S 音 频 接 口 。 此 外 , 它 还 具 有 SD/MMC 存 储 卡 接 口 、10 位 ADC、10 位 DAC、2 个 PWM<br />

模 块 、 带 有 独 立 电 源 的 RTC、4 个 通 用 定 时 器 / 计 数 器 模 块 和 丰 富 的 可 灵 活 配 置 上 拉 / 下 拉 电 阻 的 GPIO<br />

管 脚 。 可 以 说 ,LPC2478 优 越 的 性 能 与 灵 活 多 样 的 外 围 模 块 设 计 为 其 在 医 疗 仪 器 与 检 测 设 备 中 的 应 用<br />

奠 定 了 扎 实 的 基 础 。<br />

系 统 设 计 中 , 主 要 应 用 到 LPC2478 功 能 模 块 有 彩 色 液 晶 控 制 器 、RTC、PWM、USB Host、SD/<br />

MMC 控 制 器 、ADC、DAC、UART、Timer、GPIO 等 。 将 LPC2478 的 控 制 、 输 入 模 块 与 扩 展 板 上 的 气<br />

体 、 温 度 信 号 采 样 电 路 、D/A 控 制 真 空 泵 驱 动 模 块 、PWM 步 进 电 机 控 制 模 块 、 键 盘 阵 列 模 块 、EDU 与<br />

气 体 传 感 器 加 热 控 制 模 块 以 及 电 磁 阀 控 制 模 块 相 互 连 接 , 从 而 构 成 整 台 电 子 鼻 检 测 仪 器 的 硬 件 基 础 。<br />

整 台 仪 器 是 由 220V 的 开 关 电 源 供 电 。<br />

在 对 呼 吸 气 体 检 测 的 实 际 应 用 中 , 气 体 传 感 器 的 选 择 与 气 室 的 制 作 是 该 仪 器 设 计 的 关 键 , 表 1 列 出<br />

的 是 样 机 设 计 阶 段 所 采 用 的 金 属 氧 化 物 传 感 器 , 敏 感 气 体 与 相 应 的 气 体 浓 度 检 测 范 围 。<br />

表 1 气 体 传 感 器 选 型<br />

传 感 器 种 类 检 测 范 围 敏 感 气 体<br />

TGS822 50-4000ppm 乙 醇 、 苯 、 丙 酮 等<br />

TGS825 5-100ppm 硫 化 氢 等 硫 化 物<br />

TGS826 20-120ppm 氨 、 乙 醇 、 丁 烷 等<br />

TGS2602 1-30ppm 甲 苯 、 硫 化 氢 、 乙 醇 、 氨 等<br />

在 实 际 的 人 体 呼 吸 气 体 中 , 标 志 气 体 的 浓 度 是 比 较 低 的 , 然 而 电 子 鼻 检 测 技 术 的 应 用 , 能 够 显 著<br />

地 降 低 仪 器 对 标 志 气 体 的 检 测 下 限 , 约 为 0.1〜0.5ppm。 在 单 个 传 感 器 无 法 完 成 对 低 浓 度 气 体 的 检 测<br />

时 , 传 感 器 阵 列 检 测 技 术 、EDU 高 效 富 集 作 用 和 气 体 在 气 路 中 流 动 速 度 的 优 化 都 能 帮 助 仪 器 完 成 对 呼<br />

吸 气 体 检 测 的 任 务 。<br />

7.3.4 软 件 模 块 描 述<br />

仪 器 软 件 设 计 部 分 主 要 包 括 气 体 进 样 控 制 流 程 、PCA 主 成 份 分 析 与 判 断 流 程 、 数 据 传 输 控 制 流<br />

程 。<br />

在 气 体 进 样 控 制 流 程 中 包 括 直 接 进 样 流 程 与 吸 附 进 样 流 程 , 两 个 流 程 的 切 换 是 基 于 对 气 体 浓 度<br />

的 定 性 判 断 。 同 时 , 气 路 切 换 是 由 LPC2478 控 制 步 进 电 机 带 动 六 通 阀 实 现 的 。<br />

吸 附 进 样 相 比 于 直 接 进 样 增 加 了 对 EDU 的 温 控 流 程 , 并 分 阶 段 实 现 对 低 浓 度 样 本 气 体 的 检 测 。<br />

而 在 进 样 过 程 结 束 之 后 , 系 统 均 会 程 序 化 执 行 “ 降 温 延 时 ” 与 “ 冲 洗 气 路 ” 流 程 , 为 下 一 次 进 样 做 好 准<br />

备 。<br />

进 样 过 程 最 后 , 系 统 都 将 把 气 体 传 感 器 阵 列 输 出 的 响 应 值 实 时 描 绘 在 TFT 液 晶 屏 的 T( 时 间 )-C<br />

( 浓 度 ) 坐 标 系 上 , 该 采 样 过 程 是 由 LPC2478 的 Timer2 定 时 产 生 中 断 实 现 的 。 传 感 器 响 应 曲 线 将 在<br />

72


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

“ 数 据 分 析 ” 的 第 一 页 重 现 , 并 对 一 次 采 样 结 束 之 后 的 数 据 作 主 成 份 分 析 , 在 标 准 气 体 实 验 的 基 础 上 ,<br />

可 以 通 过 该 分 析 过 程 判 断 出 样 本 呼 吸 气 体 中 的 主 要 成 分 , 并 将 LPC2478 判 断 的 结 果 显 示 在 液 晶 屏 幕<br />

上 。<br />

通 过 “ 数 据 传 输 ” 功 能 , 可 以 把 传 感 器 阵 列 对 样 本 气 体 的 响 应 值 记 录 下 来 , 在 USB HOST 控 制 器<br />

的 管 理 下 , 将 需 要 记 录 的 数 据 值 写 入 USB 设 备 中 , 这 些 数 据 可 以 作 为 PC 人 工 神 经 网 络 (ANN) 分 析 的<br />

原 始 数 据 , 在 提 供 训 练 案 例 的 前 提 下 , 也 希 望 PC 通 过 ANN 分 析 能 给 出 更 为 准 确 的 诊 断 结 果 。 系 统 也 可<br />

以 对 SD 卡 读 写 数 据 , 其 中 记 录 了 每 一 次 样 本 气 体 分 析 的 数 据 和 PCA 分 析 的 结 果 , 这 有 利 于 为 用 户 形 成<br />

长 期 观 察 的 病 历 记 录 。 通 过 UART, 系 统 与 PC 相 连 接 , 在 PC 上 利 用 自 己 开 发 编 写 的 串 口 通 讯 软 件 对 电<br />

子 鼻 仪 器 的 运 行 状 态 进 行 实 时 监 控 , 并 以 数 据 库 的 形 式 对 这 些 数 据 进 行 管 理 。<br />

以 上 过 程 在 涉 及 到 具 体 操 作 时 , 系 统 都 将 利 用 LPC2478 强 大 的 彩 色 液 晶 控 制 器 与 用 户 实 现 交 互 ,<br />

使 整 个 呼 吸 气 体 检 测 的 过 程 透 明 化 , 用 户 可 以 通 过 系 统 的 提 示 , 经 过 简 单 的 操 作 完 成 对 身 体 健 康 状 况<br />

的 监 测 。 如 图 2 所 示 为 液 晶 显 示 的 主 要 操 作 界 面 。<br />

7.3.5 结 语<br />

图 2 TFT 液 晶 显 示 的 主 要 操 作 界 面<br />

本 项 目 设 计 的 通 用 人 体 呼 吸 气 体 检 测 电 子 鼻 仪 器 是 定 位 于 家 庭 使 用 , 为 那 些 长 期 酗 酒 、 吸 烟 和 因<br />

此 导 致 呼 吸 道 、 胃 肠 道 不 适 的 人 群 以 及 其 他 生 理 性 、 病 理 性 胃 肠 道 不 适 或 炎 症 的 用 户 群 体 设 计 , 仪 器<br />

采 用 了 恩 智 浦 最 新 研 发 的 LPC2478 微 控 制 器 , 充 分 利 用 其 彩 色 液 晶 控 制 器 、 内 部 ADC、DAC、PWM、<br />

Timer 等 功 能 模 块 , 完 成 对 呼 吸 气 体 的 检 测 和 基 于 PCA 的 诊 断 分 析 , 并 结 合 USB HOST 与 SD 读 写 控 制<br />

器 完 成 数 据 的 移 植 与 传 输 , 使 整 个 电 子 鼻 检 测 仪 器 的 功 能 得 到 完 善 。 如 图 4 所 示 为 本 项 目 设 计 的 呼 吸<br />

气 体 检 测 电 子 鼻 仪 器 的 实 验 样 机 。<br />

用 户 在 使 用 该 仪 器 对 自 己 的 呼 吸 气 体 进 行 检 测 之 前 , 只 需 要 用 气 袋 收 集 空 腹 时 的 “ 吹 气 ”, 然 后 按<br />

73


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

照 系 统 操 作 的 提 示 完 成 进 样 与 检 测 , 易 于 使 用 , 并 通 过 无 创 和 低 成 本 的 操 作 过 程 完 成 对 自 身 健 康 状 况<br />

的 检 测 与 记 录 。<br />

利 用 LPC2478 的 USB OTG 与 以 太 网 控 制 模 块 更 能 提 高 仪 器 数 据 传 输 的 灵 活 性 。 在 如 图 3 所 示 的<br />

实 验 样 机 基 础 上 , 选 用 小 型 的 气 路 元 件 并 采 用 触 摸 屏 技 术 能 够 将 其 在 便 携 式 的 设 计 上 更 进 一 步 , 实 现<br />

手 持 式 。<br />

图 3 通 用 人 体 呼 吸 气 体 检 测 电 子 鼻 仪 器 实 验 样 机<br />

参 考 文 献<br />

[1] P. Wang, Artificial Olfactory and Artificial Taste. Beijing: Science Press, 2007;<br />

[2] Y. J. Ma, G..Q. Liu, and H.-D. Zhang, “Feasibility of ammonia breath test in diagnosis of<br />

Helicobacter pylori infection,” World Chinese Journal of Digestology, vol 14, pp. 3804-3808, 2006.<br />

[3] 周 立 功 等 ,ARM 嵌 入 式 系 统 应 用 技 术 笔 记 —— 基 于 LPC2400[M], 广 州 致 远 电 子 有 限 公 司 ,<br />

2008;<br />

[4] 周 立 功 等 , 深 入 浅 出 ARM7—— 基 于 LPC2400[M] , 广 州 致 远 电 子 有 限 公 司 ,2008;<br />

[5] 周 立 功 等 ,USB 开 发 指 南 —— 基 于 LPC2400[M], 广 州 致 远 电 子 有 限 公 司 ,2008;<br />

[6] 周 立 功 等 ,μC/OS-II 微 小 内 核 分 析 与 程 序 设 计 —— 基 于 LPC2400[M], 广 州 致 远 电 子 有 限 公<br />

司 ,2008。<br />

74


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

7.4 基 于 LPC2000 系 列 MCU 的 定 位 与 监 控 系 统 实 现<br />

7.4.1 方 案 概 述<br />

本 文 介 绍 了 基 于 LPC2000 系 列 MCU 的 定 位 与 监 控 系 统 的 设 计 与 实 现 , 该 方 案 采 用 了 两 个 MCU 端<br />

口 与 一 个 GPS 模 块 和 一 个 GPS 模 块 实 现 通 信 。 本 文 提 供 了 配 置 LPC2000 系 列 2 个 COM 端 口 的 完 整 代<br />

码 , 它 获 取 来 自 GPS 模 块 的 定 位 数 据 例 如 经 度 纬 度 信 息 , 然 后 将 相 关 的 数 据 经 由 短 信 发 给 用 户 , 这 个<br />

短 信 服 务 由 GSM 网 络 提 供 支 持 。<br />

对 于 GPS 模 块 , 选 用 的 是 HOLUX GR-87, 它 是 一 个 高 性 能 、 低 功 耗 、 小 尺 寸 易 于 集 成 的 GPS 引 擎<br />

板 ,GPS 模 块 选 用 的 是 西 门 子 的 TC35 GSM 引 擎 , 工 作 于 GSM 900 MHz 和 GSM 1800 MHz 两 个 频 段 ,<br />

可 为 语 音 和 数 据 传 输 提 供 快 捷 方 便 的 无 线 连 接 。<br />

在 该 设 计 中 , 主 系 统 采 用 的 是 LPC214x, 代 码 可 以 方 便 地 移 植 到 其 它 LPC2000 系 列 MCU 上 。<br />

7.4.2 配 件 设 计<br />

1. 连 接 GR-87 GPS 模 块<br />

GR-87 由 SiRF star III 芯 片 组 、LNA 以 及 专 有 软 件 组 成 , 该 系 统 功 能 方 框 图 如 下 所 示 :<br />

图 1 GR-87 GPS 模 块 功 能 方 框 图<br />

GR-87 使 用 6 脚 接 口 连 接 器 , 管 脚 描 述 如 表 1 所 示 , 从 图 上 可 以 看 出 ,GR-87 使 用 一 个 标 准 UART 与<br />

其 他 系 统 通 信 , 所 以 我 们 可 以 用 UART 把 这 个 模 块 直 接 连 接 到 我 们 的 LPC2000 上 , 在 这 个 设 计 中 我 们<br />

把 GR-87 信 号 送 到 LPC213x UART port 0。<br />

表 1 GR87 连 接 器 管 脚 分 配<br />

管 脚 管 脚 名 功 能 描 述<br />

1 VCC_5V +3.5~5.5V 直 流 电 源 输 入<br />

2 TXA 串 行 数 据 输 出 端 口 A( 电 平 :Voh≥2.4V Vol≤0.4V loh=lol=2mA)<br />

3 RXA 串 行 数 据 输 入 端 口 A( 电 平 :Vih≥0.7*VCC Vil≤0.3*VCC)<br />

4 RXB 串 行 数 据 输 入 端 口 B( 电 平 :Vih≥0.7*VCC Vil≤0.3*VCC)<br />

75


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

管 脚 管 脚 名 功 能 描 述<br />

5 GND 电 源 地<br />

6<br />

TIMEMARK<br />

RESET( 可 选 )<br />

TIMEMARK:1PPS 时 间 标 签 输 出 (Vil≤0.2V 脉 冲 宽 度 10ms)。<br />

RESET: 复 位 输 入 ( 低 电 平 有 效 )( 可 选 功 能 )<br />

2. 与 TC35 GSM 模 块 连 接<br />

该 GSM 引 擎 通 过 一 个 主 接 口 连 接 到 应 用 平 台 上 , 连 接 是 采 用 4 0 脚 间 距 为 0.5mm 的 ZIF( Zero<br />

Insertion Force 零 插 拔 力 插 座 ) 连 接 器 ( 如 图 2 所 示 ), 我 们 会 在 后 面 的 章 节 介 绍 这 个 主 接 口 所 包 含 的 几<br />

个 子 接 口 。<br />

* 电 源 供 电 与 充 电 ;<br />

* 串 行 接 口 ;<br />

* 2 个 音 频 接 口 ;<br />

* SIM 接 口 。<br />

图 2 TC35 功 能 框 图<br />

为 了 简 化 设 计 , 我 们 没 有 连 接 音 频 接 口 到 这 个 系 统 , 在 这 个 设 计 中 , 我 们 把 TC35 的 串 行 接 口 连 接<br />

到 LPC213x 的 UART port 1, 调 制 解 调 器 接 口 是 可 选 的 , 相 关 的 端 口 电 路 图 如 图 3 所 示 。<br />

76


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 3 TC35 端 口 电 路 图<br />

7.4.3 软 件 实 现<br />

代 码 实 例 用 C 语 言 编 写 并 经 过 Keil uVision(MDK,V3.23) 免 费 DEMO 编 译 器 编 译 过 。<br />

1.RG-87<br />

GR- 87 接 口 协 议 基 于 NME A( National Marine Electronics Association"( 国 际 海 洋 电 子 协<br />

会 ))0183 ASC 接 口 规 范 , 它 在 NMEA 0183, Version 2.2 中 和 航 海 无 线 电 技 术 委 员 会 (RTCM,Radio<br />

Technical Commission for Maritime Services) 推 荐 差 分 Navstar GPS 服 务 ,Version 2.1,RTCM 特<br />

别 委 员 会 No.104 中 均 有 定 义 。<br />

GR-87 NEMA 数 据 模 式<br />

NEMA 输 出 缺 省 通 信 参 数 是 9600 波 特 ,8 个 数 据 位 、 停 止 位 , 无 奇 偶 校 验 。<br />

GR-87 支 持 下 列 5 个 类 似 的 NEMA 记 录 。<br />

表 2 NEMA-0183 输 出 信 息<br />

NEMA 记 录<br />

GPGGA<br />

GPGLL<br />

GPGSA<br />

GPGSV<br />

GPRMC<br />

描 述<br />

全 球 定 位 系 统 固 定 数 据<br />

地 理 方 位 -- 经 、 纬 度<br />

GNSS DOP 和 有 效 卫 星<br />

视 线 内 的 GNSS 卫 星<br />

被 推 荐 的 最 小 GNSS 规 格 数 据<br />

77


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

GR-87 缺 省 输 出 信 息 是 GPRMC, 在 本 设 计 方 案 中 , 我 们 使 用 GR-87 缺 省 设 置 , 无 需 其 他 初 始 化 。<br />

表 3 解 释 了 下 列 示 例 信 息 中 的 数 值 含 义 :<br />

$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598, ,*10<br />

表 3 RMC 数 据 格 式<br />

名 称 示 例 单 位 描 述<br />

信 息 ID $GPRMC RMC 协 议 头<br />

UTC 时 间 161229.487 hhmmss.sss<br />

状 态 A A= 数 据 有 效 ,V= 数 据 无 效<br />

纬 度 3723.2475 ddmm.mmmm<br />

南 / 北 指 示 N N= 北 ,S= 南<br />

经 度 12158.3416 ddmm.mmmm<br />

东 / 西 指 示 W E= 东 ,W= 西<br />

对 地 速 度 0.13 节<br />

对 地 航 向 309.62 度 真 实<br />

日 期 120598 ddmmyy<br />

磁 变 度 E= 东 ,W= 西<br />

校 验 和 *10<br />

<br />

信 息 结 束 位<br />

2.TC 35<br />

(1)TC35 上 电<br />

要 开 启 GSM 引 擎 , 需 要 用 到 IGT 启 动 电 路 , 加 电 顺 序 如 图 4 所 示 。<br />

图 4 TC35 加 电 顺 序<br />

78


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

在 我 们 的 系 统 中 , 我 们 把 /IGT 信 号 送 到 LPC213x 的 PIN P0.21, 根 据 启 动 顺 序 ,TC35 初 始 化 如 下<br />

所 示 :<br />

void reset_gsm(void)<br />

{<br />

IO0DIR |= GSMIGT | GSMDSR | GSMRTS | GSMDTR | GSMPD ;<br />

IO0SET = GSMIGT | GSMDSR | GSMRTS | GSMDTR | GSMPD ;<br />

delay(6000);<br />

IO0CLR = GSMIGT ;<br />

delay(800000);<br />

IO0SET = GSMIGT ;<br />

}<br />

(2)TC35 的 配 置<br />

在 TC35 加 电 以 后 , 我 们 可 以 使 用 AT 命 令 配 置 TC35<br />

BYTE init_gsm(void)<br />

{<br />

BYTE j=0;<br />

BYTE restore[4] = "AT&F";<br />

BYTE msgformat[9] = "AT+CMGF=1";<br />

BYTE msgindicat[17] = "AT+CNMI=1,1,0,0,1";<br />

// Del msg<br />

for(j=0;j


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

send_string_to_com1( msgindicat, 17);<br />

…<br />

}<br />

注 意 : 如 果 要 了 解 更 多 AT 命 令 信 息 , 可 以 参 考 《 西 门 子 电 话 蜂 窝 AT 命 令 集 》。<br />

经 过 这 个 配 置 后 , 如 果 GSM 信 号 有 效 , 则 TC35 模 块 会 注 册 到 GSM 网 络 , 它 就 可 以 接 收 来 自 GSM<br />

网 络 的 短 信 了 , 如 果 有 新 的 短 信 接 收 ,TC35 模 块 会 发 出 如 下 字 符 给 主 机 接 口 :<br />

+CMTI: "SM", 1<br />

该 信 息 解 释 如 表 4 所 示 :<br />

表 4 短 信 命 令 解 释<br />

名 称 示 例 描 述<br />

信 息 ID +CMTI 信 息 头<br />

信 息 存 储 “SM” 信 息 存 储 位 置<br />

信 息 索 引 1 信 息 存 储 索 引<br />

当 主 机 接 收 到 这 个 信 息 后 , 它 会 提 示 有 个 新 的 短 信 接 收 , 主 机 会 用 索 引 读 出 来 自 TC35 模 块 的 新 信<br />

息 内 容 , 为 了 读 出 来 自 这 个 模 块 的 信 息 , 它 使 用 如 下 AT 命 令 :<br />

AT+CMGR=<br />

这 个 命 令 会 返 回 如 下 字 符 :<br />

+CMGR: "REC UNREAD","+8613888888888",,"09/01/02,22:40:43+32"<br />

ABCDEFGHIJKLMN<br />

OK<br />

表 5 对 这 个 字 符 串 信 息 进 行 的 解 释 :<br />

表 5 短 信 内 容 解 释<br />

名 称 示 例 描 述<br />

信 息 ID +CMGR 信 息 头<br />

记 录 状 态 “REC UNREAD” 记 录 状 态<br />

源 手 机 号 码 “+13888888888” 源 手 机 号 码<br />

NOP<br />

接 收 时 间 “09/01/02,22:40:43+32” 接 收 时 间<br />

信 息 内 容 ABCDEFGIJKLMN 内 容<br />

命 令 状 态<br />

OK<br />

7.4.4 DEMO 描 述<br />

把 一 个 有 效 的 GSM SIM 卡 插 入 到 SIM 卡 卡 槽 中 , 然 后 把 GPS 天 线 连 接 到 GR-87 模 块 上 , 再 给 板 子<br />

80


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

加 电 ,USB 连 接 线 和 外 部 适 配 器 会 正 常 工 作 , 如 果 GPS 信 号 是 有 效 的 ( 通 常 要 用 1 分 钟 左 右 的 时 间 ),<br />

则 经 纬 度 位 置 信 息 将 显 示 在 LCD 上 , 这 时 你 可 以 用 另 一 个 手 机 发 短 信 到 这 个 模 块 , 如 果 短 信 启 动 了<br />

GPS, 则 模 块 会 发 送 经 纬 度 信 息 给 你 。<br />

图 5 DEMO 启 动 示 意 图<br />

参 考 文 献<br />

[1] TC35/TC37 硬 件 接 口 描 述 ;<br />

[2] AT Command Set Siemens Cellular Engines;<br />

[3] GR-87 Serials 用 户 手 册 ;<br />

[4] LPC2131/2/4/6/8 用 户 手 册 。<br />

7.5 恩 智 浦 P89LPC922+PCF8576 电 表 微 控 制 器 方 案<br />

7.5.1 方 案 总 体 介 绍<br />

恩 智 浦 拥 有 丰 富 的 针 对 电 表 应 用 的 MCU 和 接 口 产 品 ; 在 国 内 有 周 立 功 等 知 名 的 电 表 方 案 提 供 商 ,<br />

以 恩 智 浦 方 案 为 核 心 , 具 有 强 大 的 专 业 电 表 方 案 设 计 能 力 , 为 客 户 厂 商 提 供 全 面 产 品 技 术 支 持 。 目 前 ,<br />

恩 智 浦 公 司 的 P89LPC922+PCF8576 电 表 微 控 制 器 方 案 已 被 国 内 厂 商 大 量 采 用 , 该 方 案 在 江 浙 两 省<br />

已 获 电 表 微 控 制 器 准 入 认 证 。 恩 智 浦 还 提 供 更 多 适 用 于 电 表 的 IC 套 件 , 如 接 口 器 件 、 温 度 传 感 器 件 、<br />

LED/LCD 驱 动 器 件 等 。<br />

7.5.2 方 案 特 点<br />

(1)P89LPC922 是 增 强 型 80C51 内 核 的 微 控 制 器 。 集 成 多 种 电 表 应 用 所 需 的 接 口 模 块 , 如 I 2 C,<br />

UART, 模 拟 比 较 器 等 , 使 用 户 在 设 计 系 统 时 只 要 用 最 少 的 外 围 器 件 , 还 具 有 自 动 掉 电 检 测 和 “ 在 应 用<br />

编 程 IAP” 等 功 能 。<br />

81


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

(2)PCF8576 可 驱 动 多 达 160 段 字 段 的 显 示 , 并 可 以 最 多 级 联 16 颗 相 同 的 驱 动 芯 片 , 使 驱 动 的 字 段<br />

数 可 多 达 2560 段 ; 具 备 通 信 速 度 达 400kHz 的 I 2 C 总 线 接 口 , 更 方 便 了 用 户 对 其 进 行 的 控 制 ; 内 部 集 成<br />

振 荡 器 、 偏 压 电 路 等 , 可 使 其 几 乎 不 需 要 外 围 器 件 即 可 以 工 作 。<br />

该 方 案 中 P89LPC922 的 I 2 C 总 线 能 挂 接 多 个 I 2 C 接 口 产 品 , 如 LM75、EEPROM、RTC 和 LCD 驱 动 ,<br />

从 而 减 少 占 用 的 微 控 制 器 口 线 , 节 省 系 统 资 源 。RS485 和 红 外 通 讯 功 能 可 通 过 UART 切 换 使 用 , 并 且 恩<br />

智 浦 还 有 用 GPIO 实 现 UART 的 技 术 方 案 可 供 参 考 。 自 动 掉 电 检 测 能 在 系 统 正 常 或 非 正 常 掉 电 时 记 录 当<br />

时 的 工 作 状 态 , 以 便 今 后 的 检 测 和 恢 复 。 配 合 以 恩 智 浦 最 新 的 RTC 芯 片 -PCF212X, 可 提 高 系 统 计 时<br />

的 精 准 度 , 达 到 3PPM, 即 每 天 的 时 钟 误 差 小 于 0.5 秒 。<br />

P89LPC922+PCF8576 电 表 微 控 制 器 解 决 方 案 不 仅 有 LCD 显 示 功 能 , 还 具 有 防 窃 电 功 能 以 及 费<br />

率 / 时 间 / 编 程 管 理 , 一 天 内 可 分 为 峰 、 平 、 谷 三 种 方 式 , 具 有 日 历 、 计 时 和 自 动 切 换 功 能 , 可 根 据 规 约 实<br />

现 各 种 编 程 。<br />

这 些 设 计 技 巧 有 助 于 工 程 师 简 化 电 表 方 案 的 设 计 、 降 低 物 料 成 本 ; 依 托 于 恩 智 浦 广 泛 的 产 品 系<br />

列 , 更 方 便 于 以 后 的 产 品 升 级 ; 一 站 式 的 电 子 元 器 件 提 供 商 , 能 帮 助 厂 商 降 低 采 购 成 本 。<br />

该 电 表 方 案 方 框 图 如 下 所 示 :<br />

图 1 恩 智 浦 P89LPC922+PCF8576 电 表 微 控 制 器 方 案<br />

82


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

图 2 恩 智 浦 电 表 微 控 制 器 方 案<br />

7.6 嵌 入 式 实 时 操 作 系 统 RreeRTOS 在 ARM7 上 移 植 的 实 现<br />

作 者 : 黄 鹏 程<br />

福 州 大 学 数 学 与 计 算 机 科 学 学 院 福 州 351002<br />

摘 要 :<br />

本 文 介 绍 了 目 前 在 嵌 入 式 系 统 应 用 中 一 个 流 行 的 实 时 操 作 系 统 F r e e R T O S, 详 细 论 述 了<br />

FreeRTOS 在 基 于 ARM 体 系 结 构 的 嵌 入 式 微 控 制 器 LPC2292 上 移 植 的 实 现 过 程 , 指 出 了 在 FreeRTOS<br />

的 移 植 过 程 中 的 重 点 和 难 点 问 题 , 得 出 了 FreeRTOS 在 ARM 上 的 移 植 的 一 般 性 方 法 。<br />

关 键 字 : 操 作 系 统 , FreeRTO, ARM, LPC2292, 移 植<br />

7.6.1 项 目 概 述<br />

FreeRTOS 操 作 系 统 是 一 个 源 码 公 开 的 免 费 的 嵌 入 式 实 时 操 作 系 统 , 具 有 可 移 植 、 可 裁 减 、 调 度<br />

策 略 灵 活 的 特 点 , 可 以 方 便 地 移 植 到 各 种 体 系 结 构 的 微 处 理 器 上 运 行 , 其 最 新 版 本 为 5.2.0 版 。 作 为<br />

一 个 轻 量 级 的 操 作 系 统 ,FreeRTOS 提 供 的 功 能 包 括 : 任 务 管 理 、 时 间 管 理 、 信 号 量 、 消 息 队 列 、 内 存<br />

管 理 、 记 录 功 能 等 , 可 基 本 满 足 较 小 系 统 的 需 要 。FreeRTOS 内 核 支 持 优 先 级 调 度 算 法 , 每 个 任 务 可<br />

根 据 重 要 程 度 的 不 同 被 赋 予 一 定 的 优 先 级 ,CPU 总 是 让 处 于 就 绪 态 的 、 优 先 级 最 高 的 任 务 先 运 行 。<br />

83


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

FreeRTOS 内 核 同 时 支 持 轮 换 调 度 算 法 , 系 统 允 许 不 同 的 任 务 使 用 相 同 的 优 先 级 , 在 没 有 更 高 优 先 级<br />

任 务 就 绪 的 情 况 下 , 同 一 优 先 级 的 任 务 共 享 CPU 的 使 用 时 间 。 在 任 务 的 组 织 实 现 方 面 ,FreeRTOS 内<br />

核 支 持 传 统 的 实 现 : 各 任 务 拥 有 各 自 的 堆 栈 , 支 持 完 全 的 抢 占 式 调 度 。FreeRTOS 内 核 同 时 支 持 各 任<br />

务 共 享 同 一 个 堆 栈 , 使 RAM 的 需 求 进 一 步 减 小 。 但 正 因 如 此 , 该 方 式 的 使 用 受 到 相 对 严 格 的 限 制 。<br />

本 文 移 植 的 硬 件 平 台 是 由 恩 智 浦 公 司 生 产 的 基 于 ARM7TDMI 核 的 微 处 理 器 LPC2292。 开 发 调 试<br />

平 台 是 ARM ADS 1.2。<br />

7.6.2 启 动 代 码 的 编 写<br />

启 动 代 码 是 芯 片 复 位 后 进 入 C 语 言 的 main() 函 数 前 执 行 的 一 段 代 码 , 主 要 是 为 运 行 C 语 言 程 序 提<br />

供 基 本 的 运 行 环 境 , 如 初 始 化 存 储 系 统 等 。 为 了 能 够 进 行 系 统 初 始 化 , 采 用 一 个 汇 编 文 件 作 为 启 动 代<br />

码 是 常 见 的 做 法 。 初 始 化 代 码 所 完 成 的 操 作 与 具 体 的 硬 件 平 台 相 关 , 但 一 般 包 括 如 下 内 容 :<br />

(1) 初 始 化 异 常 向 量 表 ;<br />

(2) 初 始 化 存 储 器 系 统 ;<br />

(3) 初 始 化 堆 栈 ;<br />

(4) 初 始 化 有 特 殊 要 求 的 端 口 、 设 备 ;<br />

(5) 初 始 化 应 用 程 序 的 运 行 环 境 ;<br />

(6) 改 变 处 理 器 的 运 行 模 式 ;<br />

(7) 调 用 主 应 用 程 序 。<br />

需 要 注 意 的 是 , 在 对 处 理 器 每 个 模 式 的 堆 栈 指 针 寄 存 器 进 行 初 始 化 的 时 候 , 用 户 模 式 下 的 堆 栈 寄<br />

存 器 必 须 最 后 进 行 初 始 化 。 因 为 在 用 户 模 式 下 , 不 能 用 MSR 指 令 从 用 户 模 式 切 换 到 其 它 的 特 权 模 式 ,<br />

所 以 如 果 在 其 它 特 权 模 式 的 堆 栈 指 针 被 初 始 化 之 前 切 换 到 用 户 模 式 , 就 无 法 对 特 权 模 式 下 的 堆 栈 指<br />

针 进 行 初 始 化 。<br />

第 二 个 需 要 注 意 的 是 , 程 序 使 用 编 译 器 分 配 的 空 间 作 为 堆 栈 , 而 不 是 按 照 通 常 的 做 法 把 堆 栈 分 配<br />

到 RAM 的 顶 端 。 这 样 做 有 两 个 好 处 :(1) 不 必 知 道 RAM 顶 端 的 位 置 , 移 植 更 加 方 便 。(2) 编 译 器 给 出<br />

的 占 用 RAM 空 间 的 大 小 就 是 实 际 占 用 的 大 小 , 便 于 控 制 RAM 的 分 配 。<br />

7.6.3 FreeRTOS 的 移 植<br />

本 次 一 直 主 要 集 中 在 3 个 文 件 里 面 :portmacro.h,port.c,port.s。 其 中 portmacro.h 主 要 包 含 于 编<br />

译 器 相 关 的 数 据 类 型 的 定 义 、 堆 栈 类 型 的 定 义 以 及 几 个 宏 定 义 和 函 数 说 明 。 而 port.c 中 则 包 含 与 移 植<br />

有 关 的 C 函 数 , 包 括 堆 栈 的 初 始 化 函 数 、 任 务 调 度 器 启 动 函 数 、 临 界 区 的 进 入 与 退 出 、 时 钟 中 断 服 务 程<br />

序 等 。port.s 中 则 包 含 与 移 植 有 关 的 汇 编 语 言 函 数 , 包 括 上 下 文 切 换 、 开 / 关 中 断 、 任 务 切 换 等 。 移 植 中<br />

关 键 的 功 能 模 块 实 现 如 下 文 所 述 。<br />

84


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

1. 开 / 关 中 断 的 实 现<br />

FreeRTOS 使 用 函 数 portDISABLE_INTERRUPTS() 和 portENABLE_INTERRUPTS( ) 分 别 实<br />

现 关 中 断 和 开 中 断 。 这 些 代 码 与 处 理 器 有 关 , 需 要 进 行 移 植 。 在 ARM 处 理 器 核 中 , 关 中 断 和 开 中 断<br />

是 通 过 改 变 程 序 状 态 寄 存 器 CPSR 中 的 相 应 控 制 位 来 实 现 的 。 开 中 断 的 汇 编 语 言 函 数 portENABLE_<br />

INTERRUPTS() 的 代 码 如 下 :<br />

portENABLE_INTERRUPTS<br />

STMDB SP!, {R0} ;/* 把 R0 压 入 栈 */<br />

MRS R0, CPSR ;/* 读 取 状 态 寄 存 器 到 R0 */<br />

BIC R0, R0, #0xC0 ; /* 允 许 IRQ、FIQ 中 断 */<br />

MSR CPSR_cxsf, R0 ; /* 回 写 R0 的 值 到 状 态 寄 存 器 */<br />

LDMIA SP!, {R0} ;/* R0 出 栈 */<br />

BX LR ;/* 函 数 返 回 */<br />

用 类 似 的 方 法 可 以 实 现 关 中 断 函 数 portDISABLE_INTERRUPTS()。<br />

2. 临 界 区 的 进 入 与 退 出<br />

代 码 的 临 界 段 也 称 为 临 界 区 , 指 处 理 时 不 可 分 割 的 代 码 。 一 旦 这 部 分 代 码 开 始 执 行 , 则 不 允 许 任<br />

何 中 断 打 断 。 开 中 断 和 关 中 断 可 以 保 护 临 界 代 码 段 , 保 证 FreeRTOS 的 临 界 代 码 不 会 被 多 个 任 务 和 中<br />

断 服 务 程 序 同 时 访 问 , 避 免 造 成 共 享 数 据 的 不 一 致 性 。 为 了 保 护 临 界 区 的 资 源 , 在 进 入 临 界 区 之 前 须<br />

关 中 断 , 而 临 界 区 代 码 执 行 完 毕 后 , 要 立 即 开 中 断 。 临 界 区 的 退 出 函 数 vPortExitCritical() 代 码 如 下 :<br />

void vPortExitCritical( void )<br />

{<br />

if( ulCriticalNesting > portNO_CRITICAL_NESTING )<br />

{<br />

ulCriticalNesting--; /* 中 断 嵌 套 计 数 器 ulCriticalNesting 自 减 一 */<br />

/* 如 果 中 断 嵌 套 层 数 为 零 的 话 , 则 需 要 开 中 断 . */<br />

if( ulCriticalNesting == portNO_CRITICAL_NESTING )<br />

{<br />

/* 调 用 函 数 portENABLE_INTERRUPTS() 来 开 中 断 . */<br />

portENABLE_INTERRUPTS();<br />

}<br />

85


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

}<br />

}<br />

用 类 似 的 方 法 可 以 实 现 临 界 区 的 进 入 函 数 vPortEnterCritical( )。<br />

3. 堆 栈 的 初 始 化<br />

任 务 创 建 函 数 xTaskCreate() 通 过 调 用 堆 栈 的 初 始 化 函 数 pxPortInitialiseStack() 来 初 始 化 任 务 的<br />

栈 结 构 ; 实 际 是 定 义 了 任 务 堆 栈 上 下 文 (context) 的 内 容 。 所 有 的 寄 存 器 都 保 存 到 堆 栈 中 , 堆 栈 看 起 来<br />

就 像 中 断 刚 发 生 过 一 样 。 上 下 文 的 保 存 格 式 如 图 1 所 示 。<br />

在 堆 栈 的 上 下 文 中 ,PC 存 放 任 务 执 行 的 第 一 条 指 令 ,LR 保 存 的 是 任 务 的 返 回 地 址 ,SP 保 存 的 是<br />

任 务 的 堆 栈 地 址 。R0 存 放 的 是 传 递 给 任 务 的 参 数 。CPSR 存 放 的 是 任 务 运 行 时 处 理 器 的 初 始 状 态 。<br />

CriticalNesting 存 放 的 是 中 断 嵌 套 计 数 器 ulCriticalNesting 的 值 。 任 务 堆 栈 的 上 下 文 保 存 结 构 与 任 务 切<br />

换 的 实 现 紧 密 相 关 , 所 以 我 们 在 设 计 上 下 文 保 存 结 构 的 时 候 , 要 重 点 考 虑 实 现 任 务 切 换 的 便 捷 性 。<br />

PC<br />

LR<br />

SP<br />

R12<br />

.........<br />

R1<br />

R0<br />

CPSR<br />

CriticalNesting<br />

图 1 上 下 文 的 保 存 结 构<br />

portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack,<br />

pdTASK_CODE pxCode, void *pvParameters )<br />

{<br />

portSTACK_TYPE *pxOriginalTOS;<br />

pxOriginalTOS = pxTopOfStack;<br />

*pxTopOfStack = ( portSTACK_TYPE ) pxCode + portINSTRUCTION_SIZE; /* PC */<br />

*(--pxTopOfStack) = ( portSTACK_TYPE ) 0xaaaaaaaa; /* R14 */<br />

*(--pxTopOfStack) = ( portSTACK_TYPE ) pxOriginalTOS; /* SP */<br />

*(--pxTopOfStack) = ( portSTACK_TYPE ) 0x12121212; /* R12 */<br />

.................................................<br />

86


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

*(--pxTopOfStack) = ( portSTACK_TYPE ) pvParameters; /* R0 */<br />

*(--pxTopOfStack) = ( portSTACK_TYPE ) portINITIAL_SPSR; /* CPSR */<br />

*(--pxTopOfStack) = portNO_CRITICAL_SECTION_NESTING; /* ulCriticalNesting */<br />

return pxTopOfStack;<br />

}<br />

4. 上 下 文 的 保 存 与 恢 复<br />

本 次 移 植 分 别 定 义 了 两 个 宏 来 实 现 上 下 文 的 保 存 和 恢 复 , 分 别 是 :por tSAVE_CONTEXT() 和<br />

portRESTORE_CONTEXT()。portSAVE_CONTEXT() 宏 首 先 设 置 R0 指 向 任 务 的 堆 栈 , 接 着 保 存 任 务<br />

的 返 回 地 址 , 然 后 再 保 存 其 他 的 寄 存 器 和 CPSR, 以 及 中 断 嵌 套 计 数 器 。 最 后 把 新 的 栈 顶 保 存 在 当 前<br />

的 任 务 控 制 块 里 面 。 其 宏 定 义 如 下 :<br />

MACRO<br />

portSAVE_CONTEXT<br />

STMDB SP!, {R0} ; 设 置 R0 指 向 任 务 堆 栈 .<br />

STMDB SP, {SP}^<br />

SUB SP, SP, #4<br />

LDMIA SP!, {R0}<br />

STMDB R0!, {LR}<br />

MOV LR, R0<br />

LDMIA SP!, {R0}<br />

STMDB LR, {R0-LR}^ ; 把 R0-LR 寄 存 器 压 入 任 务 堆 栈<br />

SUB LR, LR, #60<br />

MRS R0, SPSR ; 把 SPSR 压 入 任 务 堆 栈<br />

STMDB LR!, {R0}<br />

LDR R0, =ulCriticalNesting ; 把 中 断 嵌 套 计 数 器 压 入 任 务 堆 栈<br />

LDR R0, [R0]<br />

STMDB LR!, {R0}<br />

LDR R1, =pxCurrentTCB ; 存 储 当 前 的 任 务 堆 栈 栈 顶 到 任 务 控 制 块 中<br />

LDR R0, [R1]<br />

STR LR, [R0]<br />

MEND<br />

87


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

利 用 类 似 的 方 法 可 以 实 现 portRESTORE_CONTEXT() 宏 , 需 要 注 意 的 是 , 该 宏 要 严 格 按 照 保 存 上 下<br />

文 的 相 反 的 顺 序 恢 复 上 下 文 。<br />

5. 启 动 任 务 调 度<br />

操 作 系 统 初 始 化 之 后 , 就 可 以 开 启 系 统 时 钟 , 运 行 系 统 内 第 1 个 最 高 优 先 级 的 就 绪 任 务 。 对 于 第 1<br />

个 执 行 的 任 务 , 不 需 要 进 行 上 下 文 切 换 , 而 只 要 恢 复 上 下 文 即 可 。 第 一 个 任 务 的 执 行 是 通 过 调 用 汇 编<br />

函 数 portRESTORE_CONTEXT() 恢 复 上 下 文 来 实 现 的 。 启 动 任 务 调 度 程 序 代 码 如 下 :<br />

portBASE_TYPE xPortStartScheduler( void )<br />

{<br />

prvSetupTimerInterrupt(); /* 设 置 并 启 动 Timer0. */<br />

vPortStartFirstTask(); /* 启 动 第 一 个 任 务 . */<br />

return 0;<br />

}<br />

6. 任 务 切 换 的 实 现<br />

程 序 中 por tYIELD() 函 数 的 调 用 , 会 进 行 一 次 任 务 级 的 上 下 文 切 换 。 在 本 次 移 植 中 , 使 用 软 件<br />

中 断 指 令 SWI 是 处 理 器 进 入 管 理 模 式 和 ARM 指 令 状 态 , 并 使 用 功 能 0 实 现 por tYIELD() 的 功 能 。<br />

portYIELD()( 功 能 号 0) 最 终 使 用 程 序 vPortYieldProcessor 实 现 。vPortYieldProcessor 的 汇 编 代 码 如<br />

下 :<br />

vPortYieldProcessor<br />

ADD LR, LR, #4<br />

portSAVE_CONTEXT ; 保 存 上 下 文 ( 宏 )<br />

LDR R0, =vTaskSwitchContext ; 选 择 就 绪 的 优 先 级 最 高 优 先 级 的 任 务<br />

MOV LR, PC<br />

BX R0<br />

portRESTORE_CONTEXT ; 恢 复 上 下 文 ( 宏 )<br />

7. 时 钟 中 断 服 务 的 实 现<br />

当 时 钟 中 断 到 来 的 时 , 处 理 器 跳 转 到 相 应 的 时 钟 中 断 服 务 程 序 , 时 钟 中 断 服 务 程 序 主 要 调 用<br />

vTaskIncrementTick() 函 数 , 该 处 理 函 数 主 要 处 理 跟 系 统 时 钟 相 关 的 工 作 , 如 将 时 钟 节 拍 数 加 1, 检<br />

查 是 否 有 更 高 优 先 级 的 任 务 就 绪 等 等 。 系 统 时 钟 中 断 服 务 程 序 由 vTickISR() 函 数 实 现 。 包 括 以 下 步<br />

骤 :(1) 保 存 上 下 文 。(2) 调 用 vTaskIncrementTick() 函 数 , 如 果 系 统 的 调 度 策 略 配 置 为 可 抢 占 调 度 ,<br />

88


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

则 查 找 最 高 优 先 级 的 就 绪 任 务 。(3) 清 除 中 断 源 , 并 通 知 中 断 控 制 器 中 断 结 束 。(4) 恢 复 上 下 文 。<br />

vTickISR() 函 数 的 代 码 如 下 :<br />

void vTickISR( void )<br />

{<br />

portSAVE_CONTEXT(); /* 需 要 保 存 上 下 文 */<br />

/* 增 加 xTickCount 值 , 检 查 新 的 xTickCount 值 是 否 引 起 一 个 延 迟 周 期 过 期 , 这 个 函 数 调 用 可 导<br />

致 一 个 任 务 变 成 准 备 运 行 . */<br />

vTaskIncrementTick();<br />

/* 如 果 是 系 统 配 置 为 可 抢 占 式 调 度 , 则 检 查 是 否 要 上 下 文 切 换 。 如 果 唤 醒 的 任 务 比 已 经 中 断 的 任<br />

务 有 更 高 优 先 级 , 就 需 要 切 换 */<br />

#if configUSE_PREEMPTION == 1<br />

vTaskSwitchContext();<br />

#endif<br />

T0IR= portTIMER_MATCH_ISR_BIT; /* 清 除 中 断 源 */<br />

VICVectAddr = portCLEAR_VIC_INTERRUPT; /* 通 知 中 断 控 制 器 中 断 结 束 */<br />

/* 恢 复 上 下 文 . 如 果 发 生 了 上 下 文 切 换 , 这 将 恢 复 要 继 续 运 行 的 任 务 的 上 下 文 */<br />

portRESTORE_CONTEXT();<br />

}<br />

7.6.4. 结 论<br />

本 文 设 计 并 实 现 了 FreeRTOS 5.2.0 操 作 系 统 到 ARM7 处 理 器 上 的 移 植 。 移 植 程 序 在 福 州 大 学 工 业 控<br />

制 研 究 所 自 行 研 制 的 ZD100 终 端 上 实 现 , 经 该 环 境 的 多 任 务 运 行 结 果 表 明 , 系 统 稳 定 可 靠 。 同 时 , 移<br />

植 的 方 法 在 同 类 ARM 架 构 的 处 理 器 上 具 有 较 强 的 通 用 性 。<br />

参 考 文 献<br />

[1] Richard Barry. Creating a New FreeRTOS.org Port[EB/OL]<br />

http://www.freertos.org/FreeRTOS-porting-guide.html.2008.1-1;<br />

[2] NXP Semiconductors. LPC2292 USER MANUAL[Z]. 2004.14-77;<br />

[3] 刘 滨 , 王 琦 , 刘 丽 丽 . 嵌 入 式 操 作 系 统 FreeRTOS 的 原 理 与 实 现 [J]. 单 片 机 与 嵌 入 式 系 统 应 用 ,<br />

2005.7:8-11;<br />

[4] ARM Limited. ARM Developer Suite(Version 1.2).Developer Guide[Z].1999.43-51;<br />

[5] 周 立 功 . ARM 嵌 入 式 系 统 基 础 教 程 [M]. 北 京 : 北 京 航 空 航 天 大 学 出 版 社 .2004.30-281;<br />

89


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

第 8 章 MCU 应 用 开 发 百 问<br />

8.1 关 于 ARM 内 核 问 答<br />

1. 问 : 哪 款 ARM 支 持 浮 点 运 算 ARM7 难 道 不 支 持 浮 点 数 运 算 吗 <br />

答 : 一 般 的 ARM9 芯 片 都 带 有 硬 件 浮 点 运 算 。ARM7 不 支 持 硬 件 浮 点 运 算 , 如 果 需 要 可 以 使 用 软<br />

件 算 法 模 拟 实 现 。 可 在 网 上 查 找 相 关 资 源 , 简 单 地 说 , 软 件 模 拟 就 是 转 化 为 整 数 , 再 进 行 运 算 。<br />

例 如 :3.6*4.2 = 36*42= 1512, 结 果 再 取 余 运 算 ,1512/100 = 12 剩 下 放 大 的 小 数 , 结 果 再 取 整 ,<br />

1512/100=15 就 是 整 数 了 , 加 一 起 就 是 15.12。<br />

2. 问 : 初 学 者 一 开 始 就 必 须 掌 握 ARM 体 系 结 构 与 汇 编 指 令 <br />

答 : 未 必 ! 很 多 ARM 初 学 者 , 一 开 始 就 抱 着 有 关 ARM 体 系 结 构 的 书 籍 开 始 苦 读 , 更 有 甚 者 , 在 很<br />

多 体 内 容 上 钻 牛 角 尖 , 把 大 量 时 间 花 在 了 ARM 汇 编 指 令 上 , 几 个 月 下 来 , 进 展 不 大 , 虽 然 也 能 知 道<br />

一 些 ARM 的 相 关 概 念 , 但 离 真 正 的 具 体 应 用 相 差 甚 远 , 很 多 初 学 者 会 感 觉 到 , 学 完 ARM 体 系 结 构<br />

后 , 对 ARM 的 应 用 还 是 无 从 下 手 , 一 片 茫 然 , 有 的 甚 至 就 因 为 这 个 原 因 , 被 挡 在 了 ARM 嵌 入 式 开 发<br />

领 域 的 大 门 外 , 从 此 放 弃 了 ARM 嵌 入 式 开 发 的 学 习 。 当 然 , 并 不 是 主 张 用 户 不 看 ARM 体 系 结 构 的<br />

相 关 书 籍 , 关 键 在 于 怎 么 看 、 看 到 什 么 程 度 。 根 据 经 验 ,ARM 初 学 者 对 于 ARM 体 系 结 构 的 相 关 知<br />

识 只 需 做 到 “ 了 解 ” 这 一 程 度 就 可 以 了 , 对 于 ARM 的 汇 编 指 令 完 全 可 以 不 用 记 忆 , 只 要 能 看 懂 就 可<br />

以 ( 目 前 大 部 分 基 于 ARM 的 产 品 开 发 都 采 用 C 语 言 , 汇 编 语 言 的 使 用 机 会 大 大 减 少 , 只 有 在 操 作<br />

系 统 移 植 以 及 某 些 特 殊 应 用 中 才 会 用 到 部 分 汇 编 指 令 )。 随 着 初 学 者 对 ARM 更 深 入 地 学 习 , 有 关<br />

ARM 体 系 结 构 与 汇 编 指 令 的 知 识 以 后 可 能 会 反 复 出 现 , 遇 到 时 再 有 针 对 性 的 重 点 看 , 相 信 会 取<br />

得 比 较 好 的 效 果 。<br />

3. 问 : 嵌 入 式 处 理 器 可 分 为 哪 几 类 <br />

答 : 以 嵌 入 式 系 统 概 念 为 例 , 一 般 嵌 入 式 处 理 器 可 以 分 为 三 类 : 嵌 入 式 微 处 理 器 、 嵌 入 式 微 控 制<br />

器 、 嵌 入 式 DSP(Digital Signal Processor)。 嵌 入 式 微 处 理 器 就 是 和 通 用 计 算 机 的 微 处 理 器 对 应<br />

90


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

的 CPU。 在 应 用 中 , 一 般 是 将 微 处 理 器 装 配 在 专 门 设 计 的 电 路 板 上 , 在 母 板 上 只 保 留 和 嵌 入 式 相<br />

关 的 功 能 即 可 , 这 样 可 以 满 足 嵌 入 式 系 统 体 积 小 和 功 耗 低 的 要 求 。 目 前 的 嵌 入 式 处 理 器 主 要 包<br />

括 :PowerPC、Motorola 68000、ARM 系 列 等 等 。 嵌 入 式 微 控 制 器 又 称 为 单 片 机 , 它 将 CPU、 存 储<br />

器 ( 少 量 的 RAM、ROM 或 两 者 都 有 ) 和 其 它 接 口 I/O 封 装 在 同 一 片 集 成 电 路 里 。 常 见 的 有 HOLTEK<br />

MCU 系 列 、Microchip MCU 系 列 及 8051 等 。 嵌 入 式 DSP 专 门 用 来 处 理 对 离 散 时 间 信 号 进 行 极 快<br />

的 处 理 计 算 , 提 高 编 译 效 率 和 执 行 速 度 。 在 数 字 滤 波 、FFT(Fast Fourier Transform)、 频 谱 分 析 、<br />

图 像 处 理 的 分 析 等 领 域 ,DSP 正 在 大 量 进 入 嵌 入 式 市 场 。<br />

4. 问 :ARM 单 片 机 和 哪 种 内 核 的 单 片 机 比 较 接 近 <br />

答 : 严 格 说 ,ARM 不 是 单 片 机 , 是 一 个 嵌 入 式 的 实 时 操 作 系 统 。ARM(Advanced RISC Machines<br />

) 是 微 处 理 器 行 业 的 一 家 知 名 企 业 , 设 计 了 大 量 高 性 能 、 廉 价 、 耗 能 低 的 RISC 处 理 器 、 相 关 技 术<br />

及 软 件 。ARM 将 其 技 术 授 权 给 世 界 上 许 多 著 名 的 半 导 体 、 软 件 和 OEM 厂 商 , 每 个 厂 商 得 到 的 都 是<br />

一 套 独 一 无 二 的 ARM 相 关 技 术 及 服 务 。 所 以 市 场 上 像 Intel、IBM、 三 星 电 子 、NEC、 恩 智 浦 和 国 半<br />

这 样 的 大 公 司 都 有 ARM 系 列 , 现 在 不 存 在 什 么 ARM 单 片 机 和 哪 种 内 核 的 单 片 机 比 较 接 近 的 问 题<br />

。 而 且 由 于 厂 家 购 买 内 核 后 会 根 据 自 己 芯 片 应 用 方 向 的 不 同 , 自 行 添 加 不 同 的 外 挂 功 能 模 块 , 所<br />

以 , 同 样 内 核 的 芯 片 其 提 供 的 功 能 是 不 同 的 。<br />

5. 问 :ARM7TDMI-S 和 ARM7TDMI 有 何 区 别 <br />

答 :ARM7TDMI-S 是 ARM7TDMI 的 可 综 合 (synthesizable) 版 本 ( 软 核 )。 对 应 用 工 程 师 来 说 , 除 非<br />

芯 片 生 产 厂 商 对 ARM7TDMI-S 进 行 了 裁 减 , 否 则 ARM7TDMI-S 与 ARM7TDMI 没 有 太 大 的 区 别 ,<br />

其 编 程 模 型 与 ARM7TDMI 一 致 。<br />

6. 问 :LPC2104 运 行 速 度 :ARM7TDMI(-S) 能 提 供 0.9MIPS/MHz 的 指 令 执 行 速 度 ,LPC2104 cclk 为<br />

60MHZ 时 指 令 执 行 速 度 应 为 0.9*60=54MIPS, 这 样 得 到 一 条 指 令 的 执 行 速 度 大 概 为 0.018us。 可<br />

我 用 示 波 器 观 察 计 算 得 出 一 条 指 令 的 执 行 时 间 远 远 大 于 这 个 数 值 , 大 概 为 0.1us-0.8us( 可 能 由 于<br />

流 水 线 的 影 响 , 指 令 执 行 时 间 的 差 别 很 大 )。 这 是 什 么 原 因 <br />

答 : 这 是 一 个 在 存 储 器 带 宽 足 够 时 的 平 均 值 。 如 果 程 序 和 数 据 均 在 片 内 RAM 中 , 这 样 计 算 :<br />

1. 一 般 指 令 需 1 个 主 时 钟 时 间 ;<br />

2. 每 次 跳 转 增 加 3 个 主 时 钟 时 间 ( 也 许 是 2 个 , 需 要 确 认 );<br />

3. 从 RAM 中 取 一 个 操 作 数 多 增 加 一 个 主 时 钟 时 间 , 以 此 类 推 ;<br />

4. 保 存 一 个 结 果 到 RAM 中 多 增 加 一 个 主 时 钟 时 间 , 以 此 类 推 ;<br />

5. 访 问 片 内 外 设 , 增 加 一 个 外 设 时 钟 时 间 。<br />

91


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

注 意 伪 指 令 ldr rn,=x 需 要 从 RAM 中 取 一 个 操 作 数 。<br />

在 Flash 中 如 果 MAM 配 置 为 最 优 , 平 均 速 度 与 在 RAM 中 相 差 无 几 。<br />

7. 问 :LPC 系 列 与 S3C2410 的 启 动 的 差 异 在 哪 <br />

答 :S3C2410 与 LPC 系 列 的 启 动 的 差 异 在 S3C2410 中 , 加 电 启 动 后 , 从 0 地 址 开 始 执 行 程 序 ,( 这<br />

个 是 ARM 核 的 特 性 ), 那 么 可 以 将 内 部 ROM,FL ASH 中 的 内 容 映 射 到 0 地 址 , 因 此 一 般 来 说<br />

Bootloader 是 要 在 这 个 地 址 上 跑 的 。 然 而 LPC 系 列 板 子 有 一 定 区 别 , 它 们 自 己 在 板 子 加 电 启 动 后<br />

首 先 运 行 自 己 的 Bootblock, 这 个 Bootblock 是 位 于 片 内 Flash 尾 部 的 程 序 , 它 被 映 射 到 0 地 址 , 这<br />

是 一 个 厂 商 提 供 的 程 序 , 它 可 以 根 据 需 要 在 执 行 完 成 后 再 重 新 映 射 0 地 址 到 其 他 位 置 去 , 即 进 行<br />

重 映 射 , 那 么 如 果 我 们 重 映 射 0 地 址 到 Flash 开 头 , 就 可 以 像 S3C2410 那 样 跑 我 们 的 Bootloader<br />

了 。 关 键 原 因 是 LPC 采 用 了 内 存 映 射 和 重 映 射 的 机 制 , 不 同 的 映 射 可 以 将 各 自 不 同 的 中 断 向 量 ( 还<br />

有 些 文 字 池 , 共 64 字 节 ) 映 射 到 0 地 址 。 详 细 的 内 容 可 以 参 考 如 下 文 档 , 转 载 自 :http://shellstudio.<br />

spaces.live.com/Blog/cns!E9A9BE440E1B00B6!163.entry。LPC2200 系 列 ARM 的 Bootloader<br />

设 计 对 于 ARM 系 统 来 说 是 很 有 用 的 , 它 可 以 使 应 用 程 序 的 设 计 和 固 化 变 得 简 单 明 了 。 如 果 你 的<br />

应 用 程 序 被 编 译 在 RAM 空 间 运 行 , 也 需 要 Bootloader 把 它 从 诸 如 SD 卡 等 存 储 介 质 加 载 到 RAM<br />

并 启 动 它 。 所 以 , 除 了 不 提 供 有 关 BIOS 调 用 接 口 之 外 ,Bootloader 就 相 当 于 PC 的 BIOS。 设 计<br />

LPC2200 系 列 ARM 的 Bootloader 程 序 有 其 特 殊 性 , 这 是 因 为 该 系 列 ARM 有 64 字 节 的 异 常 向 量<br />

可 以 灵 活 映 射 , 不 同 于 S3C44B0X 等 ARM。 首 先 讲 解 LPC2200 系 列 ARM 的 异 常 向 量 映 射 是 什 么<br />

意 思 吧 。 一 般 情 况 下 , 没 有 MMU 的 ARM 内 核 所 使 用 的 任 何 数 据 地 址 或 指 令 地 址 都 是 实 际 的 物<br />

理 地 址 , 也 就 是 内 核 所 能 访 问 的 4GB 空 间 就 是 实 际 的 物 理 空 间 。 但 是 , 如 果 有 MMU 的 情 况 下 ,<br />

地 址 就 要 区 分 逻 辑 地 址 和 物 理 地 址 了 。 此 时 ,ARM 内 核 使 用 的 任 何 数 据 地 址 或 指 令 地 址 都 是 逻<br />

辑 地 址 , 对 它 来 说 ,4GB 的 逻 辑 空 间 就 是 它 能 访 问 的 全 部 。 但 是 实 际 上 , 内 核 所 使 用 的 逻 辑 地 址<br />

被 送 往 “ 存 储 器 控 制 器 ” 或 “ 映 射 到 内 存 的 I/O 模 块 ” 之 前 , 会 被 MMU 单 元 “ 偷 梁 换 柱 ”, 形 成 实<br />

际 的 物 理 地 址 再 继 续 送 到 “ 存 储 器 控 制 器 ” 或 “ 映 射 到 内 存 的 I/O 模 块 ”。 有 了 MMU, 实 际 很 有 限<br />

的 RAM 就 可 以 虚 拟 出 完 整 的 4GB 空 间 , 而 且 操 作 系 统 中 每 个 进 程 也 都 各 自 拥 有 4GB 空 间 , 互 不<br />

干 扰 ! 这 是 因 为 , 通 过 合 理 的 管 理 MMU, 每 个 进 程 都 有 它 自 己 的 MMU 页 表 等 必 备 资 源 , 操 作 系 统<br />

作 进 程 切 换 时 会 同 时 设 置 该 进 程 的 MMU 配 置 。 这 样 , 相 当 于 每 个 进 程 都 独 立 拥 有 自 己 的 MMU<br />

管 理 单 元 一 样 。LPC2200 系 列 ARM 没 有 强 悍 的 MMU, 但 是 它 有 简 单 的 映 射 管 理 单 元 , 这 已 经 很<br />

不 错 了 ! 我 暂 且 叫 该 单 元 为 LPC-MMU 吧 。 对 于 LPC2200 系 列 ARM 处 理 器 ,LPC-MMU 是 极 其 简<br />

化 的 MMU。1、LPC-MMU 只 能 映 射 64 字 节 ;2、LPC-MMU 所 映 射 的 起 始 物 理 地 址 固 定 为 4 组 , 即<br />

0x00000000,0x7FFFE000,0x40000000,0x80000000;3、LPC-MMU 所 映 射 的 逻 辑 地 址 只<br />

92


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

有 0x00000000~0x0000003F; 当 芯 片 复 位 后 ,ARM 内 核 的 PC 寄 存 器 被 复 位 成 0, 该 值 就 是 内<br />

核 取 指 令 所 需 的 逻 辑 地 址 。 复 位 后 ,LPC-MMU 首 先 把 逻 辑 地 址 0x00000000 映 射 到 物 理 地 址<br />

0x7FFFE000, 从 而 启 动 芯 片 内 部 固 化 的 BootBlock 代 码 。BootBlock 代 码 再 检 查 有 关 引 脚 的 高 低<br />

电 平 来 决 定 将 逻 辑 地 址 映 射 到 物 理 地 址 0x00000000 还 是 物 理 地 址 0x80000000。 从 这 里 可 以<br />

看 出 , 当 逻 辑 地 址 0x00000000 映 射 到 物 理 地 址 0x00000000, 相 当 于 没 有 LPC-MMU 单 元 ! 这<br />

就 是 说 , 如 果 你 设 计 的 Bootloader 是 从 LPC2200 系 列 ARM 的 内 部 FLASH 启 动 的 , 那 么 就 没 有 什<br />

么 特 殊 性 , 和 其 他 ARM 一 样 就 是 了 ! 如 果 你 的 Bootloader 是 从 外 部 FLASH 启 动 的 ( 也 就 是 物 理 地<br />

址 0x80000000 开 始 的 空 间 ), 那 么 就 需 要 我 这 里 所 说 的 内 容 了 。 你 只 要 把 异 常 向 量 代 码 和 常 量<br />

池 ( 共 64 字 节 ) 写 成 如 下 形 式 即 可 ! 不 过 这 样 的 话 该 Bootloader 只 能 在 0x80000000 的 地 址 启<br />

动 了 。 此 外 ,Bootloader 需 要 把 自 己 的 RO 段 、RW 段 拷 贝 到 RAM, 并 设 置 ZI 段 。 而 这 些 代 码 都 不 在<br />

其 编 译 时 设 置 的 空 间 运 行 , 所 以 都 需 要 使 用 相 对 当 前 PC 寻 址 的 指 令 来 实 现 , 有 一 定 的 技 巧 性 。 最<br />

后 ,Bootloader 还 需 要 把 自 己 的 PC 以 及 返 回 地 址 LR 都 转 移 到 正 确 的 运 行 时 地 址 去 ,Bootloader<br />

从 此 走 上 阳 关 大 道 。 ;//*********************************************<br />

**********************;// 64 字 节 的 映 射 空 间 开 始<br />

ResetEntry ;//32 字 节 异 常 向 量<br />

LDR PC, Reset_Addr ;// 复 位 异 常 入 口 ( 进 入 SVR32 模 式 )<br />

LDR PC, Undefined_Addr ;// 未 定 义 指 令 异 常 入 口 ( 进 入 UNDF32 模 式 )<br />

LDR PC, SWI_Addr ;// 软 件 中 断 异 常 入 口 ( 进 入 SVR32 模 式 )<br />

LDR PC, Prefetch_Addr ;// 预 取 中 止 异 常 入 口 ( 进 入 ABT32 模 式 )<br />

LDR PC, DataAbort_Addr ;// 数 据 中 止 异 常 入 口 ( 进 入 ABT32 模 式 )<br />

DCD 0xb9205f80 ;// 保 留 的 矢 量 , 对 于 LPC 系 列 ARM 的 内 部 FLASH 有 特 殊 作 用<br />

LDR PC, [PC, #-0xff0] ;// 中 断 异 常 入 口 ( 进 入 IRQ32 模 式 )<br />

LDR PC, FIQ_Addr ;// 快 中 断 异 常 入 口 ( 进 入 FIQ32 模 式 ) ;//32 字 节 常 量 池<br />

Reset_Addr DCD 0x80000040 ;//<br />

注 意 这 里 原 来 是 Reset_Handler Undefined_Addr DCD Undefined_Handler SWI_Addr DCD<br />

SWI_Handler Prefetch_Addr DCD Prefetch_Handler DataAbort_Addr DCD DataAbort_<br />

Handler Reserve_ Addr DCD 0 IRQ_ Addr DCD IRQ_Handler FIQ_ Addr DCD FIQ_<br />

Handler ;//64 字 节 的 映 射 空 间 结 束 ;<br />

//**************************************************************************<br />

* ;// 以 下 开 始 是 系 统 复 位 处 理 程 序 Reset_Handler ... ... ;<br />

//**************************************************************************<br />

93


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

* ;// 启 动 代 码 结 束 END<br />

8. 问 :ARM 指 令 与 Thumb 指 令 的 区 别 <br />

答 : 在 ARM 体 系 结 构 中 ,ARM 指 令 集 中 的 指 令 是 32 位 的 指 令 , 其 执 行 效 率 很 高 。 对 于 存 储 系 统 数<br />

据 总 线 为 16 位 的 应 用 系 统 ,ARM 体 系 提 供 了 Thumb 指 令 集 。Thumb 指 令 集 是 对 ARM 指 令 集 的 子<br />

集 重 新 编 码 得 到 的 , 指 令 长 度 为 16 位 。 通 常 在 处 理 器 执 行 ARM 程 序 时 , 称 处 理 器 处 于 ARM 状 态 ;<br />

当 处 理 器 执 行 Thumb 程 序 时 , 称 处 理 器 处 于 Thumb 状 态 。Thumb 指 令 集 并 没 有 改 变 ARM 体 系 底<br />

层 的 程 序 设 计 模 型 , 只 是 在 该 模 型 上 加 上 了 一 些 限 制 条 件 。Thumb 指 令 集 中 的 数 据 处 理 指 令 的 操<br />

作 数 仍 然 为 32 位 , 指 令 寻 址 地 址 也 是 32 位 的 。<br />

9. 问 :ARM 程 序 和 Thumb 程 序 混 合 使 用 的 场 合 <br />

答 : 通 常 ,Thumb 程 序 比 ARM 程 序 更 加 紧 凑 , 而 且 对 于 内 存 为 8 位 或 16 位 的 系 统 , 使 用 Thumb 程<br />

序 效 率 更 高 。 但 是 , 在 下 面 一 些 场 合 下 , 程 序 必 须 运 行 在 ARM 状 态 , 这 时 就 需 要 混 合 使 用 ARM 和<br />

Thumb 程 序 。 强 调 速 度 的 场 合 , 应 该 使 用 ARM 程 序 ; 有 些 功 能 只 能 由 ARM 程 序 完 成 。 如 : 使 用 或<br />

者 禁 止 异 常 中 断 ; 当 处 理 器 进 入 异 常 中 断 处 理 程 序 时 , 程 序 状 态 切 换 到 ARM 状 态 , 即 在 异 常 中 断<br />

处 理 程 序 入 口 的 一 些 指 令 是 ARM 指 令 , 然 后 根 据 需 要 程 序 可 以 切 换 到 Thumb 状 态 , 在 异 常 中 断<br />

程 序 返 回 前 , 程 序 再 切 换 到 ARM 状 态 。ARM 处 理 器 总 是 从 ARM 状 态 开 始 执 行 。 因 而 , 如 果 要 在 调<br />

试 器 中 运 行 Thumb 程 序 , 必 须 为 该 Thumb 程 序 添 加 一 个 ARM 程 序 头 , 然 后 再 切 换 到 Thumb 状 态 ,<br />

执 行 Thumb 程 序 。<br />

10. 问 :ARM 处 理 器 运 行 模 式 有 哪 些 <br />

答 :ARM 微 处 理 器 支 持 7 种 运 行 模 式 , 分 别 为 :<br />

(1) 用 户 模 式 (usr):ARM 处 理 器 正 常 的 程 序 执 行 状 态 ;<br />

(2) 快 速 中 断 模 式 (fiq): 用 于 高 速 数 据 传 输 或 通 道 管 理 ;<br />

(3) 外 部 中 断 模 式 (irq): 用 于 通 用 的 中 断 处 理 ;<br />

(4) 管 理 模 式 (svc): 操 作 系 统 使 用 的 保 护 模 式 ;<br />

(5) 数 据 访 问 终 止 模 式 (abt): 当 数 据 或 指 令 预 取 终 止 时 进 入 该 模 式 , 用 于 虚 拟 存 储 及 存 储 保<br />

护 ;<br />

(6) 系 统 模 式 (sys): 运 行 具 有 特 权 的 操 作 系 统 任 务 ;<br />

(7) 未 定 义 指 令 中 止 模 式 (und): 当 未 定 义 指 令 执 行 时 进 入 该 模 式 , 可 用 于 支 持 硬 件 协 处 理 器 的<br />

软 件 仿 真 。<br />

94


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

11. 问 :LPC17xx 系 列 最 大 工 作 速 率 是 多 少 做 为 内 核 为 ARM Cotrtex M3 的 MCU, 它 具 有 三 种 总 线 :<br />

系 统 总 线 ,I-code 总 线 及 D-code 总 线 , 我 是 否 可 以 将 I-code 总 线 及 D-code 总 线 配 置 的 比 系 统 总<br />

线 慢 <br />

答 :LPC17xx 系 列 最 大 工 作 速 率 为 100MHz; 这 三 种 总 线 须 保 持 相 同 工 作 速 率 , 不 能 单 独 置 。<br />

12. 问 : 当 我 用 IAP 对 片 内 FLASH 编 程 时 出 现 FLASH 损 坏 的 情 况 , 但 ISP 仍 能 正 常 工 作 , 这 是 什 么 原<br />

因 有 些 IAP 命 令 需 要 用 系 统 时 钟 频 率 做 为 参 数 , 当 我 使 用 PLL 时 , 这 个 频 率 参 数 该 如 何 设 置 在<br />

LPC17xx 系 统 中 , 哪 个 引 脚 是 用 于 进 入 ISP( 在 线 编 程 ) 模 式 <br />

答 :IAP 的 复 制 RAM 至 FLASH 命 令 时 需 要 系 统 时 钟 频 率 做 为 一 个 参 数 , 要 注 意 这 个 参 数 。 如 果<br />

这 个 参 数 不 正 确 可 能 会 造 成 FLASH 损 坏 。 如 果 应 用 中 使 用 了 PLL, 那 么 以 这 个 PLL 的 输 出 做 为 参<br />

数 , 单 位 应 为 KHz。 在 LPC17xx 系 统 中 , 引 脚 P2.10 用 于 进 入 ISP 模 式 。<br />

13. 问 : 在 LPC17xx 上 有 多 少 引 脚 可 用 做 外 部 中 断 有 多 少 种 复 位 类 型 用 软 件 复 位 芯 片 的 最 佳 方 法<br />

是 哪 种 <br />

答 :LPC17xx 在 0 端 口 ,2 端 口 及 EXTINTx 的 所 有 引 脚 都 可 用 做 外 部 中 断 。 另 外 ,ARM Cortex-M3<br />

NMI(Non - Maskable inter r upt, 不 可 屏 蔽 中 断 ) 的 输 入 口 的 可 选 功 能 也 能 用 于 中 断 连 接 。<br />

LPC17xx 有 4 种 复 位 方 式 :RESET 脚 复 位 , 看 门 狗 复 位 , 上 电 复 位 和 掉 电 检 测 (Brown out Detect-<br />

-BOD) 复 位 。 欲 以 软 件 方 式 复 位 芯 片 的 话 , 需 要 用 看 门 狗 复 位 方 式 。<br />

14. 问 :LPC17xx 可 否 能 够 经 由 以 太 网 MACC 将 其 从 掉 电 状 态 唤 醒 <br />

答 : 以 太 网 模 块 支 持 通 过 局 域 网 唤 醒 的 电 源 管 理 功 能 。 主 系 统 可 以 掉 电 , 甚 至 包 括 部 分 以 太 网 模<br />

块 。 以 太 网 模 块 持 续 监 听 局 域 网 上 的 数 据 包 , 当 接 收 到 特 定 形 式 的 数 据 包 并 经 过 以 太 网 模 块 识 别<br />

出 后 , 该 数 据 包 就 可 用 于 唤 醒 主 系 统 。 唤 醒 系 统 通 过 一 个 中 断 产 生 效 果 。 当 检 测 到 一 个 唤 醒 事 件<br />

后 , 寄 存 器 IntStatus 的 WakeupInt 位 被 设 置 , 从 而 触 发 产 生 一 个 中 断 , 这 个 中 断 可 用 于 系 统 电 源 管<br />

理 逻 辑 中 以 唤 醒 系 统 。 在 掉 电 状 态 , 产 生 局 域 网 唤 醒 的 数 据 包 用 完 即 丢 。<br />

15. 问 :GPIO 引 脚 的 触 发 速 度 是 指 的 什 么 <br />

答 : 标 准 GPIO 口 的 触 发 速 度 是 系 统 时 钟 /14, 如 果 主 频 为 72MHz, 那 么 触 发 速 度 约 为 5MHz。 快 速<br />

GPIO 口 的 触 发 速 度 是 系 统 时 钟 1/4, 如 果 主 频 为 72MHz, 那 么 触 发 速 度 约 为 18MHz。<br />

8.2 有 关 开 发 工 具 问 答<br />

16. 问 : 如 何 选 择 ARM 的 软 件 集 成 开 发 环 境 <br />

95


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

答 : 目 前 , 流 行 的 ARM 软 件 集 成 开 发 环 境 有 ADS1.2、RVDS、Keil uV3、WINARM 和 IAR 等 。 对 于<br />

51 单 片 机 应 用 开 发 工 程 师 来 说 ,Keil 开 发 环 境 应 该 应 用 得 比 较 熟 练 , 若 采 用 Keil uV3 进 行 ARM 软<br />

件 开 发 , 应 该 可 以 快 速 上 手 。 但 是 , 并 不 推 荐 ARM 初 学 者 选 择 Keil uV3 进 行 ARM 软 件 开 发 , 主 要<br />

是 基 于 以 下 2 个 原 因 :<br />

(1)Keil uV3 是 第 三 方 ARM 软 件 集 成 开 发 环 境 , 目 前 支 持 的 ARM 芯 片 种 类 还 不 多 , 所 带 的 编 译 器<br />

也 并 不 完 善 ;<br />

(2) 由 于 Keil uV3 为 了 方 便 用 户 的 开 发 , 提 供 了 现 成 的 ARM 启 动 文 件 , 换 句 话 说 , 它 屏 蔽 了 ARM 开<br />

发 中 的 一 个 重 要 内 容 —— 启 动 代 码 的 编 写 , 而 这 一 点 对 初 学 者 来 说 应 该 是 非 常 重 要 的 内 容 。IAR<br />

目 前 国 内 应 用 的 人 还 不 多 , 相 关 资 料 也 不 是 很 多 , 也 不 推 荐 初 学 者 使 用 。ADS1.2 集 成 开 发 环 境 是<br />

ARM 公 司 推 出 的 ARM 核 微 控 制 器 集 成 开 发 工 具 。 它 支 持 ARM10 之 前 的 所 有 ARM 系 列 微 控 制 器 ,<br />

支 持 软 件 调 试 及 JTAG 硬 件 仿 真 调 试 , 支 持 汇 编 、C、C++ 源 程 序 ; 具 有 编 译 效 率 高 、 系 统 库 功 能 强<br />

等 特 点 ; 可 以 在 Windows 98、Windows 2000、Windows XP 以 及 RedHat Linux 上 运 行 。RealView<br />

开 发 套 件 (RVDS) 是 ARM 公 司 继 SDT 与 ADS1.2 之 后 主 推 的 新 一 代 开 发 工 具 ,RVDS 4.0 标 准<br />

版 适 用 于 所 有 的 ARM7、ARM9、ARM10、ARM11、MP-Core、SCx00、Cortex-M3、Cortex-M1、<br />

Cortex-R4F 和 Cortex-A8 处 理 器 ,08 年 10 月 新 推 出 的 RVDS 4.0 专 业 版 除 了 延 伸 支 持 到 Cortex-A9<br />

以 外 , 还 具 有 独 特 的 运 行 时 优 化 功 能 、ARM 向 量 化 NEON 编 译 器 、ARM Profiler 和 ARM 超 快<br />

速 模 块 (ARM926EJ-S、ARM1136J(F)-S、ARM1176JZ(F)-S、Cortex-R4、Cortex-A8 和 单 核<br />

Cortex-A9)。WINARM(GCCARM) 是 一 个 免 费 的 开 发 工 具 。WinARM 可 以 在 http://www.siwawi.<br />

arubi.uni-kl.de/avr_projects/arm_projects/ 下 载 得 到 , 里 面 除 了 包 含 C/C++ 编 译 器 ——GCC,<br />

汇 编 、 连 接 器 ——Binutils, 调 试 器 —— GDB 等 工 具 , 也 包 括 了 通 过 GDB 使 用 Wiggler JTAG 的<br />

软 件 ——OCDRemote。 所 以 , 所 需 要 的 工 具 都 包 括 在 了 这 个 WinARM 发 行 版 中 , 就 可 以 比 较 省<br />

心 了 , 基 于 以 上 原 因 , 推 荐 ARM 初 学 者 使 用 ADS1.2 或 RVDS 集 成 开 发 环 境 进 行 ARM 开 发 。 关 于<br />

ADS1.2 与 RVDS 集 成 开 发 环 境 的 使 用 , 初 学 者 可 以 参 看 相 应 集 成 开 发 环 境 自 带 的 用 户 手 册 。<br />

17. 问 :C 语 言 和 汇 编 语 言 在 开 发 单 片 机 时 各 有 哪 些 优 缺 点 <br />

答 : 汇 编 语 言 是 一 种 用 文 字 助 记 符 来 表 示 机 器 指 令 的 符 号 语 言 , 是 最 接 近 机 器 码 的 一 种 语 言 。 其<br />

主 要 优 点 是 占 用 资 源 少 、 程 序 执 行 效 率 高 。 但 是 不 同 的 CPU, 其 汇 编 语 言 可 能 有 所 差 异 , 所 以 不 易<br />

移 植 。C 语 言 是 一 种 结 构 化 的 高 级 语 言 。 其 优 点 是 可 读 性 好 , 移 植 容 易 , 是 普 遍 使 用 的 一 种 计 算 机<br />

语 言 。 缺 点 是 占 用 资 源 较 多 , 执 行 效 率 没 有 汇 编 高 。 对 于 目 前 普 遍 使 用 的 RISC 架 构 的 8 位 MCU 来<br />

说 , 其 内 部 ROM、RAM、STACK 等 资 源 都 有 限 , 如 果 使 用 C 语 言 编 写 , 一 条 C 语 言 指 令 编 译 后 , 会<br />

变 成 很 多 条 机 器 码 , 很 容 易 出 现 ROM 空 间 不 够 、 堆 栈 溢 出 等 问 题 。 而 且 一 些 单 片 机 厂 家 也 不 一 定<br />

96


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

能 提 供 C 编 译 器 。 而 汇 编 语 言 , 一 条 指 令 就 对 应 一 个 机 器 码 , 每 一 步 执 行 什 幺 动 作 都 很 清 楚 , 并 且<br />

程 序 大 小 和 堆 栈 调 用 情 况 都 容 易 控 制 , 调 试 起 来 也 比 较 方 便 。<br />

18. 问 : 单 片 机 开 发 , 一 定 要 会 C 吗 <br />

答 : 汇 编 语 言 是 一 种 用 文 字 助 记 符 来 表 示 机 器 指 令 的 符 号 语 言 , 是 最 接 近 机 器 码 的 一 种 语 言 。 其<br />

主 要 优 点 是 占 用 资 源 少 、 程 序 执 行 效 率 高 。 但 是 不 同 的 CPU, 其 汇 编 语 言 可 能 有 所 差 异 , 所 以 不 易<br />

移 植 。 对 于 目 前 普 遍 使 用 的 RISC 架 构 的 8 位 MCU 来 说 , 其 内 部 ROM、RAM、STACK 等 资 源 都 有<br />

限 , 如 果 使 用 C 语 言 编 写 , 一 条 C 语 言 指 令 编 译 后 , 会 变 成 很 多 条 机 器 码 , 很 容 易 出 现 ROM 空 间 不<br />

够 、 堆 栈 溢 出 等 问 题 。 而 且 一 些 单 片 机 厂 家 也 不 一 定 能 提 供 C 编 译 器 。 而 汇 编 语 言 , 一 条 指 令 就 对<br />

应 一 个 机 器 码 , 每 一 步 执 行 什 么 动 作 都 很 清 楚 , 并 且 程 序 大 小 和 堆 栈 调 用 情 况 都 容 易 控 制 , 调 试<br />

起 来 也 比 较 方 便 。 所 以 在 资 源 较 少 单 片 机 开 发 中 , 我 们 还 是 建 议 采 用 汇 编 语 言 比 较 好 。 而 C 语 言<br />

是 一 种 编 译 型 程 序 设 计 语 言 , 它 兼 顾 了 多 种 高 级 语 言 的 特 点 , 并 具 备 汇 编 语 言 的 功 能 。C 语 言 有 功<br />

能 丰 富 的 库 函 数 、 运 算 速 度 快 、 编 译 效 率 高 、 有 良 好 的 可 移 植 性 , 而 且 可 以 直 接 实 现 对 系 统 硬 件 的<br />

控 制 。C 语 言 是 一 种 结 构 化 程 序 设 计 语 言 , 它 支 持 当 前 程 序 设 计 中 广 泛 采 用 的 由 顶 向 下 结 构 化 程<br />

序 设 计 技 术 。 此 外 ,C 语 言 程 序 具 有 完 善 的 模 块 程 序 结 构 , 从 而 为 软 件 开 发 中 采 用 模 块 化 程 序 设<br />

计 方 法 提 供 了 有 力 的 保 障 。 因 此 , 使 用 C 语 言 进 行 程 序 设 计 已 成 为 软 件 开 发 的 一 个 主 流 。 用 C 语 言<br />

来 编 写 目 标 系 统 软 件 , 会 大 大 缩 短 开 发 周 期 , 且 明 显 地 增 加 软 件 的 可 读 性 , 便 于 改 进 和 扩 充 , 从 而<br />

研 制 出 规 模 更 大 、 性 能 更 完 备 的 系 统 。 综 上 所 述 , 用 C 语 言 进 行 单 片 机 程 序 设 计 是 单 片 机 开 发 与 应<br />

用 的 必 然 趋 势 。 所 以 作 为 一 个 技 术 全 面 并 涉 足 较 大 规 模 的 软 件 系 统 开 发 的 单 片 机 开 发 人 员 最 好 能<br />

够 掌 握 基 本 的 C 语 言 编 程 。<br />

19. 问 : 当 开 发 一 个 较 复 杂 而 又 开 发 时 间 短 的 项 目 时 , 用 C 还 是 用 汇 编 开 发 好 <br />

答 : 对 于 复 杂 而 开 发 时 间 紧 的 项 目 时 , 可 以 采 用 C 语 言 , 但 前 提 是 要 求 对 该 MCU 系 统 的 C 语 言 和 C<br />

编 译 器 非 常 熟 悉 , 特 别 要 注 意 该 C 编 译 系 统 所 能 支 持 的 数 据 类 型 和 算 法 。 虽 然 C 语 言 是 最 普 遍 的<br />

一 种 高 级 语 言 , 但 不 同 的 MCU 厂 家 其 C 语 言 编 译 系 统 是 有 所 差 别 的 , 特 别 是 在 一 些 特 殊 功 能 模 块<br />

的 操 作 上 。 如 果 对 这 些 特 性 不 了 解 , 那 调 试 起 来 就 有 得 烦 了 , 到 头 来 可 能 还 不 如 用 汇 编 来 的 快 。<br />

20. 问 :RealView MDK 调 试 有 哪 些 技 巧 <br />

答 : 下 面 从 Symbol 窗 口 、 逻 辑 分 析 仪 和 Watch 窗 口 三 个 方 面 来 介 绍 一 下 调 试 中 的 小 技 巧 。<br />

1、Symbol 窗 口<br />

Symbol 窗 口 可 以 查 看 虚 拟 寄 存 器 和 外 围 特 殊 寄 存 器 的 名 称 、 地 址 、 类 型 。 当 我 们 想 要 在 内 存 窗 口<br />

中 查 看 外 围 寄 存 器 的 值 时 。 是 不 是 需 要 去 手 册 上 查 一 下 这 个 寄 存 器 的 地 址 呢 。 答 案 是 ―― 可 以 ,<br />

97


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

但 有 个 更 方 便 直 接 的 方 法 , 就 是 从 Symbol 窗 口 可 以 查 到 所 有 外 围 特 殊 寄 存 器 的 地 址 和 类 型 。 在 调<br />

试 时 打 开 Symbol 窗 口 的 方 法 : 单 击 MDK 菜 单 View 然 后 点 击 [img], 在 工 程 工 作 区 左 边 即 可 看 到 该<br />

窗 口 。<br />

2、 逻 辑 分 析 仪<br />

逻 辑 分 析 仪 可 跟 踪 全 局 变 量 、 虚 拟 寄 存 器 和 外 围 特 殊 寄 存 器 的 值 。1、 我 们 可 能 需 要 I/O 端 口 的 数<br />

据 寄 存 器 某 位 的 值 在 逻 辑 分 析 仪 上 显 示 出 来 。 一 种 方 法 是 在 逻 辑 分 析 仪 的 Setup 对 话 框 里 通 过<br />

Mask 来 屏 蔽 那 些 不 需 要 显 示 的 位 。 还 有 一 种 更 简 单 的 方 法 , 就 是 在 寄 存 器 名 后 面 加 上 后 缀 “. 位<br />

序 ”。 比 如 A 口 有 16 个 引 脚 。 其 对 应 的 数 据 寄 存 器 为 PORTA(16 位 )。 现 在 需 要 跟 踪 引 脚 7 的 值 。<br />

则 只 需 添 加 信 号 PORTA.7 即 可 , 系 统 会 自 动 设 置 Mask 值 。 实 际 上 , 任 何 跟 踪 的 信 号 , 只 要 是 整 型<br />

数 据 都 能 使 用 上 面 提 供 的 方 法 。 这 对 于 位 显 示 非 常 直 观 , 简 捷 。2、 当 我 们 需 要 在 逻 辑 分 析 仪 中 显<br />

示 Symbol 窗 口 中 列 出 的 虚 拟 寄 存 器 和 外 围 特 殊 寄 存 器 的 值 时 , 没 必 要 在 Setup 对 话 框 中 写 出 该 信<br />

号 的 名 称 。 只 需 将 Symbol 窗 口 的 寄 存 器 名 直 接 拖 到 逻 辑 分 析 仪 中 即 可 。<br />

3、Watch 窗 口<br />

Watch 窗 口 可 以 查 看 程 序 中 全 局 变 量 的 值 并 实 时 更 新 。 也 可 查 看 外 围 特 殊 寄 存 器 和 虚 拟 寄 存 器 的<br />

值 。 我 们 可 以 在 Watch 窗 口 中 按 F2 然 后 将 变 量 名 敲 进 去 , 回 车 就 可 看 到 该 变 量 的 值 , 但 更 方 便 的<br />

方 法 是 可 以 直 接 将 选 中 的 该 变 量 或 寄 存 器 名 直 接 拖 到 Watch 窗 口 中 。<br />

21. 问 : 在 ADS 中 是 否 可 以 进 行 软 件 调 试 基 于 UCOS-II 的 程 序 <br />

答 :ADS 软 件 调 试 只 能 调 试 ARM 的 内 核 , 不 能 调 试 外 设 。 但 是 取 消 PLL 锁 定 检 测 后 , 可 以 调 试 任<br />

务 切 换 , 最 终 到 空 闲 任 务 上 。 开 始 移 植 时 软 件 仿 真 是 最 好 的 工 具 。<br />

22. 问 :ARMulate 软 件 是 干 什 么 的 ,2104 不 是 用 EasyJTAG.dll 来 仿 真 吗 <br />

答 :ARMulate 是 ARM 公 司 提 供 的 软 件 仿 真 调 试 代 理 , 软 件 仿 真 只 能 仿 真 ARM 核 。<br />

23. 问 : 如 何 生 成 32 位 hex 文 件 我 在 Release Setting->ARM fromELF->Output Format 中 设 置 为<br />

Intel 32bit HEX, 可 是 好 像 没 有 生 成 hex 件 。<br />

答 : 试 试 这 种 方 法 :Target-->Target Setting-->Post Link 中 选 择 "ARM fromELF" 加 上 你 上 面 设 的<br />

应 该 不 成 问 题 。<br />

24. 问 : 如 何 在 ADS 里 面 看 任 务 执 行 的 一 些 情 况 比 如 堆 栈 。<br />

答 : 多 任 务 环 境 下 的 堆 栈 , 内 存 等 信 息 需 要 调 试 软 件 的 支 持 才 可 以 实 现 。ucos 下 有 一 个 统 计 功 能<br />

的 模 块 可 以 间 接 实 现 部 分 功 能 。<br />

98


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

25. 问 : 向 Flash 烧 数 据 时 出 现 :exceeds flash limitation 请 予 赐 教 !<br />

答 : 要 写 入 的 Flash 地 址 超 过 了 范 围 。 如 果 不 是 代 码 太 大 的 问 题 , 可 以 检 查 scf 文 件 是 否 正 确 。<br />

26. 问 :WIN CE 下 在 模 拟 器 上 面 开 发 程 序 , 和 真 实 环 境 有 区 别 么 需 要 注 意 一 些 什 么 <br />

答 : 模 拟 器 的 仿 真 度 十 分 高 ,Windows Mobile 5 的 模 拟 器 甚 至 可 以 支 持 ARM 指 令 , 所 以 基 本 不 会<br />

遇 到 兼 容 性 的 问 题 。 但 是 对 于 一 些 需 要 连 接 外 部 设 备 的 应 用 场 景 , 比 如 前 边 说 的 无 线 网 络 , 还<br />

有 GPS 设 备 等 , 就 需 要 用 到 实 际 设 备 了 。<br />

8.3 有 关 MCU 硬 件 设 计 问 答<br />

27. 问 : 如 果 我 不 使 用 LPC 片 内 的 AD,VSSA、VSSA(pll)、VDDA(1.8v)、VDDA(3.3v) 这 几 个 可 以 悬 空<br />

吗 <br />

答 : 最 好 不 要 悬 空 , 给 一 个 确 定 的 电 平 能 提 高 系 统 的 稳 定 性 。<br />

28. 问 :MCU 在 射 频 控 制 时 ,MCU 的 时 钟 ( 晶 振 )、 数 据 线 会 辐 射 基 频 或 基 频 的 倍 频 , 被 低 噪 放 LNA 放<br />

大 后 进 入 混 频 , 出 现 带 内 的 Spur, 无 法 滤 除 。 除 了 用 layout、 选 择 低 辐 射 MCU 的 方 法 可 以 减 少 一<br />

些 以 外 , 还 有 什 么 别 的 方 法 <br />

答 : 在 设 计 高 频 电 路 用 电 路 板 有 许 多 注 意 事 项 , 尤 其 是 GHz 等 级 的 高 频 电 路 , 要 注 意 各 电 子 组 件<br />

pad 与 印 刷 pattern 的 长 度 对 电 路 特 性 所 造 成 的 影 响 。 最 近 几 年 高 频 电 路 与 数 字 电 路 共 享 相 同 电<br />

路 板 , 构 成 所 谓 的 混 载 电 路 系 统 似 乎 有 增 加 的 趋 势 , 类 似 如 此 的 设 计 经 常 会 造 成 数 字 电 路 动 作<br />

时 , 高 频 电 路 却 发 生 动 作 不 稳 定 等 现 象 , 其 中 原 因 之 一 是 数 字 电 路 产 生 的 噪 声 , 影 响 高 频 电 路 正 常<br />

动 作 所 致 。 为 了 避 免 上 述 问 题 除 了 设 法 分 割 两 电 路 block 之 外 , 设 计 电 路 板 之 前 充 分 检 讨 设 计 构<br />

想 , 才 是 根 本 应 有 的 手 法 , 基 本 上 设 计 高 频 电 路 用 电 路 板 必 需 掌 握 下 列 三 大 原 则 :<br />

(1)、 高 质 量 ;<br />

(2)、 不 可 取 巧 ;<br />

(3)、 不 可 仓 促 抢 时 间 。<br />

以 下 是 设 计 高 频 电 路 板 的 一 些 建 议 :<br />

(1) 印 刷 pattern 的 长 度 会 影 响 电 路 特 性 。 尤 其 是 传 输 速 度 为 GHz 高 速 数 位 电 路 的 传 输 线 路 , 通 常<br />

会 使 用 strip line, 同 时 藉 由 调 整 配 线 长 度 补 正 传 输 延 迟 时 间 , 其 实 这 也 意 味 着 电 子 组 件 的 设 置 位<br />

置 对 电 路 特 性 具 有 绝 对 性 的 影 响 。<br />

(2)Ground 作 大 better。 铜 箔 面 整 体 设 置 ground 层 , 而 连 接 via 的 better ground 则 是 高 频 电 路 板 与<br />

高 速 数 位 电 路 板 共 同 的 特 征 , 此 外 高 频 电 路 板 最 忌 讳 使 用 幅 宽 细 窄 的 印 刷 pattern 描 绘 ground。<br />

99


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

(3) 电 子 组 件 的 ground 端 子 以 最 短 的 长 度 与 电 路 板 的 ground 相 连 接 。 具 体 方 法 是 在 电 子 组 件 的<br />

ground 端 子 pad 附 近 设 置 via, 使 电 子 组 件 能 以 最 短 的 长 度 与 电 路 板 的 ground 连 接 。<br />

(4) 信 号 线 作 短 配 线 设 计 。 不 可 任 意 加 大 配 线 长 度 , 尽 量 缩 短 配 线 长 度 。<br />

(5) 减 少 电 路 之 间 的 结 合 。 尤 其 是 filter 与 amplifier 输 出 入 之 间 作 电 路 分 割 非 常 重 要 , 它 相 当 于 audio<br />

电 路 的 cross talk 对 策 。<br />

(6)MCU 回 路 Layout 考 量 : 震 荡 电 路 尽 可 能 接 近 IC 震 荡 脚 位 ; 震 荡 电 路 与 VDD&VSS 保 持 足 够 的 距<br />

离 ; 震 荡 频 率 大 于 1MHz 时 不 需 加 osc1&osc2 电 容 ; 电 源 与 地 间 要 最 短 位 置 并 尽 量 拉 等 宽 与 等 距 的<br />

线 , 于 节 点 位 置 加 上 104/103/102 等 陶 瓷 电 容 。<br />

29. 问 : 在 高 速 设 计 中 , 如 何 解 决 信 号 的 完 整 性 问 题 <br />

答 : 信 号 完 整 性 基 本 上 是 阻 抗 匹 配 的 问 题 。 而 影 响 阻 抗 匹 配 的 因 素 有 信 号 源 的 架 构 和 输 出 阻 抗<br />

(output impedance), 走 线 的 特 性 阻 抗 , 负 载 端 的 特 性 , 走 线 的 拓 朴 (topology) 架 构 等 。 解 决 的 方<br />

式 是 靠 端 接 (termination) 与 调 整 走 线 的 拓 朴 。<br />

30. 问 : 在 Demo 板 上 采 样 电 压 时 , 不 稳 定 , 采 样 结 果 有 波 动 , 如 何 消 除 <br />

答 : 一 般 来 说 , 仿 真 器 都 是 工 作 在 一 个 稳 压 的 环 境 ( 通 常 为 5V)。 如 果 用 仿 真 器 的 A/D 时 , 要 注 意 其<br />

A/D 参 考 电 压 是 由 仿 真 器 内 部 给 出 , 还 是 需 要 外 部 提 供 。A/D 转 换 需 要 一 个 连 续 的 时 钟 周 期 , 所 以<br />

在 仿 真 时 不 能 用 单 步 调 试 的 方 法 , 否 则 会 造 成 A/D 采 样 值 不 准 。 至 于 A/D 采 样 不 稳 定 , 可 以 在 A/D<br />

输 入 口 加 一 电 容 , 起 到 滤 波 作 用 , 在 软 件 处 理 时 采 用 中 值 滤 波 的 方 法 。<br />

31. 问 : 如 何 提 高 单 片 机 系 统 的 抗 干 扰 性 能 <br />

答 : 搞 过 产 品 的 朋 友 都 有 体 会 , 一 个 设 计 看 似 简 单 , 硬 件 设 计 和 代 码 编 写 很 快 就 搞 定 , 但 在 调 试 过<br />

程 中 却 或 多 或 少 的 意 外 , 这 些 都 是 抗 干 扰 能 力 不 够 的 体 现 。 下 面 讨 论 一 下 如 何 让 你 的 设 计 避 免 走<br />

弯 路 : 抗 干 扰 体 现 在 2 个 方 面 , 一 是 硬 件 设 计 上 , 二 是 软 件 编 写 上 。 这 里 重 点 提 醒 : 在 MCU 设 计 中<br />

主 要 抗 干 扰 设 计 是 在 硬 件 上 , 软 件 为 辅 。 因 为 MCU 的 计 算 能 力 有 限 , 所 以 要 在 硬 件 上 花 大 工 夫 。<br />

看 看 干 扰 的 途 径 :<br />

1: 干 扰 信 号 干 扰 MCU 的 主 要 路 径 是 通 过 I/O 口 , 一 是 影 响 了 MCU 的 数 据 采 集 , 二 是 影 响 内 部 其 它<br />

寄 存 器 。 解 决 方 法 : 后 面 讨 论 。<br />

2: 电 源 干 扰 :MCU 虽 然 适 应 电 压 较 宽 (3-5。5V), 但 对 于 电 源 的 波 动 却 很 敏 感 , 比 如 说 MCU 可 以<br />

在 3V 电 压 下 稳 定 工 作 , 但 却 不 能 在 电 压 在 3V-5。5V 波 动 的 情 况 下 稳 定 工 作 。 解 决 方 法 : 用 电 源 稳<br />

压 块 , 做 好 电 源 的 滤 波 等 工 作 , 提 示 : 一 定 要 在 电 源 旁 路 并 上 0。1UF 的 瓷 片 电 容 来 滤 除 高 频 干 扰 ,<br />

因 为 电 解 电 容 对 超 过 几 十 KHZ 的 高 频 干 扰 不 起 作 用 。<br />

100


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

3: 上 下 电 干 扰 : 但 每 个 MCU 系 统 在 上 电 时 都 要 经 过 这 样 一 个 过 程 , 所 以 要 尤 其 注 意 MCU 虽 然 可<br />

以 在 3V 电 压 下 稳 定 工 作 , 但 并 不 是 说 它 不 能 在 3V 以 下 的 电 压 下 工 作 , 当 然 在 如 此 低 的 电 压 下 MCU<br />

是 超 不 稳 定 状 态 的 。 在 系 统 加 电 时 候 , 系 统 电 源 电 压 是 从 0V 上 升 到 额 定 电 压 的 , 比 如 当 电 压 到 2V<br />

时 候 ,MCU 开 始 工 作 了 , 但 这 时 是 超 不 稳 定 的 工 作 , 极 容 易 跑 飞 。 解 决 方 法 : 让 MCU 在 电 源 稳 定 后<br />

才 开 始 工 作 。PIC 在 片 内 集 成 了 POR( 内 部 上 电 延 时 复 位 ), 这 功 能 一 定 要 在 配 置 位 中 打 开 。 外 部<br />

上 电 延 时 复 位 电 路 。 有 多 种 形 式 , 低 成 本 的 就 是 在 复 位 脚 接 个 阻 容 电 路 。 高 成 本 的 是 用 专 用 芯 片 。<br />

这 方 面 的 资 料 特 多 , 到 处 都 可 以 查 找 。 最 难 排 除 的 就 是 上 面 第 一 种 干 扰 , 并 且 干 扰 信 号 随 时 可 以<br />

发 生 , 干 扰 信 号 的 强 度 也 不 尽 相 同 。 但 它 们 也 有 相 同 点 : 干 扰 信 号 也 遵 循 欧 姆 定 律 , 干 扰 信 号 偶 合<br />

路 径 无 非 是 电 磁 干 扰 , 一 是 电 火 花 , 二 是 磁 场 。 其 中 干 扰 最 厉 害 的 是 电 火 花 干 扰 , 其 次 是 磁 场 干<br />

扰 。 电 火 花 干 扰 表 现 场 合 主 要 是 附 近 有 大 功 率 开 关 、 继 电 器 、 接 触 器 、 有 刷 电 机 等 。 磁 场 干 扰 表 现<br />

场 合 主 要 是 附 近 有 大 功 率 的 交 流 电 机 、 变 压 器 等 。 解 决 方 法 : 第 一 点 : 也 是 最 经 典 的 , 就 是 在 PCB<br />

步 线 和 元 件 位 置 安 排 上 下 工 夫 , 这 中 间 学 问 很 多 , 说 几 天 都 说 不 完 。 二 : 综 合 考 虑 各 I/O 口 的 输 入<br />

阻 抗 , 采 集 速 率 等 因 素 设 计 I/O 口 的 外 围 电 路 。 一 般 决 定 一 个 I/O 口 的 输 入 阻 抗 有 3 种 情 况 :A:I/O<br />

口 有 上 拉 电 阻 , 上 拉 电 阻 值 就 是 I/O 口 的 输 入 阻 抗 。 一 般 大 家 都 用 4K-20K 电 阻 做 上 拉 ,(PIC 的 B 口<br />

内 部 上 拉 电 阻 约 20K)。 由 于 干 扰 信 号 也 遵 循 欧 姆 定 律 , 所 以 在 越 存 在 干 扰 的 场 合 , 选 择 上 拉 电 阻<br />

就 要 越 小 , 因 为 干 扰 信 号 在 电 阻 上 产 生 的 电 压 就 越 小 。 由 于 上 拉 电 阻 越 小 就 越 耗 电 , 所 以 在 家 用 设<br />

计 上 , 上 拉 电 阻 一 般 都 是 10-20K, 而 在 强 干 扰 场 合 上 拉 电 阻 甚 至 可 以 低 到 1K。( 如 果 在 强 干 扰 场<br />

合 要 抛 弃 B 口 上 拉 功 能 , 一 定 要 用 外 部 上 拉 。)B:I/O 口 与 其 它 数 字 电 路 输 出 脚 相 连 , 此 时 I/O 口 输<br />

入 阻 抗 就 是 数 字 电 路 输 出 口 的 阻 抗 , 一 般 是 几 十 到 几 百 欧 。 可 以 看 出 用 数 字 电 路 做 中 介 可 以 把 阻<br />

抗 减 低 到 最 理 想 , 在 许 多 工 业 控 制 板 上 可 以 看 见 大 量 的 数 字 电 路 就 是 为 了 保 证 性 能 和 保 护 MCU<br />

的 。C:I/O 口 并 联 了 小 电 容 。 由 于 电 容 是 通 交 流 阻 直 流 的 , 并 且 干 扰 信 号 是 瞬 间 产 生 , 瞬 间 熄 灭<br />

的 , 所 以 电 容 可 以 把 干 扰 信 号 滤 除 。 但 不 好 的 是 造 成 I/O 口 收 集 信 号 的 速 率 下 降 , 比 如 在 串 口 上 并<br />

电 容 是 绝 不 可 取 的 , 因 为 电 容 会 把 数 字 信 号 当 干 扰 信 号 滤 掉 。 对 于 一 些 检 测 开 关 、 干 簧 管 、 霍 尔 元<br />

件 之 类 的 是 可 以 并 电 容 的 , 因 为 这 些 开 关 量 的 变 化 是 不 可 能 有 很 高 的 速 率 的 , 并 一 个 小 电 容 对 信<br />

号 的 采 集 是 没 任 何 影 响 的 。<br />

32. 问 :00254:Unimplemented RDI message 是 什 么 错 误 提 示 我 的 设 置 连 接 都 正 常 , 是 不 是 芯 片 烧<br />

了 <br />

答 : 是 JTAG 的 问 题 。 可 以 先 使 用 ISP 操 作 试 试 就 知 道 了 , 如 果 能 ISP, 说 明 LPC2104 没 有 损 坏 , 还<br />

能 正 常 运 行 程 序 。<br />

101


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

33. 问 : 我 现 在 数 字 电 路 除 LPC2114 使 用 3.3V 电 压 外 , 其 余 的 大 部 分 是 5V 的 。 我 想 先 将 LPC2114 连 接<br />

到 CPLD, 再 连 接 到 其 它 电 路 (CPLD 的 I/O 口 可 以 输 出 或 输 入 5V) 不 知 道 行 不 行 。<br />

答 : 我 觉 的 简 单 的 电 路 可 以 用 LVC 芯 片 , 必 要 时 可 以 用 3V 的 CPLD。<br />

34. 问 :LPC2104 具 有 6 个 PWM, 可 以 应 用 于 电 机 控 制 , 可 是 却 没 有 计 数 器 进 行 电 机 转 速 的 PID 闭 环 控<br />

制 , 这 个 情 况 是 不 是 lPC2106 的 一 个 缺 陷 , 如 果 不 是 , 那 应 该 怎 么 样 才 能 进 行 外 部 脉 冲 的 计 数 在<br />

不 用 外 加 计 数 器 的 情 况 下 !!<br />

答 : 捕 获 算 周 期 。<br />

35. 问 :LPC2104 和 LPC2114 外 部 晶 振 接 法 。 原 来 我 用 LPC2104 做 的 板 子 , 外 部 晶 振 接 到 X1 时 不 可<br />

用 。 后 来 接 到 X2 上 时 好 象 可 以 用 , 但 这 与 资 料 上 的 说 法 好 象 有 点 出 入 。 现 在 我 想 换 LPC2114 改<br />

版 , 但 不 想 再 次 改 版 了 。 故 在 此 请 教 外 部 晶 振 接 法 <br />

答 : 使 用 外 部 无 源 晶 振 , 晶 振 两 个 管 脚 无 需 连 接 , 与 51 单 片 机 基 本 一 致 ; 时 钟 信 号 由 X1 输 入 。<br />

36. 问 : 请 问 用 LPC2104 扩 展 D12 有 没 有 问 题 <br />

答 : 可 以 使 用 模 拟 总 线 , 速 度 比 51 快 几 倍 。<br />

37. 问 : 把 LPC2104 的 44 脚 (EINT1) 接 地 , 再 利 用 LPC210XISP 软 件 通 过 串 口 0 往 芯 片 里 写 程 序 , 为 何<br />

按 了 复 位 键 以 后 连 芯 片 的 ID 都 不 能 读 到 <br />

答 : 应 该 检 查 如 下 几 点 :<br />

1. 确 保 你 的 芯 片 在 工 作 。 一 般 可 以 查 看 芯 片 的 几 个 电 源 是 否 都 正 确 , 查 看 晶 体 是 否 有 波 形 , 最 好<br />

还 可 以 看 看 各 电 源 的 纹 波 是 否 严 重 。<br />

2. 确 保 电 平 转 换 芯 片 的 正 确 工 作 , 以 及 各 输 入 输 出 的 正 确 。 这 个 方 向 最 容 易 弄 反 。<br />

3. 查 看 复 位 端 的 电 平 是 否 正 确 , 复 位 按 健 正 常 。<br />

4. 确 保 44 脚 接 地 。<br />

38. 问 :LPC2104 系 统 为 什 么 采 用 11.0592Mhz 的 晶 振 , 是 在 定 时 上 有 优 势 还 是 其 他 原 因 <br />

答 : 选 用 11.0592MHz 只 是 为 了 得 到 精 确 的 通 信 波 特 率 , 串 口 通 信 的 可 靠 性 高 。<br />

39. 问 :LPC2119 最 高 频 率 可 达 60MHZ, 在 频 率 比 较 高 的 时 候 应 该 使 用 几 层 的 电 路 板 , 有 没 有 确 切 规<br />

定 <br />

答 : 不 知 道 什 么 时 候 有 人 就 把 PCB 的 层 数 与 频 率 划 上 了 一 个 必 然 的 关 系 。60MHz 很 高 吗 调 频 收<br />

音 机 FM 波 段 范 围 是 88-108MHz, 内 部 部 本 振 频 率 可 达 118.7MHz,1 层 板 。 电 视 机 里 头 的 电 路 板 ,<br />

102


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

高 频 盒 内 一 般 最 多 就 2 层 板 ( 还 是 一 层 的 居 多 ) 它 跑 多 高 的 频 率 自 己 查 查 UHF 的 范 围 吧 , 记 得 保 持<br />

冷 静 因 为 没 有 什 么 值 得 去 惊 讶 的 ! 再 有 几 年 前 拆 过 一 个 GIGA 的 游 戏 机 , 音 频 部 分 的 PCB 是 4 层 板<br />

( 独 立 的 小 板 ), 其 中 的 元 器 件 密 密 麻 麻 的 , 看 看 这 个 它 又 能 是 跑 多 高 的 频 率 况 且 现 在 数 字 电 路 的<br />

电 平 容 差 相 对 于 模 拟 电 路 的 至 少 有 一 个 数 量 级 的 差 别 。 在 高 频 模 拟 电 路 下 , 多 一 块 覆 铜 可 能 就 使<br />

电 路 的 性 能 下 降 或 工 作 点 异 常 , 例 如 它 可 能 使 电 感 特 性 器 件 的 Q 值 下 降 , 产 生 涡 流 耗 损 等 。 很 多<br />

时 候 增 加 PCB 的 层 数 决 不 是 单 纯 因 为 系 统 速 度 , 你 所 说 的 60Mhz 也 只 是 芯 片 内 部 的 系 统 时 钟 , 难<br />

道 你 的 IO 也 要 作 为 时 钟 源 使 用 吗 在 ARM 中 采 用 PLL 技 术 使 得 外 部 时 钟 可 以 下 降 到 一 个 较 低 的<br />

水 平 , 则 可 以 抑 制 部 分 由 时 钟 电 路 产 生 的 射 频 干 扰 , 有 较 好 的 EMC,EMI 特 性 , 一 个 合 理 的 PCB<br />

layout 可 能 比 盲 目 增 加 PCB 层 数 的 方 法 提 高 系 统 的 稳 定 性 来 得 更 合 理 和 有 效 ! 看 你 是 想 做 精 品 还<br />

是 想 做 产 品 或 其 他 , 这 就 要 综 合 多 方 因 素 考 虑 了 。 无 可 否 认 , 增 加 PCB 的 层 数 后 比 较 容 易 的 处 理<br />

一 些 由 于 电 源 寄 生 干 扰 产 生 的 问 题 , 适 当 配 合 layout 可 以 满 足 一 些 速 度 ( 时 序 ) 要 求 苛 刻 的 电 路 。 由<br />

于 现 在 元 器 件 体 积 日 渐 小 型 化 ,PCB 上 元 器 件 密 度 大 , 很 多 时 候 单 面 或 双 面 的 layout 实 现 已 经 非<br />

常 困 难 , 增 加 PCB 层 数 是 为 了 更 好 的 使 设 计 变 得 合 理 和 可 靠 。<br />

40. 问 : 在 LPC2119 与 光 隔 相 连 时 遇 到 问 题 , 以 前 用 的 片 子 I/O 口 都 是 5V 电 压 , 由 于 2119 是 3.3V 所 以 和<br />

以 前 系 统 中 采 用 的 高 速 光 耦 相 连 时 就 涉 及 到 两 个 问 题 : 接 受 光 耦 送 来 的 信 号 2119 可 否 承 受 还 有<br />

2119 输 出 的 信 号 能 否 驱 动 光 耦 <br />

答 : 可 以 将 CAN 引 脚 当 成 普 通 I/O 口 对 待 , 就 不 会 存 在 疑 惑 了 。<br />

41. 问 :LPC17xx 端 口 引 脚 的 内 部 上 拉 电 阻 可 以 关 闭 吗 在 不 考 虑 引 脚 功 能 的 情 况 下 , 每 个 端 口 的 上 拉<br />

/ 下 拉 电 阻 及 漏 极 开 路 输 出 模 式 可 能 选 择 吗 <br />

答 :LPC17xx 有 一 个 寄 存 器 用 于 控 制 上 拉 电 阻 的 激 活 与 失 活 , 软 件 可 以 控 制 上 拉 电 阻 。PINMODE<br />

寄 存 器 可 控 制 所 有 端 口 的 模 式 , 包 括 片 上 上 拉 / 下 拉 电 阻 及 漏 极 开 路 模 式 的 使 用 。 除 USB 和 I 2 C0 接<br />

口 引 脚 外 , 其 它 所 有 引 脚 都 可 在 不 考 虑 其 功 能 的 情 况 下 选 择 上 拉 / 下 拉 电 阻 和 漏 极 开 路 模 式 。 对 于<br />

P0.27 至 P0.30 引 脚 不 能 使 用 引 脚 选 择 模 式 ,P0.27 和 P0.28 专 用 于 I 2 C 漏 极 开 路 引 脚 , 不 带 有 上 拉 /<br />

下 拉 电 阻 ;P0.29 和 P0.30 做 为 USB 专 用 引 脚 也 没 有 可 配 置 的 上 拉 / 下 拉 电 阻 。P0.29 和 P0.30 用 于<br />

USB 功 能 时 , 做 为 一 个 整 体 必 须 设 置 为 相 同 的 方 向 。<br />

42. 问 :LPC17xx 的 GPIO 缺 省 复 位 状 态 是 什 么 GPIO 输 入 脚 的 电 容 值 为 多 少 <br />

答 : 所 有 GPIO 除 两 个 I 2 C 引 脚 (P0.27 和 P0.28 专 用 于 I 2 C 接 口 的 漏 极 开 路 引 脚 ) 和 USB 引 脚 (P0.29<br />

和 P0.30) 外 , 缺 省 复 位 状 态 为 带 上 拉 的 输 入 状 态 。 对 于 一 个 IO 引 脚 的 最 大 输 入 电 容 为 2.8pF。<br />

103


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

43. 问 :LPC17xx 的 UART 引 脚 可 定 向 至 不 止 一 个 GPIO 脚 上 , 如 TXD1 可 定 向 至 P0.15 和 P2.0,RXD1<br />

可 定 向 至 P0.16 至 P2.1。 是 否 可 以 将 P0.15 配 置 为 TXD1,P2.1 配 置 为 RXD1 是 否 可 以 将 P0.16 与<br />

P2.1 都 配 置 为 RXD1<br />

答 : 用 户 可 以 将 P0.15 用 做 TxD1, 同 时 P2.1 做 为 RXD1。 只 须 确 认 PINSEL 寄 存 器 中 这 些 引 脚 都 已<br />

正 确 配 置 。 对 于 接 收 数 据 用 的 RXD1, 用 户 应 配 置 为 P0.16 或 P2.1, 如 果 两 个 引 脚 都 配 置 为 RXD1,<br />

则 只 有 P0.16 起 作 用 。 对 于 传 送 数 据 用 的 TXD1, 可 以 同 时 将 P0.15 与 P2.0 都 配 置 为 TXD1, 数 据 从<br />

这 两 个 引 脚 都 可 以 传 送 出 去 。<br />

44. 问 :LPC2104/5/6 PWM 的 最 大 解 晰 度 是 多 少 PWM 模 块 做 为 通 过 时 钟 读 数 时 是 否 要 使 用 相 同<br />

的 计 数 器 <br />

答 : 最 大 解 晰 度 为 1/ 处 理 器 主 频 。 如 果 最 大 主 频 为 60MHz, 那 么 解 晰 度 为 16ns。 每 个 PWM 有 自 己<br />

的 时 钟 计 数 寄 存 器 , 不 必 用 相 同 的 计 数 器 。<br />

45. 问 : 用 87C752 设 计 一 个 开 头 电 源 的 控 制 器 时 , 出 现 反 复 重 启 的 现 象 , 该 如 何 解 决 <br />

答 : 这 种 情 况 下 , 可 通 过 在 VCC 入 口 点 加 一 个 4.7uf 的 大 型 电 容 来 解 决 。 一 般 情 况 下 , 应 检 查 板 子 上<br />

的 噪 声 , 确 保 VCC 没 有 产 生 噪 声 。<br />

46. 问 : 使 用 80C51 这 一 类 CMOS 微 控 制 器 时 , 对 未 用 的 输 入 脚 该 如 何 处 理 <br />

答 : 未 用 的 CMOS 输 入 脚 需 断 开 。 这 适 用 于 大 部 分 80C51 及 XA 系 列 输 入 型 引 脚 , 包 括 /EA 脚 ,<br />

8xC552 的 /EW 及 STADC 脚 等 。 纯 粹 的 CMOS 输 入 端 不 用 消 耗 电 流 去 拉 高 和 拉 低 , 只 需 连 至 电 源<br />

正 极 或 接 地 即 可 。 很 多 8051 输 入 端 内 部 有 上 拉 , 但 上 拉 作 用 很 小 , 可 能 不 能 完 全 消 除 引 脚 上 的 噪<br />

声 。 因 此 推 荐 将 引 脚 连 接 至 Vdd 或 Vss。 标 准 双 向 I/O 口 引 脚 因 为 内 部 有 上 拉 , 不 用 时 通 常 做 悬 空<br />

处 理 。 如 果 想 加 入 额 外 的 保 护 措 施 , 可 用 一 个 串 联 的 电 阻 来 限 流 。CMOS 输 入 脚 的 泄 漏 电 流 通 常<br />

为 10uA, 故 可 选 择 阻 值 为 100K 欧 姆 下 的 任 何 电 阻 ,10K 电 阻 为 最 佳 选 择 。 仔 细 的 将 未 用 的 引 脚 连<br />

线 是 不 会 引 起 任 何 操 作 问 题 的 。 如 大 部 分 80C51 系 列 的 /EA 脚 , 系 统 要 正 常 工 作 , 此 脚 必 须 要 处 于<br />

正 确 的 状 态 。 其 它 的 引 脚 只 有 在 软 件 激 活 后 才 有 作 用 , 如 8XC552 的 Start ADC(STADC) 脚 。 可 以 连<br />

接 至 高 电 压 或 低 电 压 . 还 可 将 多 个 未 用 的 CMOS 输 入 脚 连 至 同 一 个 电 阻 上 。<br />

8.4 有 关 MCU 开 发 软 件 编 程 问 答<br />

47. 问 :MCU 中 GPIO 输 入 与 输 出 方 向 如 何 选 择 有 何 区 别 <br />

答 : 请 使 用 方 向 寄 存 器 IO0DIR 控 制 方 向 , 置 1 寄 存 器 IO0SET: 置 1 置 0 寄 存 器 IO0CLR: 置 0, 接 上<br />

104


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

拉 电 阻 根 据 具 体 电 路 分 析 。<br />

48. 问 : 学 ARM 必 搞 嵌 入 式 操 作 系 统 吗 <br />

答 : 很 多 ARM 初 学 者 有 一 个 错 误 的 概 念 —— 学 ARM 必 搞 嵌 入 式 操 作 系 统 。 认 为 在 ARM 上 跑 嵌 入<br />

式 操 作 系 统 就 代 表 技 术 先 进 、 产 品 档 次 高 的 观 点 绝 对 是 谬 论 。 持 这 种 观 点 的 人 一 定 是 没 有 做 过 具<br />

体 的 产 品 开 发 。 一 个 嵌 入 式 产 品 是 否 需 要 跑 嵌 入 式 操 作 系 统 , 是 由 很 多 因 素 决 定 的 , 例 如 , 产 品 的<br />

功 能 需 求 、 开 发 成 本 、 开 发 周 期 等 都 是 需 要 综 合 考 虑 的 。 对 于 ARM 初 学 者 来 说 , 前 期 并 不 建 议 使<br />

用 嵌 入 式 操 作 系 统 。 当 用 户 手 中 的 开 发 板 相 关 部 分 都 熟 练 掌 握 后 , 即 对 MCU 的 内 部 功 能 器 件 可 以<br />

做 到 熟 练 应 用 的 程 度 后 , 可 以 考 虑 学 习 一 个 具 体 的 嵌 入 式 操 作 系 统 。<br />

目 前 , 流 行 的 嵌 入 式 操 作 系 统 非 常 多 , 如 ,uC/OS-II、WinCe、Linux、VxWorks 等 。 对 于 初 学 者 , 可<br />

以 考 虑 源 码 公 开 的 uC /OS-II 嵌 入 式 操 作 系 统 。uC /OS-II 已 经 有 很 多 产 品 成 功 使 用 的 案 例 且 得 到<br />

了 美 国 航 空 管 理 局 的 认 证 , 北 京 航 空 航 天 大 学 出 版 社 也 出 版 了 配 套 的 专 著 。 国 内 熟 悉 这 个 嵌 入 式<br />

操 作 系 统 的 开 发 人 员 特 别 多 , 十 分 容 易 通 过 网 站 上 的 讨 论 社 区 得 到 帮 助 , 更 关 键 的 是 , 初 学 者 可 以<br />

很 容 易 地 通 过 阅 读 源 码 达 到 彻 底 掌 握 嵌 入 式 操 作 系 统 的 目 的 。 在 熟 练 掌 握 了 uC /OS-II 后 , 用 户 已<br />

经 从 ARM 初 学 者 进 入 到 了 ARM 应 用 开 发 工 程 师 的 行 列 。 下 一 步 可 根 据 自 己 的 知 识 背 景 、 兴 趣 爱 好<br />

和 开 发 领 域 , 再 选 择 一 个 嵌 入 式 操 作 系 统 ( 例 如 WinCE、Linux 或 VxWorks 等 ) 进 行 学 习 , 彻 底 掌<br />

握 ARM 嵌 入 式 系 统 开 发 。<br />

49. 问 :ARM 上 的 嵌 入 式 系 统 初 始 化 过 程 是 怎 样 的 <br />

答 : 初 始 化 过 程 尽 管 各 种 嵌 入 式 应 用 系 统 的 结 构 及 功 能 差 别 很 大 , 但 其 系 统 初 始 化 部 分 完 成 的 操<br />

作 有 很 大 一 部 分 是 相 似 的 。<br />

1、 设 置 入 口 指 针 ;<br />

启 动 程 序 首 先 必 须 定 义 指 针 , 而 且 整 个 应 用 程 序 只 有 一 个 入 口 指 针 。 一 般 地 , 程 序 在 编 译 链 接 时<br />

将 异 常 中 断 向 量 表 链 接 在 0 地 址 处 , 并 且 作 为 整 个 程 序 入 口 点 。 入 口 点 代 码 如 下 :<br />

ENTRY ( _start ) ; 开 始<br />

2、 设 置 异 常 中 断 ;<br />

ARM 要 求 中 断 向 量 表 必 须 放 置 在 从 0 开 始 、 连 续 8×4 字 节 的 空 间 内 。<br />

3、 初 始 化 存 储 系 统 ;<br />

初 始 化 存 储 系 统 的 编 程 对 象 是 系 统 的 存 储 器 控 制 器 , 一 个 系 统 可 能 存 在 多 种 存 储 器 类 型 的 接 口 ,<br />

不 同 的 存 储 系 统 的 设 计 不 尽 相 同 。Flash 和 SRAM 同 属 于 静 态 存 储 器 类 型 , 可 以 合 用 一 个 存 储 器 端<br />

口 ; 而 DRAM 因 为 有 动 态 刷 新 和 地 址 线 复 用 等 特 性 , 通 常 配 有 专 用 的 存 储 器 端 口 。 其 中 ,SDRAM<br />

105


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

必 须 在 初 始 化 阶 段 进 行 设 置 , 因 为 大 部 分 的 程 序 代 码 和 数 据 都 要 在 SDRAM 中 运 行 。<br />

4、 存 储 器 地 址 分 布 重 映 射 (remap) 和 MMU;<br />

系 统 一 上 电 , 程 序 将 自 动 从 0 地 址 处 开 始 执 行 。 因 此 , 必 须 保 证 在 0 地 址 处 存 在 正 确 的 代 码 , 即 要 求<br />

0 地 址 开 始 映 射 的 是 非 易 失 性 的 ROM 或 Flash 等 。 但 是 因 为 ROM 或 Flash 的 访 问 速 度 相 对 较 慢 , 每<br />

次 中 断 响 应 发 生 后 , 都 要 从 读 取 ROM 或 Flash 上 面 的 向 量 表 开 始 , 影 响 了 中 断 响 应 速 度 。 一 般 程<br />

序 执 行 后 将 SDRAM 映 射 为 地 址 0, 并 把 系 统 程 序 加 载 到 SDRAM 中 运 行 , 其 具 体 步 骤 可 以 采 用 以<br />

下 的 方 案 :(1) 上 电 后 , 从 0 地 址 的 ROM 开 始 往 下 执 行 ;<br />

(2) 根 据 映 射 前 的 地 址 , 对 SDRAM 进 行 必 要 的 代 码 和 数 据 拷 贝 ;<br />

(3) 拷 贝 完 成 后 , 进 行 重 映 射 操 作 ;<br />

(4) 因 为 RAM 在 重 映 射 前 准 备 好 了 内 容 , 使 得 PC 指 针 能 继 续 在 RAM 里 取 得 正 确 的 指 令 。<br />

在 这 种 地 址 映 射 的 变 化 中 , 程 序 员 需 要 仔 细 考 虑 的 是 : 程 序 的 执 行 流 程 不 能 被 这 种 变 化 打 断 , 注<br />

意 保 证 程 序 流 程 在 重 映 射 前 后 的 承 接 关 系 。<br />

在 ARM 系 统 中 ,MMU 通 过 页 式 虚 拟 存 储 管 理 , 将 虚 拟 空 间 和 物 理 空 间 分 别 分 成 一 个 个 固 定 大 小<br />

的 页 , 并 建 立 两 者 间 的 映 射 关 系 , 从 而 实 现 虚 拟 地 址 到 物 理 地 址 的 转 换 。MMU 还 可 完 成 存 储 器 访<br />

问 权 限 的 控 制 和 虚 拟 存 储 器 空 间 缓 冲 特 性 的 设 置 。<br />

5、 初 始 化 有 特 殊 要 求 的 端 口 、 设 备 ;<br />

6、 转 换 处 理 器 模 式 , 开 中 断 ;<br />

7、 最 后 转 换 到 应 用 程 序 运 行 所 需 最 终 模 式 , 一 般 是 User 模 式 。 不 要 过 早 切 换 到 User 模 式 进 行 Us<br />

堆 栈 设 置 。 因 为 进 入 User 模 式 后 就 不 能 再 操 作 CPRS 回 到 别 的 模 式 , 可 能 会 对 接 下 去 的 程 序 执 行<br />

造 成 影 响 。 这 时 才 使 能 异 常 中 断 , 通 过 清 除 CPRS 寄 存 器 中 的 中 断 禁 止 位 实 现 。 如 果 过 早 地 开 中<br />

断 , 在 系 统 初 始 化 之 前 就 触 发 了 有 效 中 断 , 会 导 致 系 统 的 死 机 ;<br />

8、 呼 叫 主 应 用 程 序 ;<br />

当 所 有 的 系 统 初 始 化 工 作 完 成 后 , 就 需 要 把 程 序 流 程 转 入 主 应 用 程 序 。<br />

50. 问 :ARM 中 断 向 量 一 般 有 哪 些 设 置 方 法 <br />

答 : 有 两 种 : 在 32 位 A RM 系 统 中 , 一 般 都 是 在 中 断 向 量 表 中 放 置 一 条 分 支 指 令 或 PC 寄 存 器<br />

加 载 指 令 , 实 现 程 序 跳 转 到 中 断 服 务 例 程 的 功 能 。 例 如 :IRQEntr y B HandleIRQ, 跳 转 范 围<br />

较 小 B HandleFIQ 或 IRQEntry LDR PC=HandleIRQ, 跳 转 的 范 围 是 任 意 32 位 地 址 空 间 LDR<br />

PC=HandleFIQ LDR 伪 指 令 等 效 生 成 1 条 存 储 读 取 指 令 和 1 条 32 位 常 数 定 义 指 令 。32 位 常 数 存 储<br />

在 LDR 指 令 附 近 的 存 储 单 元 中 , 相 对 偏 移 小 于 4KB。 该 32 位 数 据 就 是 要 跳 转 到 的 中 断 服 务 程 序 入<br />

口 地 址 。 之 所 以 使 用 LDR 伪 指 令 , 是 因 为 ARM 的 RISC 指 令 为 单 字 指 令 , 不 能 装 载 32 位 的 立 即 数<br />

106


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

( 常 数 ), 无 法 直 接 把 一 个 32 位 常 数 数 据 或 地 址 数 据 装 载 到 寄 存 器 中 。 下 面 一 般 程 序 与 上 述 伪 指<br />

令 功 能 等 效 , 但 中 断 向 量 表 描 述 得 更 为 清 晰 。 其 中 VectorTable 为 相 对 LDR 指 令 的 偏 移 量 :<br />

IRQEntry LDR PC,VectorTable+0<br />

; 与 LDR PC,=HandleIRQ 等 效<br />

LDR PC,VectorTable+4<br />

; 与 LDR PC,=HandleFIQ 等 效<br />

……<br />

VectorTable DCD HandleTRQ<br />

DCD HandleFIQ<br />

……<br />

HandleIRQ<br />

……<br />

HandleFIQ<br />

一 般 ARM 嵌 入 式 系 统 的 程 序 都 是 固 化 在 从 00000000H 开 始 的 低 端 ROM 空 间 中 , 中 断 向 量 表<br />

VectorTable 也 是 固 化 在 ROM 中 , 所 以 上 述 两 种 方 法 都 无 法 在 程 序 运 行 时 动 态 随 机 修 改 中 断 向 量<br />

表 。 不 论 对 于 初 学 ARM 处 理 器 的 程 序 员 还 是 有 经 验 的 程 序 员 , 设 置 中 断 向 量 都 相 当 繁 琐 , 必 须 修<br />

改 ARM 的 C 程 序 的 启 动 代 码 。 一 段 晦 涩 的 汇 编 代 码 很 不 方 便 , 比 较 容 易 出 错 。<br />

51. 问 : 怎 么 对 扩 展 的 RAM 做 全 地 址 的 检 测 <br />

答 :#define EXTRAM 0x80000000// 定 义 指 向 RAM 起 始 地 址 的 指 针 #define EXTRAMSPACE<br />

0x40000// 这 里 是 你 自 己 定 义 的 要 检 测 的 RAM 的 大 小<br />

int i;<br />

// 通 过 各 单 元 填 写 0x55 和 0xAA, 可 检 测 各 个 位 是 否 都 可 置 0 和 置 1<br />

// 通 过 交 替 改 写 , 可 检 测 是 否 有 地 址 重 叠<br />

for(i = 0; i < EXTRAMSPACE; i++)<br />

// 所 有 单 元 填 0x55<br />

{<br />

*((volatile unsigned char *)(EXTRAM + i)) = 0x55;<br />

}<br />

for(i = 0; i < EXTRAMSPACE; i++)<br />

{<br />

if(*((volatile unsigned char *)(EXTRAM + i)) == 0x55)<br />

107


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

{<br />

*((volatile unsigned char *)(EXTRAM + i)) = 0xAA;<br />

}<br />

else<br />

{<br />

// 错 误 处 理<br />

}<br />

}<br />

for(i = 0; i < EXTRAMSPACE; i++)<br />

// 回 读 所 有 单 元<br />

{<br />

if(*((volatile unsigned char *)(EXTRAM + i)) == 0xAA)<br />

{<br />

*((volatile unsigned char *)(EXTRAM + i)) = 0x00<br />

}<br />

else<br />

{<br />

// 错 误 处 理<br />

}<br />

}<br />

52. 问 : 请 问 硬 件 中 断 请 求 和 软 件 中 断 是 都 可 以 定 义 为 FIQ 或 IRQ 中 断 , 还 是 只 有 硬 件 中 断 请 求 可 以 。<br />

如 果 只 有 硬 件 中 断 请 求 可 以 定 义 为 FIQ 或 IRQ, 那 么 软 件 中 断 又 是 如 何 工 作 的 还 有 就 是 向 量 中 断<br />

控 制 器 中 的 中 断 使 能 寄 存 器 ,IRQ 状 态 寄 存 器 等 的 每 一 位 是 不 是 已 经 对 好 了 相 应 的 中 断 输 入 ( 比 如<br />

串 口 , 定 时 器 ,IIC 等 )<br />

答 : 都 可 以 定 义 为 IRQ 或 者 FIQ 的 。 软 件 中 断 用 指 令 来 完 成 , 有 一 个 中 断 号 , 不 同 的 中 断 号 对 应 不<br />

同 的 服 务 程 序 。 中 断 使 能 寄 存 器 可 以 开 关 对 应 的 中 断 , 状 态 寄 存 器 也 可 以 读 取 对 应 的 中 断 。 软 中<br />

断 是 通 讯 进 程 之 间 用 来 模 拟 硬 中 断 的 一 种 信 号 通 讯 方 式 。 中 断 源 发 中 断 请 求 或 软 中 断 信 号 后 ,<br />

CPU 或 接 收 进 程 在 适 当 的 时 机 自 动 进 行 中 断 处 理 或 完 成 软 中 断 信 号 对 应 的 功 能 。 软 中 断 是 软 件 实<br />

现 的 中 断 , 也 就 是 程 序 运 行 时 其 他 程 序 对 它 的 中 断 ; 而 硬 中 断 是 硬 件 实 现 的 中 断 , 是 程 序 运 行 时 设<br />

备 对 它 的 中 断 。 软 中 断 与 硬 中 断 的 区 别 :<br />

108


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

(1) 软 中 断 发 生 的 时 间 是 由 程 序 控 制 的 , 而 硬 中 断 发 生 的 时 间 是 随 机 的 ;<br />

(2) 软 中 断 是 由 程 序 调 用 发 生 的 , 而 硬 中 断 是 由 外 设 引 发 的 ;<br />

(3) 硬 件 中 断 处 理 程 序 要 确 保 它 能 快 速 地 完 成 它 的 任 务 , 这 样 程 序 执 行 时 才 不 会 等 待 较 长 时<br />

间 。<br />

53. 问 : 如 何 进 行 编 程 可 以 减 少 程 序 的 bug<br />

答 : 在 此 提 供 一 些 建 议 , 因 系 统 中 实 际 运 行 的 参 数 都 是 有 范 围 的 。 系 统 运 行 中 要 考 虑 的 超 范 围 管<br />

理 参 数 有 :<br />

(1) 物 理 参 数 。 这 些 参 数 主 要 是 系 统 的 输 入 参 数 , 它 包 括 激 励 参 数 、 采 集 处 理 中 的 运 行 参 数 和 处<br />

理 结 束 的 结 果 参 数 。 合 理 设 定 这 些 边 界 , 将 超 出 边 界 的 参 数 都 视 为 非 正 常 激 励 或 非 正 常 回 应 进 行<br />

出 错 处 理 ;<br />

(2) 资 源 参 数 。 这 些 参 数 主 要 是 系 统 中 的 电 路 、 器 件 、 功 能 单 元 的 资 源 , 如 记 忆 体 容 量 、 存 储 单 元<br />

长 度 、 堆 迭 深 度 。 在 程 序 设 计 中 , 对 资 源 参 数 不 允 许 超 范 围 使 用 ;<br />

(3) 应 用 参 数 。 这 些 应 用 参 数 常 表 现 为 一 些 单 片 机 、 功 能 单 元 的 应 用 条 件 。 如 E2PROM 的 擦 写 次<br />

数 与 资 料 存 储 时 间 等 应 用 参 数 界 限 ;<br />

(4) 过 程 参 数 。 指 系 统 运 行 中 的 有 序 变 化 的 参 数 。<br />

在 上 述 参 数 群 对 一 名 程 序 编 写 者 而 言 , 须 养 成 良 好 习 惯 , 在 程 序 的 开 头 , 有 顺 序 的 用 自 己 喜 欢 的<br />

文 字 参 数 对 应 列 表 来 替 代 , 然 后 用 自 己 定 义 的 文 字 参 数 来 编 写 程 序 , 这 样 在 做 程 序 的 修 改 及 维 护<br />

时 只 在 程 序 的 开 头 做 变 动 即 可 , 不 用 修 改 到 程 序 段 , 才 比 较 容 易 且 不 会 出 错 。<br />

54. 问 : 在 单 片 机 C 编 成 时 , 如 何 才 能 使 生 成 的 代 码 具 有 和 汇 编 一 样 的 效 率 <br />

答 : 如 果 是 使 用 C 语 言 编 程 时 , 不 太 可 能 生 成 的 代 码 具 有 1:1 和 汇 编 一 样 的 效 率 。C 语 言 命 令 要 被<br />

硬 件 识 别 并 执 行 , 必 须 通 过 编 译 器 编 译 。 编 译 器 分 为 前 端 、 中 端 、 后 端 。 前 端 与 各 种 计 算 机 语 言 写<br />

的 程 序 打 交 道 , 后 端 与 处 理 器 的 基 本 指 令 集 接 轨 。 所 以 如 果 使 用 C 编 程 时 , 要 达 到 最 高 的 效 率 ,<br />

最 好 能 够 很 了 解 所 使 用 的 C 编 译 器 。 先 试 验 一 下 每 条 C 语 言 编 译 以 后 对 应 的 汇 编 语 言 的 语 句 行<br />

数 , 这 样 就 可 以 很 明 确 的 知 道 效 率 。 在 今 后 编 程 的 时 候 , 使 用 编 译 效 率 最 高 的 语 句 , 这 样 就 能 确<br />

保 单 片 机 C 编 程 的 时 候 同 样 的 功 能 不 同 的 C 程 序 , 编 译 效 率 最 高 。 但 是 各 家 的 C 编 译 器 都 会 有 一 定<br />

的 差 异 , 优 秀 的 嵌 入 式 系 统 C 编 译 器 代 码 长 度 和 执 行 时 间 仅 比 以 汇 编 语 言 编 写 的 同 样 功 能 程 度 长<br />

5-20%, 所 以 不 同 厂 家 的 C 编 译 器 的 编 译 效 率 也 会 有 所 不 同 。<br />

55. 问 : 如 果 已 经 有 了 针 对 某 MCU 的 C 实 现 的 某 个 算 法 , 保 持 框 架 不 变 , 对 核 心 的 部 分 用 汇 编 优 化 , 有<br />

没 有 一 些 比 较 通 用 的 原 则 <br />

109


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

答 : 每 个 人 的 编 程 都 有 自 己 的 风 格 与 习 惯 , 如 果 要 利 用 别 人 的 程 序 , 在 其 中 修 修 改 改 , 如 果 他 的 程<br />

序 并 没 有 很 好 的 模 块 化 的 话 , 建 议 最 好 不 要 这 么 做 , 否 则 本 来 预 期 达 到 事 倍 功 半 , 说 不 定 反 而 事<br />

半 功 倍 了 。 要 参 考 他 人 的 程 序 当 然 可 以 , 但 是 首 要 是 要 看 懂 并 理 解 他 人 程 序 的 算 法 精 髓 , 而 不 是<br />

在 他 的 基 础 上 打 补 丁 。 而 关 于 算 法 方 面 的 优 化 , 可 以 购 买 一 些 数 据 结 构 的 书 籍 , 上 面 有 比 较 详 细<br />

的 说 明 。<br />

56. 问 : 在 C51 中 变 量 的 空 间 分 配 有 哪 些 方 法 <br />

答 : 有 如 下 几 种 :<br />

(1)data 区 空 间 小 , 所 以 只 有 频 繁 用 到 或 对 运 算 速 度 要 求 很 高 的 变 量 才 放 到 data 区 内 , 比 如 for 循<br />

环 中 的 计 数 值 ;<br />

(2)data 区 内 最 好 放 局 部 变 量 ;<br />

因 为 局 部 变 量 的 空 间 是 可 以 覆 盖 的 ( 某 个 函 数 的 局 部 变 量 空 间 在 退 出 该 函 数 时 就 释 放 , 由 别 的 函 数 的<br />

局 部 变 量 覆 盖 ), 可 以 提 高 内 存 利 用 率 。 当 然 静 态 局 部 变 量 除 外 , 其 内 存 使 用 方 式 与 全 局 变 量 相 同 。<br />

(3) 确 保 你 的 程 序 中 没 有 未 调 用 的 函 数 ;<br />

在 Keil C 里 遇 到 未 调 用 函 数 , 编 译 器 就 将 其 认 为 可 能 是 中 断 函 数 。 函 数 里 用 的 局 部 变 量 的 空 间 是 不 释<br />

放 的 , 也 就 是 同 全 局 变 量 一 样 处 理 。 这 一 点 Keil C 做 得 很 愚 蠢 , 但 也 没 办 法 。<br />

(4) 程 序 中 遇 到 的 逻 辑 标 志 变 量 可 以 定 义 到 bdata 中 , 可 以 大 大 降 低 内 存 占 用 空 间 ;<br />

在 51 系 列 芯 片 中 有 16 个 字 节 位 寻 址 区 bdata, 其 中 可 以 定 义 8*16=128 个 逻 辑 变 量 。 定 义 方 法 是 :bdata<br />

bit LedState, 但 位 类 型 不 能 用 在 数 组 和 结 构 体 中 ;<br />

(5) 其 他 不 频 繁 用 到 和 对 运 算 速 度 要 求 不 高 的 变 量 都 放 到 xdata 区 ;<br />

(6) 如 果 想 节 省 data 空 间 就 必 须 用 large 模 式 , 将 未 定 义 内 存 位 置 的 变 量 全 放 到 xdata 区 。 当 然 最 好 对<br />

所 有 变 量 都 要 指 定 内 存 类 型 。<br />

(7) 当 使 用 到 指 针 时 , 要 指 定 指 针 指 向 的 内 存 类 型 ;<br />

在 C51 中 未 定 义 指 向 内 存 类 型 的 通 用 指 针 占 用 3 个 字 节 , 而 指 定 指 向 data 区 的 指 针 只 占 1 个 字 节 , 指 定<br />

指 向 xdata 区 的 指 针 占 2 个 字 节 。 如 指 针 p 是 指 向 data 区 , 则 应 定 义 为 :char data *p。 还 可 指 定 指 针 本 身<br />

的 存 放 内 存 类 型 , 如 :char data * xdata p。 其 含 义 是 指 针 p 指 向 data 区 变 量 , 而 其 本 身 存 放 在 xdata 区 。<br />

57. 问 : 在 采 用 ARM7 做 语 音 处 理 时 出 现 数 据 处 理 与 语 速 不 匹 配 的 现 象 , 该 如 何 解 决 <br />

答 : 语 音 处 理 的 实 时 性 要 求 很 高 , 否 则 , 若 数 据 处 理 速 度 跟 不 上 语 音 变 化 速 度 , 就 会 在 录 音 时 出<br />

现 刚 采 样 的 数 据 覆 盖 了 先 采 入 但 未 处 理 的 数 据 ; 在 放 音 时 , 出 现 播 放 的 速 度 比 实 际 语 音 慢 。 当<br />

然 , 如 果 用 足 够 大 的 缓 冲 , 可 以 避 免 录 音 出 现 的 问 题 , 但 放 音 出 现 的 问 题 是 无 法 避 免 的 。 同 时 , 鉴<br />

110


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

于 存 储 资 源 对 于 嵌 入 式 系 统 是 很 宝 贵 的 , 故 此 方 案 没 有 实 际 价 值 。 可 以 考 虑 采 用 “ 双 Buffer” 机<br />

制 , 能 够 使 采 样 和 编 码 之 间 、 解 码 和 播 放 之 间 分 别 互 不 影 响 、 并 发 执 行 , 易 于 控 制 ; 但 要 满 足 实<br />

时 性 要 求 , 还 要 使 编 解 码 速 度 符 合 采 样 和 播 放 的 要 求 。 语 音 速 率 是 8KB/s, 而 系 统 中 如 果 一 个 采<br />

样 点 用 16 位 表 示 , 编 解 码 速 度 不 能 低 于 16KB/s( 即 每 秒 至 少 编 码 16KB 的 PCM 码 , 每 秒 至 少 解 出<br />

16KB 的 PCM 码 )。<br />

58. 问 : 在 程 序 移 植 的 过 程 中 , 什 么 代 码 段 处 于 什 么 样 的 模 式 , 有 没 有 一 种 标 志 或 办 法 能 够 识 别 " 代 码<br />

段 处 于 什 么 样 的 模 式 "USR 模 式 ,SVC 模 式 ,IRQ 模 式 分 别 有 哪 些 限 制 <br />

答 : 读 取 CPSR, 任 何 时 候 都 是 可 以 读 的 。 对 于 外 设 操 作 限 制 与 芯 片 的 设 计 有 关 。USR 模 式 不 能 设<br />

置 CPSR 寄 存 器 。 用 户 模 式 下 无 SPSR 寄 存 器 , 代 码 可 以 为 ARM,Thumb。<br />

59. 问 :ARM 汇 编 程 序 设 计 中 所 谓 的 " 文 字 池 " 作 何 理 解 <br />

答 : 可 以 理 解 为 常 量 数 组 , 文 字 池 中 保 存 的 是 常 量 , 这 些 常 量 可 以 是 正 常 的 常 量 , 也 可 以 是 地 址 。<br />

60. 问 : 为 什 么 在 中 断 向 量 表 中 不 直 接 LDR PC," 异 常 地 址 "。 而 是 使 用 一 个 标 号 , 然 有 再 在 后 面 使 用<br />

DCD 定 义 这 个 标 号 <br />

答 : 因 为 LDR 指 令 只 能 是 跳 到 当 前 PC 4kB 范 围 内 , 而 B 指 令 能 跳 转 到 32MB 范 围 , 而 现 在 这 样 在<br />

LDR PC,"xxxx" 这 条 指 令 不 远 处 用 "xxxx"DCD 定 义 一 个 字 , 而 这 个 字 里 面 存 放 最 终 异 常 服 务 程 序<br />

的 地 址 , 这 样 可 以 实 现 4GB 全 范 围 跳 转 。<br />

61. 问 : 如 何 定 义 不 被 初 始 化 变 量 <br />

答 : 让 编 译 器 不 知 道 有 这 个 内 存 地 址 即 可 。 如 用 分 散 加 载 文 件 分 配 RAM 故 意 预 留 一 部 分 RAM 不<br />

分 配 , 用 它 来 存 您 不 需 要 初 始 化 的 东 西 。 或 者 不 调 用 编 译 器 提 供 的 启 动 代 码 , 不 过 这 样 可 能 编 程<br />

会 麻 烦 一 些 。<br />

62. 问 : 在 LPC2214 之 类 的 芯 片 中 如 何 实 现 数 组 的 绝 对 地 址 定 位 , 比 如 51 的 _at_ 的 用 法 。 再 问 : 但 这<br />

样 做 就 无 须 定 义 数 组 变 量 , 访 问 也 不 便 , 还 有 高 招 吗 <br />

答 :*((char*)0x40000300) 类 似 访 问 : 可 以 使 用 分 散 加 载 。<br />

63. 问 : 我 将 一 段 程 序 从 Flash 复 制 到 了 RAM 中 , 但 是 因 为 混 合 编 程 中 不 能 直 接 向 PC 寄 存 器 中 赋 值 来<br />

实 行 跳 转 , 这 样 我 该 如 何 跳 转 到 这 个 RAM 中 的 地 址 呢 <br />

答 : 用 函 数 指 针 。 可 参 考 IAP 例 子 。<br />

111


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

64. 问 : 在 C 中 嵌 入 这 样 一 条 语 句<br />

_ _asm<br />

{<br />

MRS R4,CPSR;<br />

STMFD SP!,{R4};<br />

ORR R4,R4,0x80;<br />

MSR CPSR_cxsf,R4<br />

}<br />

会 出 现 报 错 "illegal write to sp" 有 什 么 办 法 解 决 吗 <br />

答 : 嵌 入 汇 编 不 能 使 用 SP。<br />

65. 问 : 软 件 中 断 是 不 是 必 须 由 SWI 指 令 触 发 <br />

答 : 可 以 直 接 用 你 定 义 成 软 中 断 的 函 数 名 啊 。 比 如 :<br />

_ _SWI(0x12) void myswi(void); // 声 明 函 数<br />

_ _asm // 调 用 方 式 1<br />

{<br />

swi 0x12<br />

}<br />

myswi(); // 调 用 方 式 2<br />

66. 问 :"LDR R0,=PINSEL0" 中 "=" 是 什 么 意 思 这 语 句 是 取 地 址 还 是 取 地 址 中 的 内 容 呢 <br />

答 : 这 是 LDR 伪 指 令 , 可 用 来 加 载 32 位 立 即 数 或 地 址 ,LDR R0,=PINSEL0 是 将 PINSEL0 的 地 址<br />

加 载 到 R0 中 。<br />

67. 问 :"SWI 0" 和 "SWI 0X123456" 这 两 条 指 令 中 的 0 和 0X123456 中 有 何 用 。 有 没 有 应 用 SWI 的 具 体<br />

例 子 让 我 看 看 <br />

答 : 那 是 特 定 的 中 断 入 口 地 址 , 见 ADS_DeveloperGuide_D.pdf 下 的 swi。<br />

68. 问 : 软 中 断 SWI 作 底 层 接 口 的 问 题 。 以 下 函 数 为 啥 要 通 过 软 中 断 调 用 , 可 以 直 接 调 用 吗 <br />

OS_TASK_SW(),<br />

_OSStartHighTdy(),<br />

OS_ENTER_CRITICAL),<br />

112


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

OS_EXIT_CRITICAL(),<br />

答 : 在 用 户 模 式 或 Thumb 状 态 不 能 直 接 调 用 。<br />

69. 问 :ARM 的 一 条 指 令 是 32 位 长 , 但 有 时 一 个 立 即 数 也 是 32 位 , 这 是 如 何 解 释 的 <br />

答 : 指 令 中 使 用 的 立 即 数 需 要 由 一 个 8 位 的 常 数 循 环 右 移 偶 数 位 得 到 。 其 中 循 环 右 移 的 位 数 由 一<br />

个 4 位 二 进 制 数 的 2 倍 表 示 。 如 立 即 数 记 作 ,8 位 常 数 记 作 immed_8, 四 位 循 环 右 移<br />

的 常 数 记 作 rotate_imm, 则 有 :Immediate = immed_8 循 环 右 移 (2 * rotate_imm) 这 样 并 不 是 每 一<br />

个 32 位 常 数 都 是 合 法 的 立 即 数 , 只 有 通 过 以 上 方 法 构 造 的 才 是 合 法 的 立 即 数 。<br />

一 个 合 法 的 立 即 数 可 以 有 多 种 编 码 方 法 ( 取 不 同 的 immediate 和 immed_8 值 ), 由 于 循 环 右 移 会 影<br />

响 CPSR 的 C 标 志 位 值 , 因 此 同 一 个 合 法 的 立 即 数 采 用 不 同 的 编 码 方 式 将 使 某 些 指 令 产 生 不 同 的<br />

执 行 结 果 , 这 是 不 允 许 的 。ARM 处 理 器 对 立 即 数 采 用 了 如 下 的 编 码 方 式 : 当 立 即 数 值 在 0 和 0xFF<br />

之 间 时 , 令 immed_8=,rotate_imm=0; 其 它 情 况 下 编 译 器 使 用 rotate_imm 最 小 的 编<br />

码 方 式 。<br />

70. 问 :( 关 于 IIC) 以 前 用 51 写 IIC(24LC256) 的 程 序 时 , 其 中 的 delay() 函 数 可 以 利 用 汇 编 代 码 写 出<br />

准 确 的 延 时 函 数 , 但 现 在 用 ADS 调 试 C 代 码 时 , 怎 样 才 能 写 出 较 为 准 确 的 延 时 函 数 呢 <br />

答 : 有 两 种 方 法 : 要 求 比 较 精 确 的 话 , 可 以 用 定 时 器 ; 不 太 精 确 的 话 , 可 以 用 循 环 的 方 法 , 这 时 需<br />

要 知 道 你 的 CPU 的 频 率 是 多 少 , 然 后 计 算 运 行 一 个 指 令 需 要 多 少 时 间 , 然 后 可 以 得 到 你 的 循 环 一<br />

次 的 时 间 。<br />

71. 问 :ADS 里 没 有 CODE 关 键 词 , 怎 样 使 定 义 的 字 符 串 数 组 不 占 用 RAM 空 间 <br />

答 :const unsigned char string[]。<br />

72. 问 :*(volatile unsigned int *) 是 什 么 意 思 例 如 *(volatile unsigned int *)addr 具 体 是 什 么 意 思 <br />

答 : 分 开 来 看 ,(volatile unsigned int *) 就 是 定 义 一 个 可 变 的 无 符 号 整 形 指 针 , 前 面 的 那 个 * 就 是 取<br />

A 其 内 容 。<br />

73. 问 : 在 异 常 处 理 向 量 表 的 设 置 中 , 为 什 么 不 直 接 将 异 常 向 量 的 入 口 地 址 写 入 PC 中 呢 , 为 什 么 非 要<br />

用 什 么 DCD 这 些 伪 指 令 , 到 底 有 什 么 用 啊 <br />

答 : 为 了 保 证 任 何 时 候 其 累 加 和 为 零 , 不 然 改 一 次 程 序 就 要 计 算 一 次 。<br />

74. 问 : 如 何 修 改 ADS 的 启 动 代 码 , 从 _ _main 到 main, 按 道 理 应 该 有 一 个 文 件 , 修 改 这 个 小 文 件 , 就 可<br />

113


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

以 修 改 启 动 代 码 。<br />

答 :_ _main 是 ADS 运 行 库 , 最 好 不 要 修 改 , 要 是 不 使 用 库 就 不 要 用 main() 函 数 , 起 个 别 的 名 字 。 直<br />

接 跳 转 过 去 就 行 了 。 详 见 :《ARM 体 系 结 构 与 编 程 》P328。<br />

75. 问 : 我 在 用 ARM 的 IAP 功 能 , 要 把 已 经 烧 到 Flash 中 的 数 据 写 到 RAM 中 , 我 是 这 么 写 的 :<br />

uint32 *q,data;<br />

q = 0x00006000;<br />

data = *q;<br />

这 是 要 读 的 Flash 的 起 始 地 址 , 但 是 第 二 句 编 译 出 错 , 我 想 应 该 是 C 编 译 器 不 许 给 指 针 直 接 赋 值 ,<br />

我 用 汇 编 解 决 了 这 个 简 单 的 问 题 , 但 是 怎 么 用 C 来 解 决 呢 <br />

答 :q = (uint32 *)0x00006000。<br />

76. 问 : 处 理 器 在 什 么 情 况 下 处 于 用 户 模 式 <br />

答 : 需 要 你 去 设 置 CPSR 寄 存 器 。 用 户 程 序 前 台 程 序 一 般 在 用 户 模 式 / 系 统 模 式 下 运 行 。<br />

77. 问 : 在 rtos51 解 释 的 概 念 里 的 " 信 号 量 " 比 较 难 懂 ," 消 息 队 列 " 可 以 理 解 为 任 务 之 间 互 相 传 递 的 参<br />

数 , 但 " 信 号 量 " 怎 样 理 解 呢 <br />

答 : 信 号 量 是 60 年 代 中 期 Edgser dijkstra 发 明 的 , 它 实 际 上 是 一 种 程 序 间 的 约 定 机 制 , 这 种 约 定<br />

决 定 哪 个 程 序 ( 任 务 ) 可 以 执 行 。 在 多 任 务 内 核 中 普 遍 使 用 信 号 量 用 于 :<br />

1. 控 制 共 享 资 源 的 使 用 权 ( 满 足 互 斥 条 件 );<br />

2. 标 志 某 事 件 的 发 生 ;<br />

3. 使 两 个 任 务 的 行 为 同 步 。<br />

信 号 量 像 是 通 行 证 , 且 通 行 证 的 数 目 是 有 限 的 。 任 务 要 运 行 下 去 , 要 先 拿 到 通 行 证 。 如 果 信 号 量<br />

已 被 别 的 任 务 占 用 , 该 任 务 只 得 被 挂 起 , 直 到 信 号 量 被 当 前 使 用 者 释 放 掉 。 信 号 量 的 值 可 以 是 0 到<br />

255 或 0 到 65535, 或 0 到 4294967295, 取 决 于 信 号 量 规 约 机 制 使 用 的 是 8 位 ,16 位 还 是 32 位 。<br />

到 底 是 几 位 , 实 际 上 是 取 决 于 用 的 哪 种 内 核 。 根 据 信 号 量 的 值 , 内 核 跟 踪 那 些 等 待 信 号 量 的 任<br />

务 。 一 般 , 对 信 号 量 只 能 实 施 三 种 操 作 : 初 始 化 , 也 可 称 建 立 ; 等 信 号 也 可 称 作 挂 起 ; 给 信 号 或 发<br />

信 号 。 信 号 量 初 始 化 时 要 给 信 号 量 赋 初 值 , 等 待 信 号 量 的 任 务 表 应 清 为 空 。 想 要 得 到 信 号 量 的 任<br />

务 执 行 等 待 操 作 。 如 果 该 信 号 量 有 效 ( 即 信 号 量 值 大 于 0), 则 信 号 量 值 减 1, 任 务 得 以 继 续 运 行 。<br />

如 果 信 号 量 的 值 为 0, 等 待 信 号 量 的 任 务 就 被 列 入 等 待 信 号 量 任 务 表 。 多 数 内 核 允 许 用 户 定 义 等<br />

待 超 时 , 如 果 等 待 时 间 超 过 了 某 一 设 定 值 时 , 该 信 号 量 还 是 无 效 , 则 等 待 信 号 量 的 任 务 进 入 就 绪<br />

态 准 备 运 行 , 并 返 回 出 错 代 码 ( 指 出 发 生 了 等 待 超 时 错 误 )。 任 务 引 发 信 号 操 作 释 放 信 号 量 。 如 果 没<br />

114


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

有 任 务 在 等 待 信 号 量 , 信 号 量 的 值 仅 仅 是 简 单 地 加 1。 如 果 有 任 务 在 等 待 该 信 号 量 , 那 么 就 会 有<br />

一 个 任 务 进 入 就 绪 态 , 信 号 量 的 值 也 就 不 加 1。 于 是 通 行 证 给 了 等 待 信 号 量 的 诸 任 务 中 的 一 个 任<br />

务 。 至 于 给 了 哪 个 任 务 , 要 看 内 核 是 如 何 调 度 的 。 收 到 信 号 量 的 任 务 可 能 是 以 下 两 者 之 一 :<br />

* 等 待 信 号 量 任 务 中 优 先 级 最 高 的 任 务 ;<br />

* 最 早 开 始 等 待 信 号 量 的 那 个 任 务 , 即 按 先 进 先 出 的 原 则 (FIFO)。<br />

有 的 内 核 有 选 择 项 , 允 许 用 户 在 信 号 量 初 始 化 时 选 定 上 述 两 种 方 法 中 的 一 种 。 但 Small RTOS51<br />

只 支 持 优 先 级 法 。 如 果 进 入 就 绪 态 的 任 务 比 当 前 运 行 的 任 务 优 先 级 高 ( 假 设 , 是 当 前 任 务 释 放 的<br />

信 号 量 激 活 了 比 自 己 优 先 级 高 的 任 务 )。 则 内 核 做 任 务 切 换 ( 假 设 , 使 用 的 是 占 先 式 内 核 ), 高 优 先<br />

级 的 任 务 开 始 运 行 。 当 前 任 务 被 挂 起 。 直 到 又 变 成 就 绪 态 中 优 先 级 最 高 任 务 。<br />

78. 问 : 当 外 部 有 数 据 送 到 IO 口 时 , 是 不 是 通 过 读 寄 存 器 IOPIN 就 可 以 得 到 其 IO 的 当 前 状 态 呢 <br />

答 : 你 说 的 对 , 但 是 要 将 你 要 用 的 IO 口 设 为 GPIO(PINSEL0\PINSEL1) 方 式 , 并 将 其 设 为 输 入 方 式<br />

(IODIR), 就 可 以 了 。 不 过 要 是 你 用 的 IO 口 不 连 续 的 话 , 要 将 输 入 的 管 脚 状 态 处 理 一 下 才 是 你 要 的<br />

字 节 或 是 字 数 据 。 我 就 是 用 这 种 方 式 扩 展 外 部 CAN 总 线 器 件 的 。<br />

79. 问 : 我 想 问 向 量 表 累 加 和 是 如 何 计 算 的 <br />

答 : 前 8 个 字 的 32 位 机 器 码 相 加 。<br />

80. 问 : 执 行 FIQ 代 码 时 , 操 作 系 统 在 做 什 么 呢 当 执 行 FIQ 中 断 代 码 时 , 需 要 注 意 什 么 呢 要 对 相 关<br />

寄 存 器 进 行 入 栈 吗 那 执 行 完 了 以 后 , 又 怎 么 返 回 到 OS 里 执 行 任 务 呢 FIQ 可 不 可 以 调 用 OS 函<br />

数 IRQ 呢 <br />

答 :(1)FIQ 服 务 程 序 中 断 了 OS;<br />

(2)FIQ 中 断 服 务 不 在 OS 管 理 范 围 内 , 所 以 不 能 访 问 任 何 与 OS 相 关 的 函 数 及 变 量 ;<br />

(3)FIQ 其 实 就 是 普 通 的 FIQ 中 断 服 务 函 数 而 已 , 与 普 通 的 一 样 处 理 ;<br />

(4) 受 OS 管 理 的 IRQ 可 以 调 用 OS 的 系 统 功 能 函 数 。<br />

81. 问 : 是 不 是 FIQ 与 IRQ 的 使 用 上 没 有 什 么 区 别 FIQ 自 己 独 有 的 寄 存 器 有 什 么 用 我 是 否 可 以 把<br />

INT1,UART1 等 中 断 设 为 FIQFIQ 的 中 断 服 务 程 序 应 该 定 位 到 什 么 位 置 <br />

答 : 没 有 本 质 的 区 别 。FIQ 拥 有 独 立 的 R8_fiq~R12_fiq,FIQ 中 断 时 , 其 它 模 式 相 应 的 寄 存 器 就 可<br />

不 入 栈 , 从 而 加 快 FIQ 的 处 理 。 多 个 中 断 源 共 用 还 不 如 单 独 用 IRQ, 因 为 FIQ 比 较 适 合 在 人 命 关 天<br />

的 情 况 下 用 。<br />

115


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

82. 问 : 特 定 的 异 常 出 现 时 , 处 理 器 进 入 相 应 的 异 常 模 式 。 如 出 现 IRQ 就 进 入 IRQ 模 式 , 那 出 现 什 么 情<br />

况 进 入 管 理 模 式 呢 什 么 时 候 需 要 通 过 软 件 中 断 进 入 管 理 模 式 <br />

答 : 复 位 或 SWI 中 断 。 如 果 你 的 程 序 是 在 用 户 模 式 下 运 行 , 那 就 可 以 通 过 软 中 断 进 入 特 权 模 式 , 修<br />

改 CPSR 寄 存 器 。 如 开 关 IRQ 中 断 (CPSR 的 I 位 )。<br />

83. 问 : 用 ADS 做 开 发 , 如 何 替 换 原 厂 提 供 的 函 数 库 中 的 函 数 <br />

答 : 此 种 情 况 下 可 用 $Super$$ 和 $Sub$$ 来 重 载 。 例 如 你 想 重 载 一 个 名 为 foo() 的 函 数 , 可 在 自 己<br />

的 代 码 中 如 下 :<br />

extern void ExtraFunc(void);<br />

extern void $Super$$foo(void):<br />

/* this function will be linked instead of the original foo() */<br />

void $Sub$$foo(void)<br />

{<br />

ExtraFunc(); /* does some extra setup work */<br />

$Super$$foo(); /* calls the original foo function */<br />

}<br />

具 体 可 参 考 ADS 中 关 于 链 接 器 的 帮 助 文 档 。<br />

84. 问 : 什 么 是 ATPCS<br />

答 : 为 了 使 单 独 编 译 的 C 语 言 程 序 和 汇 编 程 序 之 间 能 够 相 互 调 用 , 必 须 为 子 程 序 之 间 的 调 用 规 定<br />

一 定 的 规 则 。ATPCS 就 是 ARM 程 序 和 Thumb 程 序 中 子 程 序 调 用 的 基 本 规 则 。 这 些 规 则 包 括 寄 存<br />

器 使 用 规 则 , 数 据 栈 的 使 用 规 则 , 参 数 的 传 递 规 则 等 。<br />

85. 问 : 存 储 异 常 向 量 表 中 程 序 跳 转 使 用 LDR 指 令 , 而 不 使 用 B 指 令 的 原 因 是 什 么 <br />

答 :LDR 指 令 可 以 全 地 址 范 围 跳 转 , 而 B 指 令 只 能 在 前 后 32MB 范 围 内 跳 转 ; 芯 片 具 有 Remap 功 能<br />

时 , 当 向 量 表 位 于 内 部 RAM 或 外 部 存 储 器 中 , 用 B 指 令 不 能 跳 转 到 正 确 的 位 置 。<br />

86. 问 : 锁 相 环 (PLL) 设 定 时 应 注 意 的 事 项 有 哪 些 <br />

答 :PLL 在 芯 片 复 位 或 进 入 掉 电 模 式 时 被 关 闭 并 旁 路 , 在 掉 电 唤 醒 后 不 会 自 动 恢 复 PLL 的 设 定 ;<br />

* PLL 只 能 通 过 软 件 使 能 ;<br />

* PLL 在 激 活 后 必 须 等 待 其 锁 定 , 然 后 才 能 连 接 ;<br />

* PLL 如 果 设 置 不 当 将 会 导 致 芯 片 的 错 误 操 作 。<br />

116


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

87. 问 :PWM 基 本 操 作 方 法 是 什 么 <br />

答 : 连 接 PWM 功 能 管 脚 输 出 , 即 设 置 PINSEL0、PINSEL1;<br />

* 设 置 PWM 定 时 器 的 时 钟 分 频 值 (PWMPR), 得 到 所 要 的 定 时 器 时 钟 ;<br />

* 设 置 比 较 匹 配 控 制 (PWMMCR), 并 设 置 相 应 比 较 值 (PWMMRx);<br />

* 设 置 PWM 输 出 方 式 并 允 许 PWM 输 出 (PWMPCR) 及 锁 存 使 能 控 制 (PWMLER);<br />

* 设 置 PWMTCR, 启 动 定 时 器 , 使 能 PWM;<br />

* 运 行 过 程 中 要 更 改 比 较 值 时 , 更 改 之 后 要 设 置 锁 存 使 能 。<br />

使 用 双 边 沿 PWM 输 出 时 , 建 议 使 用 PWM2、PWM4、PWM6; 使 用 单 边 PWM 输 出 时 , 在 PWM 周 期<br />

开 始 时 为 高 电 平 , 匹 配 后 为 低 电 平 , 使 用 PWMMR0 作 为 PWM 周 期 控 制 ,PWMMRx 作 为 占 空 比 控<br />

制 。<br />

88. 问 : 关 于 函 数 指 针 和 指 针 函 数 的 概 念 和 应 用 该 如 何 掌 握 <br />

答 : 在 程 序 运 行 中 , 函 数 代 码 是 程 序 的 算 法 指 令 部 分 , 它 们 和 数 组 一 样 也 占 用 存 储 空 间 , 都 有 相 应<br />

的 地 址 。 可 以 使 用 指 针 变 量 指 向 数 组 的 首 地 址 , 也 可 以 使 用 指 针 变 量 指 向 函 数 代 码 的 首 地 址 , 指<br />

向 函 数 代 码 首 地 址 的 指 针 变 量 称 为 函 数 指 针 。<br />

(1) 函 数 指 针 定 义<br />

函 数 类 型 (* 指 针 变 量 名 )( 形 参 列 表 );<br />

“ 函 数 类 型 ” 说 明 函 数 的 返 回 类 型 , 由 于 “()” 的 优 先 级 高 于 “*”, 所 以 指 针 变 量 名 外 的 括 号 必 不 可<br />

少 , 后 面 的 “ 形 参 列 表 ” 表 示 指 针 变 量 指 向 的 函 数 所 带 的 参 数 列 表 。<br />

例 如 :<br />

int (*f)(int x);<br />

double (*ptr)(double x);<br />

在 定 义 函 数 指 针 时 请 注 意 :<br />

函 数 指 针 和 它 指 向 的 函 数 的 参 数 个 数 和 类 型 都 应 该 是 — 致 的 ;<br />

函 数 指 针 的 类 型 和 函 数 的 返 回 值 类 型 也 必 须 是 一 致 的 。<br />

(2) 函 数 指 针 的 赋 值<br />

函 数 名 和 数 组 名 一 样 代 表 了 函 数 代 码 的 首 地 址 , 因 此 在 赋 值 时 , 直 接 将 函 数 指 针 指 向 函 数 名 就 行<br />

了 。 例 如 ,<br />

int func(int x); /* 声 明 一 个 函 数 */<br />

int (*f) (int x); /* 声 明 一 个 函 数 指 针 */<br />

f=func; /* 将 func 函 数 的 首 地 址 赋 给 指 针 f */<br />

117


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

赋 值 时 函 数 func 不 带 括 号 , 也 不 带 参 数 , 由 于 func 代 表 函 数 的 首 地 址 , 因 此 经 过 赋 值 以 后 , 指 针 f<br />

就 指 向 函 数 func(x) 的 代 码 的 首 地 址 。<br />

(3) 通 过 函 数 指 针 调 用 函 数 函<br />

数 指 针 是 通 过 函 数 名 及 有 关 参 数 进 行 调 用 的 。 与 其 它 的 指 针 变 量 相 类 似 , 如 果 指 针 变 量 p 是 指 向<br />

某 整 型 变 量 i 的 指 针 , 则 *p 等 于 它 所 指 的 变 量 i; 如 果 pf 是 指 向 某 浮 点 型 变 量 f 的 指 针 , 则 *pf 就 等 价<br />

于 它 所 指 的 变 量 f。 同 样 地 ,*f 是 指 向 函 数 func(x) 的 指 针 , 则 *f 就 代 表 它 所 指 向 的 函 数 func。 所 以<br />

在 执 行 了 f=func; 之 后 ,(*f) 和 func 代 表 同 一 函 数 。 由 于 函 数 指 针 指 向 存 储 区 中 的 某 个 函 数 , 因 此<br />

可 以 通 过 函 数 指 针 调 用 相 应 的 函 数 。 现 在 我 们 就 讨 论 如 何 用 函 数 指 针 调 用 函 数 , 它 应 执 行 下 面 三<br />

步 : 首 先 , 我 们 要 说 明 函 数 指 针 变 量 。<br />

例 如 :int (*f)(int x); 其 次 , 要 对 函 数 指 针 变 量 赋 值 。 例 如 : f=func; (func(x) 必 须 先 要 有 定 义 )<br />

最 后 , 要 用 (* 指 针 变 量 )( 参 数 表 ); 调 用 函 数 。<br />

例 如 : (*f)(x);(x 必 须 先 赋 值 )<br />

【 例 】 任 意 输 入 n 个 数 , 找 出 其 中 最 大 数 , 并 且 输 出 最 大 数 值 。<br />

main()<br />

{<br />

int f(int x,int y);<br />

int i,a,b;<br />

int (*p)(int x,int y); /* 定 义 函 数 指 针 */<br />

scanf('%d',&a);<br />

p=f; /* 给 函 数 指 针 p 赋 值 , 使 它 指 向 函 数 f */<br />

for(i=1;iy)x:y;<br />

118


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

return(z);<br />

}<br />

运 行 的 结 果 为 :343 -45 4389 4235 1 -534 988 555 789\The Max Number is:4389【 例 】<br />

(*((void (*)())0))() 表 示 什 么 意 思 void (*)() 声 明 函 数 指 针 。 让 我 们 来 分 析 一 下 , 左 边 圆 括 弧 中 的 星<br />

号 是 函 数 指 针 声 明 的 关 键 。 另 外 两 个 元 素 是 函 数 的 返 回 类 型 (void) 和 右 边 圆 括 弧 中 的 入 口 参 数<br />

( 本 例 中 参 数 是 空 )。 注 意 本 例 中 还 没 有 创 建 指 针 变 量 - 只 是 声 明 了 变 量 类 型 。(void (*)())0 把 0 强<br />

制 转 换 成 函 数 指 针 (*((void (*)())0))() 调 用 。 所 以 (*((void (*)())0))() 的 意 思 是 : 调 用 地 址 为 0 处 的 程<br />

序 。【 指 针 函 数 】 一 个 函 数 不 仅 可 以 带 回 一 个 整 型 数 据 的 值 , 字 符 类 型 值 和 实 型 类 型 的 值 , 还 可 以<br />

带 回 指 针 类 型 的 数 据 , 使 其 指 向 某 个 地 址 单 元 。 返 回 指 针 的 函 数 , 一 般 定 义 格 式 为 : 类 型 标 识 符<br />

* 函 数 名 ( 参 数 表 )int *f(x,y); 其 中 x,y 是 形 式 参 数 ,f 是 函 数 名 , 调 用 后 返 回 一 个 指 向 整 型 数 据 的 地 址<br />

指 针 。f(x,y) 是 函 数 , 其 值 是 指 针 。 如 :char *ch(); 表 示 的 就 是 一 个 返 回 字 符 型 指 针 的 函 数 , 请 看 下 面<br />

的 例 题 :【 例 】 将 字 符 串 1(str1) 复 制 到 字 符 串 2(str2), 并 输 出 字 符 串 2.<br />

#include 'stdio.h'main()<br />

{<br />

zchar *ch(char *,char *);<br />

char str1[]='I am glad to meet you!';<br />

char str2[]='Welcom to study C!';<br />

printf('%s',ch(str1,str2));<br />

}<br />

char *ch(char *str1,char *str2)<br />

{<br />

int i;<br />

char *p;<br />

p=str2<br />

if(*str2==NULL) exit(-1);<br />

do<br />

{ *str2=*str1;<br />

str1++;<br />

str2++;<br />

}while(*str1!=NULL);<br />

return(p);<br />

119


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

}<br />

通 过 分 析 可 得 :<br />

函 数 指 针 是 一 个 指 向 函 数 的 指 针 , 而 指 针 函 数 只 是 说 明 它 是 一 个 返 回 值 为 指 针 的 函 数 , 函 数 指 针<br />

可 以 用 来 指 向 一 个 函 数 。<br />

89. 问 :SPI 速 度 不 够 该 怎 么 办 <br />

答 : 可 以 考 虑 用 到 SSP,SPI 的 速 度 最 大 为 Fpclk/8, 我 们 假 设 CCLK = 72MHz, 外 设 分 频 系 数 VPB<br />

Divider =1, 则 Fpclk=72MHz,SPI 的 速 度 为 72MHz/8=9MHz。 若 需 要 更 高 的 速 度 , 推 荐 使 用 SSP,<br />

最 高 可 达 30MHz。SSP 与 SPI 不 同 之 处 在 于 : 它 们 有 相 同 的 接 口 , 但 是 ,SSP 比 SPI 要 快 , 且 有 更 大<br />

的 缓 存 ,SSP 还 有 一 个 8 帧 的 收 发 FIFO, 每 帧 大 小 可 在 4-16 位 变 化 。<br />

90. 用 87C751 做 开 发 时 使 用 了 一 个 软 件 UART, 打 算 与 PC 进 行 串 行 通 讯 ,xtal 频 率 为 3.6864MHz, 使<br />

用 了 Metalink 模 拟 器 ,9600 的 波 特 率 。 可 是 PC 机 接 收 到 了 错 误 的 数 据 , 这 是 什 么 原 因 <br />

答 : 频 率 为 3.6864MHz 时 , 软 件 UART 不 能 工 作 。 这 是 因 为 没 有 足 够 的 时 间 去 完 成 全 部 指 令 。 要 解<br />

决 这 个 问 题 , 频 率 为 3.6864MHz 时 应 将 波 特 率 降 至 2400, 欲 将 波 特 率 设 至 9600 的 话 , 应 将 xtal 频<br />

率 升 至 16MHz。C752 A/D 的 两 个 软 件 参 考 例 程 如 下 :<br />

Polling Method: {Polled routine}<br />

ReadAD: MOV A,#28H<br />

;Basic A/D start command<br />

ORL A,R7 ;Add Channel #<br />

MOV ADCON,A<br />

;Start A/D<br />

ADLoop: MOV A,ADCON<br />

;Get A/D status<br />

JNB ACC.4, ADLoop;Wait for ADCI (A/D done)<br />

MOV A,ADAT<br />

;Get result & clear Flag<br />

RET<br />

;ExitPolling Method: {Interrupt routine}<br />

StartAD:MOV A,#28<br />

;Basic A/D start command<br />

ORL A,R7 ;Add channel #<br />

MOV ADCON,A ;Start A/D<br />

ORG 2BH<br />

;ISR starts here {Interrupt}<br />

ADInt: MOV ADValue,ADAT ;Save result in RAM<br />

MOV A,ADCON<br />

;Get ADCON and<br />

ANL A,#07H ;mask to get last Chan. #<br />

120


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

DJNZ ACC,AD12<br />

;Decrement Chan. # and<br />

MOV A,#05H ;reset to highest Chan. #<br />

AD12: ORL A,#28H<br />

;Add back the A/D start<br />

MOV ADCON,A<br />

;value & restart A/D<br />

RETI<br />

;Exit<br />

8.5 有 关 MCU 开 发 调 试 问 答<br />

91. 问 : 我 是 ARM 初 学 者 , 有 些 问 题 :<br />

(1)DebugInRAM 和 DebugInFlash 有 什 么 区 别 是 不 是 一 个 放 在 FLASH 中 运 行 一 个 放 在 RAM<br />

中 运 行 <br />

(2)jtag 用 到 8 个 脚 , 用 20 针 是 不 是 太 浪 费 了 <br />

(3)PLL 在 156-320MHz, 如 果 速 度 低 了 不 能 运 行 吗 <br />

(4)LPC2132 的 FLASH 实 际 可 以 烧 写 几 次 超 过 了 出 错 吗 <br />

答 :(1) 理 解 的 没 有 问 题 ,DebugInRAM 是 在 RAM 内 运 行 ,DebugInFlash 是 在 Flash 内 运 行 。<br />

(2)JTAG 也 可 用 8 针 或 10 针 。<br />

(3) 正 确 , 低 了 或 高 了 都 不 稳 定 , 会 出 问 题 。<br />

(4) 可 以 烧 写 几 十 万 次 , 一 般 情 况 下 不 会 超 过 它 的 寿 命 , 如 果 超 过 了 会 出 错 。<br />

92. 问 :ARM 开 发 中 的 调 试 方 法 有 哪 些 <br />

答 : 用 户 选 用 ARM 处 理 器 开 发 嵌 入 式 系 统 时 , 选 择 合 适 的 开 发 工 具 可 以 加 快 开 发 进 度 , 节 省 开 发<br />

成 本 。 因 此 一 套 含 有 编 辑 软 件 、 编 译 软 件 、 汇 编 软 件 、 链 接 软 件 、 调 试 软 件 、 工 程 管 理 及 函 数 库 的<br />

集 成 开 发 环 境 (IDE) 一 般 来 说 是 必 不 可 少 的 , 至 于 嵌 入 式 实 时 操 作 系 统 、 评 估 板 等 其 他 开 发 工 具<br />

则 可 以 根 据 应 用 软 件 规 模 和 开 发 计 划 选 用 。 使 用 集 成 开 发 环 境 开 发 基 于 ARM 的 应 用 软 件 , 包 括 编<br />

辑 、 编 译 、 汇 编 、 链 接 等 工 作 全 部 在 PC 机 上 即 可 完 成 , 调 试 工 作 则 需 要 配 合 其 他 的 模 块 或 产 品 方<br />

可 完 成 , 目 前 常 见 的 调 试 方 法 有 以 下 几 种 :<br />

(1) 集 成 模 拟 器<br />

部 分 集 成 开 发 环 境 提 供 了 指 令 集 模 拟 器 , 可 以 方 便 用 户 在 PC 机 上 完 成 一 部 分 简 单 的 调 试 工 作 , 但<br />

是 由 于 指 令 集 模 拟 器 与 真 实 的 硬 件 环 境 相 差 很 大 , 因 此 即 使 用 户 使 用 指 令 集 模 拟 器 调 试 通 过 的<br />

程 序 也 有 可 能 无 法 在 真 实 的 硬 件 环 境 下 运 行 , 用 户 最 终 必 须 在 硬 件 平 台 上 完 成 整 个 应 用 的 开 发 。<br />

(2) 驻 留 监 控 软 件<br />

驻 留 监 控 软 件 (Resident Monitors) 是 一 段 运 行 在 目 标 板 上 的 程 序 , 集 成 开 发 环 境 中 的 调 试 软 件<br />

121


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

通 过 以 太 网 口 、 并 行 端 口 、 串 行 端 口 等 通 讯 端 口 与 驻 留 监 控 软 件 进 行 交 互 , 由 调 试 软 件 发 布 命 令<br />

通 知 驻 留 监 控 软 件 控 制 程 序 的 执 行 、 读 写 存 储 器 、 读 写 寄 存 器 、 设 置 断 点 等 。 驻 留 监 控 软 件 是 一 种<br />

比 较 低 廉 有 效 的 调 试 方 式 , 不 需 要 任 何 其 他 的 硬 件 调 试 和 仿 真 设 备 。ARM 公 司 的 Angel 就 是 该 类<br />

软 件 , 大 部 分 嵌 入 式 实 时 操 作 系 统 也 是 采 用 该 类 软 件 进 行 调 试 , 不 同 的 是 在 嵌 入 式 实 时 操 作 系 统<br />

中 , 驻 留 监 控 软 件 是 作 为 操 作 系 统 的 一 个 任 务 存 在 的 。 驻 留 监 控 软 件 的 不 便 之 处 在 于 它 对 硬 件 设<br />

备 的 要 求 比 较 高 , 一 般 在 硬 件 稳 定 之 后 才 能 进 行 应 用 软 件 的 开 发 , 同 时 它 占 用 目 标 板 上 的 一 部 分<br />

资 源 , 而 且 不 能 对 程 序 的 全 速 运 行 进 行 完 全 仿 真 , 所 以 对 一 些 要 求 严 格 的 情 况 不 是 很 适 合 。<br />

(3)JTAG 仿 真 器<br />

JTAG 仿 真 器 也 称 为 JTAG 调 试 器 , 是 通 过 ARM 芯 片 的 JTAG 边 界 扫 描 口 进 行 调 试 的 设 备 。JTAG 仿<br />

真 器 比 较 便 宜 , 连 接 比 较 方 便 , 通 过 现 有 的 JTAG 边 界 扫 描 口 与 ARM CPU 核 通 信 , 属 于 完 全 非 插<br />

入 式 ( 即 不 使 用 片 上 资 源 ) 调 试 , 它 无 需 目 标 存 储 器 , 不 占 用 目 标 系 统 的 任 何 端 口 , 而 这 些 是 驻 留 监<br />

控 软 件 所 必 需 的 。 另 外 , 由 于 JTAG 调 试 的 目 标 程 序 是 在 目 标 板 上 执 行 , 仿 真 更 接 近 于 目 标 硬 件 ,<br />

因 此 , 许 多 接 口 问 题 , 如 高 频 操 作 限 制 、AC 和 DC 参 数 不 匹 配 , 电 线 长 度 的 限 制 等 被 最 小 化 了 。 使<br />

用 集 成 开 发 环 境 配 合 JTAG 仿 真 器 进 行 开 发 是 目 前 采 用 最 多 的 一 种 调 试 方 式 。<br />

(4) 在 线 仿 真 器<br />

在 线 仿 真 器 使 用 仿 真 头 完 全 取 代 目 标 板 上 的 CPU, 可 以 完 全 仿 真 ARM 芯 片 的 行 为 , 提 供 更 加 深 入<br />

的 调 试 功 能 。 但 这 类 仿 真 器 为 了 能 够 全 速 仿 真 时 钟 速 度 高 于 100MHz 的 处 理 器 , 通 常 必 须 采 用 极<br />

其 复 杂 的 设 计 和 工 艺 , 因 而 其 价 格 比 较 昂 贵 。 在 线 仿 真 器 通 常 用 在 ARM 的 硬 件 开 发 中 , 在 软 件 的<br />

开 发 中 较 少 使 用 , 其 价 格 高 昂 也 是 在 线 仿 真 器 难 以 普 及 的 因 素 。<br />

93. 问 :2104 板 子 通 过 EasyJTAG 仿 真 时 , 在 AXD 上 没 有 文 件 , 而 且 出 现 这 样 "Error,Flash is protected<br />

by user configation!" 的 提 示 , 这 是 怎 么 回 事 啊 在 AXD 应 该 打 开 什 么 类 型 的 文 件 啊 <br />

答 : 在 仿 真 器 的 配 置 窗 口 设 置 仿 真 器 允 许 擦 除 FALSH。A XD ->Options->conf igure target-<br />

>configure->erase……<br />

94. 问 :LPC17xx 系 列 集 成 了 哪 些 调 试 和 追 踪 功 能 可 支 持 多 少 断 点 和 观 察 点 是 否 提 供 边 界 扫 描 <br />

答 :LPC17xx 系 列 支 持 标 准 JTAG,ARM 串 行 线 调 试 与 追 踪 功 能 , 并 行 追 踪 功 能 。 通 过 JTAG 和 串<br />

行 线 调 试 可 提 供 8 个 断 点 和 4 个 观 察 点 。 目 前 LPC17xx 系 列 没 有 边 界 扫 描 功 能 。<br />

95. 问 :LPC2104/5/6 中 调 试 时 遇 到 问 题 ,JTAG 口 仅 用 5 根 引 脚 来 调 试 , 此 时 引 脚 22-31 在 应 用 程 序<br />

中 不 可 用 , 这 是 什 么 原 因 <br />

答 : 这 种 情 况 是 正 常 的 , 在 主 调 试 模 式 , 即 使 仅 使 用 JTAG,22-31 引 脚 也 是 被 配 置 用 于 追 踪 。 如<br />

122


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

果 仅 打 算 用 JTAG 调 试 , 其 它 引 脚 留 给 应 用 程 序 使 用 , 那 么 可 采 用 第 二 个 JTAG 接 口 。 这 个 接 口 中 ,<br />

引 脚 27-31 用 于 调 试 , 其 它 引 脚 可 给 应 用 程 序 。 可 在 恩 智 浦 网 站 中 参 考 一 个 关 于 使 用 这 个 接 口 的<br />

详 细 指 令 的 应 用 笔 记 。<br />

8.6 其 他 有 关 MCU 开 发 问 题<br />

96. 问 : 请 介 绍 一 下 MCU 的 测 试 方 法 <br />

答 :MCU 从 生 产 出 来 到 封 装 出 货 的 每 个 不 同 的 阶 段 会 有 不 同 的 测 试 方 法 , 其 中 主 要 会 有 两 种 : 中<br />

测 和 成 测 。 所 谓 中 测 即 是 WAFER 的 测 试 , 它 会 包 含 产 品 的 功 能 验 证 及 AC、DC 的 测 试 。 项 目 相 当<br />

繁 多 , 如 : 接 续 性 测 试 : 检 测 每 一 根 I/OPIN 内 接 的 保 护 用 二 极 管 是 否 功 能 无 误 。<br />

功 能 测 试 : 以 产 品 设 计 者 所 提 供 测 试 资 料 ( TEST PATTERN) 灌 入 IC, 检 查 其 结 果 是 否 与 当 时<br />

SIMULATION 时 状 态 一 样 。<br />

STANDBY 电 流 测 试 : 测 量 IC 处 于 HALT 模 式 时 即 每 一 个 接 点 (PAD) 在 1 态 0 态 或 Z 态 保 持 不 变 时 的<br />

漏 电 流 是 否 符 合 最 低 之 规 格 。<br />

耗 电 测 试 : 整 颗 IC 的 静 态 耗 电 与 动 态 耗 电 。<br />

输 入 电 压 测 试 : 测 量 每 个 输 入 接 脚 的 输 入 电 压 反 应 特 性 。<br />

输 出 电 压 测 试 : 测 量 每 个 输 出 接 脚 的 输 出 电 压 位 准 。<br />

相 关 频 率 特 性 (AC) 测 试 , 也 是 通 过 外 灌 一 定 频 率 , 从 I/O 口 来 看 输 出 是 否 与 之 匹 配 。<br />

为 了 保 证 IC 生 产 的 长 期 且 稳 定 品 质 , 还 会 做 产 品 的 可 靠 性 测 试 , 这 些 测 试 包 括 ESD 测 试 ,LATCH<br />

UP 测 试 , 温 度 循 环 测 试 , 高 温 贮 存 测 试 , 湿 度 贮 存 测 试 等 。<br />

成 测 则 是 产 品 封 装 好 后 的 测 试 , 即 PACKAGE 测 试 。 即 是 所 有 通 过 中 测 的 产 品 封 装 后 的 测 试 , 方<br />

法 主 要 是 机 台 自 动 测 试 , 但 测 试 项 目 仍 与 WAFER TEST 相 同 。PACKAGE TEST 的 目 的 是 在 确 定<br />

IC 在 封 装 过 程 中 是 否 有 任 何 损 坏 。<br />

97. 问 : 如 果 准 备 估 计 一 个 算 法 的 MIPS, 有 什 么 好 的 途 径 <br />

答 : 算 法 的 运 行 时 间 是 指 一 个 算 法 在 计 算 机 上 运 算 所 花 费 的 时 间 。 它 大 致 等 于 计 算 机 执 行 简 单 操<br />

作 ( 如 赋 值 操 作 , 比 较 操 作 等 ) 所 需 要 的 时 间 与 算 法 中 进 行 简 单 操 作 次 数 的 乘 积 。 通 常 把 算 法 中<br />

包 含 简 单 操 作 次 数 的 多 少 叫 做 算 法 的 时 间 复 杂 性 。 它 是 一 个 算 法 运 行 时 间 的 相 对 量 度 , 一 般 用 数<br />

量 级 的 形 式 给 出 。 度 量 一 个 程 序 的 执 行 时 间 通 常 有 两 种 方 法 :<br />

* 一 种 是 事 后 统 计 的 方 法 。 因 为 很 多 计 算 机 内 部 都 有 计 时 功 能 , 不 同 算 法 的 程 序 可 通 过 一 组 或 若<br />

干 组 相 同 的 统 计 数 据 以 分 辨 优 劣 。 但 这 种 方 法 有 两 个 缺 陷 : 一 是 必 须 先 运 行 依 据 算 法 编 制 的 程<br />

序 ; 二 是 所 得 时 间 的 统 计 量 依 赖 于 计 算 机 的 硬 件 、 软 件 等 环 境 因 素 , 有 时 容 易 掩 盖 算 法 本 身 的 优<br />

123


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

劣 。 因 此 人 们 常 常 采 用 另 一 种 事 前 分 析 估 算 的 方 法 。<br />

* 一 个 程 序 在 计 算 机 上 运 行 时 所 消 耗 的 时 间 取 决 于 下 列 因 素 :<br />

(1) 依 据 的 算 法 选 用 何 种 策 略 ;<br />

(2) 问 题 的 规 模 。 例 如 求 100 以 内 还 是 1000 以 内 的 素 数 ;<br />

(3) 书 写 程 序 的 语 言 。 对 于 同 一 个 算 法 , 实 现 语 言 的 级 别 越 高 , 执 行 效 率 就 越 低 ;<br />

(4) 编 译 程 序 所 产 生 的 机 器 代 码 的 质 量 。 这 个 跟 编 译 器 有 关 ;<br />

(5) 机 器 执 行 指 令 的 速 度 。<br />

显 然 , 同 一 个 算 法 用 不 同 的 语 言 实 现 , 或 用 不 同 的 编 译 程 序 进 行 编 译 , 或 者 在 不 同 的 计 算 机 上 运<br />

行 时 , 效 率 均 不 相 同 。 这 表 明 使 用 绝 对 的 时 间 单 位 衡 量 算 法 的 效 率 是 不 合 适 的 。 撇 开 这 些 与 计 算<br />

机 硬 件 、 软 件 有 关 的 因 素 , 可 以 认 为 一 个 特 定 算 法 " 运 行 工 作 量 " 的 大 小 , 只 依 赖 于 问 题 的 规 模 ( 通<br />

常 用 整 数 量 n 表 示 ), 或 者 说 , 它 是 问 题 规 模 的 函 数 。<br />

一 个 算 法 是 由 控 制 结 构 ( 顺 序 、 分 支 和 循 环 三 种 ) 和 原 操 作 ( 指 固 有 数 据 类 型 的 操 作 ) 构 成 的 , 则<br />

算 法 时 间 取 决 于 两 者 的 综 合 效 果 。 为 了 便 于 比 较 同 一 问 题 的 不 同 算 法 , 通 常 的 做 法 是 , 从 算 法 中<br />

选 取 一 种 对 于 所 研 究 的 问 题 ( 或 算 法 类 型 ) 来 说 是 基 本 运 算 的 原 操 作 , 以 该 基 本 操 作 重 复 执 行 的<br />

次 数 作 为 算 法 的 时 间 度 量 。 算 法 的 MIPS 有 专 门 的 一 门 学 问 , 可 以 去 好 好 参 考 相 关 的 数 据 结 构 书<br />

籍 。<br />

98. 问 : 在 开 发 过 程 中 遇 到 NAND FLASH 的 坏 块 问 题 , 该 如 何 处 理 <br />

答 : 由 于 NAND Flash 的 工 艺 不 能 保 证 NAND 的 Memory Array 在 其 生 命 周 期 中 保 持 性 能 的 可 靠 ,<br />

因 此 , 在 NAND 的 生 产 中 及 使 用 过 程 中 会 产 生 坏 块 。 坏 块 的 特 性 是 :<br />

当 编 程 / 擦 除 这 个 块 时 , 不 能 将 某 些 位 拉 高 , 这 会 造 成 Page Program 和 Block Erase 操 作 时 的 错<br />

误 , 相 应 地 反 映 到 Status Register 的 相 应 位 。 总 体 上 , 坏 块 可 以 分 为 两 大 类 :<br />

(1) 固 有 坏 块<br />

这 是 生 产 过 程 中 产 生 的 坏 块 , 一 般 芯 片 原 厂 都 会 在 出 厂 时 都 会 将 坏 块 第 一 个 page 的 spare area 的<br />

第 6 个 byte 标 记 为 不 等 于 0xff 的 值 。<br />

(2) 使 用 坏 块<br />

这 是 在 NAND Flash 使 用 过 程 中 , 如 果 Block Erase 或 者 Page Program 错 误 , 就 可 以 简 单 地 将 这<br />

个 块 作 为 坏 块 来 处 理 , 这 个 时 候 需 要 把 坏 块 标 记 起 来 。 为 了 和 固 有 坏 块 信 息 保 持 一 致 , 将 新 发 现<br />

的 坏 块 的 第 一 个 page 的 spare area 的 第 6 个 Byte 标 记 为 非 0xff 的 值 。<br />

根 据 上 面 这 些 叙 述 , 可 以 了 解 NAND Flash 出 厂 时 在 spare area 中 已 经 反 映 出 了 坏 块 信 息 , 因 此 ,<br />

如 果 在 擦 除 一 个 块 之 前 , 一 定 要 先 check 一 下 spare area 的 第 6 个 byte 是 否 是 0xff, 如 果 是 就 证 明<br />

124


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

这 是 一 个 好 块 , 可 以 擦 除 ; 如 果 是 非 0xff, 那 么 就 不 能 擦 除 。<br />

当 然 , 这 样 处 理 可 能 会 犯 一 个 错 误 “ 错 杀 伪 坏 块 ”, 因 为 在 芯 片 操 作 过 程 中 可 能 由 于 电 压 不 稳 定 等<br />

偶 然 因 素 会 造 成 NAND 操 作 的 错 误 。 但 是 , 为 了 数 据 的 可 靠 性 及 软 件 设 计 的 简 单 化 , 我 们 一 定 不<br />

要 放 过 一 个 坏 块 。<br />

99. 问 : 有 免 费 的 用 于 LPC2000 设 备 的 FLASH 编 程 工 具 吗 <br />

答 : 思 智 浦 半 导 体 已 经 加 入 Embedded Systems Academy, 免 费 提 供 名 称 为 Flash Magic 的<br />

FLASH 编 程 工 具 。 该 工 具 可 在 网 上 免 费 下 载 , 支 持 除 LPC288X 外 的 全 部 LPC2000 系 列 。 网 址 为 :<br />

www.flashmagictool.com。 思 智 浦 半 导 体 还 提 供 另 一 种 FLASH 编 程 工 具 , 可 支 持 部 分 LPC2000<br />

设 备 ( 名 称 为 LPC2000 Flash ISP Utility v2.2.3)。 推 荐 使 用 Flash Magic, 因 为 该 工 具 在 v2.2.3 版<br />

后 不 再 更 新 了 。<br />

100. 问 : 关 于 NandFlash 的 steppingstone 问 题 。 资 料 上 说 : 上 电 后 ,Nandflash 开 始 的 4k 数 据 被 自 动 地<br />

复 制 到 芯 片 内 部 一 个 被 称 为 “Steppingstone” 的 RAM 上 。Steppingstone 被 映 射 为 地 址 0, 上 面 的<br />

4k 程 序 完 成 必 要 的 初 始 化 。 我 不 明 白 的 是 :<br />

1. 这 个 复 制 过 程 是 ARM 核 自 动 完 成 的 吗 <br />

2. Nandflash 开 始 的 4k 数 据 只 是 vivi 的 一 小 部 分 , 只 把 这 一 小 部 分 ( 对 整 个 vivi 而 言 信 息 是 不 完 整<br />

的 ) 复 制 到 steppingstone 怎 么 能 正 常 运 行 呢 <br />

答 : 前 面 的 4K 代 码 是 CPU 自 己 完 成 的 , 自 动 将 Nand 的 前 4K 代 码 复 制 到 片 内 R AM 中 , 再 从 片 内<br />

RAM 中 运 行 。 这 4K 的 代 码 只 需 要 做 SDRAM 的 初 始 化 以 及 把 Nand 中 的 其 它 代 码 搬 到 SDRAM 中<br />

就 行 了 。 其 它 的 工 作 是 在 SDRAM 中 运 行 搬 运 过 来 的 代 码 来 完 成 的 , 这 与 其 它 的 Flash 程 序 没 有 区<br />

别 。<br />

125


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

第 9 章 MCU 开 发 资 源 总 汇<br />

一 、 官 网 大 全<br />

1、 恩 智 浦 官 方 网 站 www.nxp.com<br />

2、 恩 智 浦 应 用 资 讯 站 www.nxpchina.com<br />

3、 恩 智 浦 MCU 资 源 频 道 www.standardics.nxp.com/microcontrollers<br />

4、 恩 智 浦 32 位 MCU 最 新 信 息 www.nxp.com/campaigns/experience_mcuoptions<br />

5、 恩 智 浦 MCU 应 用 指 南 大 全 www.standardics.nxp.com/support/documents<br />

microcontrollers/type=appnote<br />

6、 周 立 功 单 片 机 www.zlgmcu.com<br />

7、 品 佳 集 团 官 网 www.sacg.com.tw<br />

8、Keil 官 网 www.keil.com<br />

9、ARM Realview 开 发 工 具 官 网 www.realview.com.cn<br />

10、ARM 官 网 www.arm.com<br />

11、 英 蓓 特 信 息 技 术 www.embedinfo.com<br />

12、 麦 克 泰 技 术 www.bmrtech.com<br />

二 、 专 业 网 站 、MCU 开 发 博 客 信 息<br />

1、 电 子 创 新 网 www.eetrend.com<br />

2、 电 子 工 程 专 辑 www.eetchina.com<br />

3、 电 子 设 计 技 术 www.ednchina.com<br />

4、 电 子 系 统 设 计 www.ed-china.com<br />

5、21IC 中 国 电 子 网 www.21ic.com<br />

6、 电 子 产 品 世 界 www.eepw.com.cn<br />

7、 老 古 开 发 网 www.laogu.com<br />

8、 中 电 网 www.eccn.com<br />

9、 嵌 入 式 在 线 www.mcuol.com<br />

126


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

第 10 章 编 委 信 息 与 后 记<br />

在 众 多 编 委 的 努 力 和 协 作 下 ,《32 位 MCU 开 发 全 攻 略 》 经 过 3 个 月 的 编 撰 终 于 和 大 家 见 面 了 , 在 此<br />

特 别 向 参 与 此 书 编 撰 的 编 委 们 表 示 衷 心 的 感 谢 , 他 们 是 :<br />

陈 劼<br />

恩 智 浦 市 场 传 讯 经 理<br />

王 朋 朋 恩 智 浦 微 控 制 器 项 目 经 理<br />

王 超<br />

陆 军<br />

王 维<br />

恩 智 浦 资 深 应 用 工 程 师<br />

恩 智 浦 资 深 应 用 工 程 师<br />

恩 智 浦 微 控 制 器 产 品 市 场 助 理 经 理<br />

白 延 敏 南 京 航 空 航 天 大 学<br />

牛 晓 东 上 海 丰 宝 电 子 有 限 公 司<br />

随 着 32 位 MCU 应 用 升 温 , 本 土 工 程 师 需 要 掌 握 必 要 的 基 础 知 识 ,《32 位 MCU 开 发 全 攻 略 》 从 基<br />

础 知 识 起 步 , 以 恩 智 浦 MCU 为 实 例 , 讲 解 了 32 位 MCU 开 发 的 实 用 知 识 , 希 望 这 本 电 子 书 能 给 MCU 开 发<br />

者 带 来 实 际 的 帮 助 ! 也 欢 迎 工 程 师 朋 友 就 MCU 开 发 需 求 与 我 们 交 流 , 以 便 我 们 可 以 开 发 后 续 版 本 提 供<br />

更 好 的 内 容 , 提 升 本 土 MCU 应 用 创 新 水 平 !<br />

再 次 感 谢 大 家 的 支 持 !<br />

张 国 斌<br />

《32 位 MCU 开 发 全 攻 略 》 主 编<br />

richard@eetrend.com<br />

127


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

第 11 章 版 权 声 明<br />

1、《32 位 MCU 开 发 全 攻 略 》 著 作 权 属 于 张 国 斌 等 编 委 共 同 所 拥 有 ;<br />

2、 本 着 服 务 大 众 的 思 想 , 我 们 授 权 任 何 对 MCU 开 发 有 兴 趣 的 工 程 师 免 费 下 载 并 自 由 复 制 、<br />

传 播 该 书 ;<br />

3、 非 经 作 者 ( 张 国 斌 为 代 表 ) 书 面 同 意 , 不 可 以 对 本 电 子 书 加 以 切 割 、 编 辑 及 部 分 内 容 传 播 ;<br />

4、 任 何 商 业 用 途 必 须 得 到 作 者 ( 张 国 斌 为 代 表 ) 的 书 面 同 意 。<br />

5、 作 者 联 系 方 式 richard@eetrend.com<br />

128


32 位 MCU 开 发 全 攻 略 -- 工 程 师 创 新 宝 典 下 册 技 巧 篇<br />

参 考 文 献<br />

1、ARM 原 理 与 嵌 入 式 应 用 桂 电 - 丰 宝 联 合 实 验 室 编 者 电 子 工 业 出 版 社 2008<br />

2、 嵌 入 式 技 术 及 其 应 用 方 尔 正 , 王 燕 编 著 哈 尔 滨 工 业 大 学 出 版 社 2008<br />

3、 周 立 功 单 片 机 网 站 www.zlgmcu.com<br />

4、 维 基 百 科 网 站 zh.wikipedia.org<br />

129

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!