UM1713 用 户 手 册 使 用 LwIP TCP/IP 栈, 在 STM32Cube 上 开 发 应 用 前 言 STM32F4x7/9xx 和 STM32F2x7xx 微 控 制 器 配 有 高 质 量 10/100 Mbit/s 以 太 网 外 设, 支 持 媒 体 独 立 接 口 (MII) 和 缩 减 的 媒 体 独 立 接 口 (RMII), 以 便 与 物 理 层 (PHY) 接 口 当 使 用 以 太 网 通 信 接 口 时, 会 使 用 TCP/IP 软 件 协 议 栈 以 实 现 局 域 网 或 者 广 域 网 中 的 通 信 本 用 户 手 册 说 明 了 怎 样 使 用 STM32CubeF2 和 STM32CubeF4 HAL 驱 动 程 序, 将 一 个 免 费 中 间 件 TCP/IP 栈 分 别 集 成 到 基 于 STM32F2x7xx 和 STM32F4x7/9xx 微 控 制 器 的 嵌 入 式 应 用 ( 请 参 考 第 1 章 节 以 获 得 STM32Cube 的 详 细 信 息 ) 该 中 间 件 TCP/IP 栈 为 LwIP ( 轻 量 级 IP), 专 为 嵌 入 式 应 用 开 发 的 开 源 协 议 栈 对 于 每 款 评 估 板, 此 包 都 包 含 了 九 个 运 行 于 LwIP 栈 之 上 的 应 用 : 基 于 Raw API, 运 行 于 独 立 模 式 ( 没 有 RTOS) 的 应 用 : Web 服 务 器 TFTP 服 务 器 TCP 回 响 客 户 端 应 用 TCP 回 响 服 务 器 应 用 UDP 回 响 客 户 端 应 用 UDP 回 响 服 务 器 应 用 运 行 于 FreeRTOS 操 作 系 统 的 应 用 : 基 于 netconn API 的 Web 服 务 器 基 于 socket API 的 Web 服 务 器 基 于 netconn API 的 TCP/UDP 回 响 服 务 器 应 用 注 : 在 本 文 中, STM32Cube 指 的 是 STM32CubeF2 和 STM32CubeF4, STM32F4xx 指 的 是 STM32F4x7xx 和 STM32F4x9xx 微 控 制 器, STM322xx-EVAL 和 STM324xx-EVAL 指 的 是 STM3221x-EVAL STM324xG-EVAL 和 STM324x9I-EVAL 评 估 板 本 文 提 供 的 截 屏 和 文 件 名 对 应 的 是 运 行 于 STM32F4 微 控 制 器 上 的 应 用 样 例 然 而, 它 们 也 适 用 于 STM32F2x7xx 2014 年 5 月 DocID025731 Rev 1 1/44 www.st.com
目 录 目 录 1 STM32Cube 概 述.......................................... 6 2 LwIP TCP/IP 栈 描 述.......................................... 7 2.1 栈 特 性.................................................... 7 2.2 授 权...................................................... 7 2.3 LwIP 架 构.................................................. 8 2.4 LwIP 栈 的 目 录 组 织.......................................... 9 2.5 LwIP API 概 述............................................. 10 2.5.1 Raw API................................................. 10 2.5.2 Netconn API.............................................. 11 2.5.3 Socket API............................................... 12 2.6 LwIP 缓 冲 管 理............................................. 12 2.6.1 包 缓 冲 结 构............................................... 12 2.6.2 pbuf 管 理 API............................................. 13 3 LwIP 与 STM32Cube 以 太 网 HAL 驱 动 之 间 的 接 口................. 15 4 LwIP 配 置................................................. 17 4.1 模 块 支 持.................................................. 17 4.2 存 储 器 配 置................................................ 17 5 使 用 LwIP 栈 开 发 应 用........................................ 19 5.1 使 用 Raw API 在 独 立 模 式 中 开 发............................... 19 5.1.1 工 作 模 型................................................ 19 5.1.2 TCP 回 响 服 务 器 演 示 举 例................................... 20 5.2 使 用 Netconn 或 Socket API 基 于 RTOS 开 发..................... 23 5.2.1 工 作 模 型................................................ 23 5.2.2 使 用 Netconn API 的 TCP 回 响 服 务 器 演 示 举 例................... 24 6 LwIP 包 描 述............................................... 27 6.1 LwIP 包 目 录............................................... 27 6.2 应 用 设 置.................................................. 27 6.2.1 PHY 接 口 配 置............................................ 27 2/44 DocID025731 Rev 1
目 录 6.2.2 MAC 和 IP 地 址 设 置........................................ 27 6.2.3 固 件 特 性................................................ 28 6.3 评 估 板 设 置................................................ 28 6.3.1 STM324x9I-EVAL 设 置..................................... 28 6.3.2 STM324xG-EVAL 设 置..................................... 28 6.3.3 STM3222xG-EVAL 设 置.................................... 29 7 使 用 LwIP 应 用............................................. 30 7.1 入 门 级 应 用................................................ 30 7.1.1 TCP 回 响 客 户 端........................................... 30 7.1.2 TCP 回 响 服 务 器........................................... 31 7.1.3 UDP 回 响 客 户 端.......................................... 32 7.1.4 UDP 回 响 服 务 器.......................................... 33 7.1.5 基 于 netconn API 的 UDP TCP 回 响 服 务 器...................... 34 7.2 特 性 级 应 用................................................ 35 7.2.1 基 于 raw API 的 Web 服 务 器................................. 35 7.2.2 基 于 netconn API 的 Web 服 务 器.............................. 37 7.2.3 基 于 socket API 的 Web 服 务 器............................... 38 7.3 集 成 级 应 用................................................ 39 7.3.1 TFTP 服 务 器............................................. 39 8 结 论...................................................... 41 附 录 A FAQ................................................... 42 A.1 我 怎 样 选 择 静 态 或 动 态 (DHCP) IP 地 址 分 配?................... 42 A.2 当 以 太 网 网 线 断 开 时, 应 用 如 何 处 理?........................... 42 A.3 怎 样 将 应 用 移 植 到 不 同 的 硬 件 上?.............................. 42 9 修 订 历 史.................................................. 43 DocID025731 Rev 1 3/44 3
表 格 索 引 表 格 索 引 表 1. TCP Raw API 函 数....................................................... 10 表 2. UDP Raw API 函 数....................................................... 11 表 3. Netconn API 函 数........................................................ 11 表 4. Socket API 函 数......................................................... 12 表 5. Pbuf API 函 数........................................................... 13 表 6. 以 太 网 接 口 函 数 说 明...................................................... 15 表 7. LwIP 内 存 配 置........................................................... 17 表 8. STM324x9I-EVAL 跳 线 配 置................................................ 28 表 9. STM324xG-EVAL 跳 线 配 置................................................ 28 表 10. STM322xG-EVAL 跳 线 配 置................................................ 29 表 11. LwIP 应 用 分 类........................................................... 30 表 12. 文 档 修 订 历 史........................................................... 43 4/44 DocID025731 Rev 1
图 片 索 引 图 片 索 引 图 1. STM32Cube 框 图......................................................... 6 图 2. LwIP 架 构............................................................... 9 图 3. 图 2 LwIP 目 录 结 构........................................................ 9 图 4. Pbuf 结 构.............................................................. 12 图 5. 独 立 工 作 模 型........................................................... 19 图 6. 使 用 RTOS 时 的 lwip 工 作 模 型.............................................. 23 图 7. TCP 回 响 客 户 端......................................................... 31 图 8. TCP 回 响 服 务 器......................................................... 32 图 9. UDP 回 响 客 户 端......................................................... 33 图 10. UDP 回 响 服 务 器......................................................... 34 图 11. Web 服 务 器 主 页......................................................... 36 图 12. HTTP 服 务 器 中 的 SSI 使 用................................................. 37 图 13. 任 务 页 面 的 Web 服 务 器 列 表................................................ 38 图 14. TFTP 工 具 (tftpd32)..................................................... 39 DocID025731 Rev 1 5/44 5
STM32Cube 概 述 1 STM32Cube 概 述 STM32Cube 计 划 源 自 意 法 半 导 体, 旨 在 通 过 减 少 开 发 的 工 作 量 时 间 与 成 本, 使 开 发 者 受 益 STM32Cube 涵 盖 STM32 产 品 组 合 STM32Cube 1.x 版 包 括 : 图 形 软 件 配 置 工 具 STM32CubeMX, 可 通 过 图 形 向 导 生 成 初 始 化 C 代 码 针 对 每 个 系 列 提 供 综 合 的 嵌 入 式 软 件 平 台 ( 例 如 STM32CubeF2 用 于 STM32F2 系 列, STM32CubeF4 用 于 STM32F4 系 列 ) STM32 抽 象 层 嵌 入 式 软 件 STM32Cube HAL, 确 保 在 STM32 各 个 产 品 之 间 实 现 最 大 限 度 的 可 移 植 性 一 套 一 致 的 中 间 件, 比 如 RTOS USB TCP/IP 图 形 所 有 嵌 入 式 软 件 实 用 工 具 均 配 备 一 套 完 整 的 示 例 图 1. STM32Cube 框 图 6/44 DocID025731 Rev 1
LwIP TCP/IP 栈 描 述 2 LwIP TCP/IP 栈 描 述 2.1 栈 特 性 LwIP 为 免 费 TCP/IP 栈, 由 Adam Dunkels 在 瑞 典 计 算 机 科 学 院 (SICS) 开 发, 由 修 正 的 BSD 许 可 授 权 LwIP TCP/IP 实 现 的 侧 重 点 为 在 全 面 保 持 TCP/IP 栈 的 同 时, 尽 可 能 的 减 少 RAM 的 使 用 这 使 得 LwIP 特 别 适 合 在 嵌 入 式 系 统 中 使 用 LwIP 具 有 下 列 协 议 : IPv4 和 IPv6 ( 网 际 协 议 v4 和 v6) ICMP ( 互 联 网 控 制 消 息 协 议 ), 用 于 网 络 维 护 和 调 试 IGMP ( 互 联 网 组 管 理 协 议 ), 用 于 多 播 流 量 的 管 理 UDP ( 用 户 数 据 报 协 议 ) TCP ( 传 输 控 制 协 议 ) DNS ( 域 名 服 务 器 ) SNMP ( 简 单 网 络 管 理 协 议 ) DHCP ( 动 态 主 机 配 置 协 议 ) PPP ( 点 到 点 协 议 ) ARP ( 地 址 解 析 协 议 ) LwIP 具 有 三 种 应 用 编 程 接 口 (API): Raw API 为 原 始 的 LwIP API 它 通 过 事 件 回 调 机 制 进 行 应 用 开 发 该 API 提 供 了 最 好 的 性 能 和 优 化 的 代 码 长 度, 但 增 加 了 应 用 开 发 的 复 杂 性 Netconn API 为 高 层 有 序 API, 需 要 实 时 操 作 系 统 (RTOS) 的 支 持 ( 提 供 进 程 间 通 讯 的 方 法 ) Netconn API 支 持 多 线 程 工 作 BSD Socket API: 类 似 Berkeley 的 套 接 字 API ( 开 发 于 Netconn API 之 上 ) LwIP 栈 的 源 代 码 可 从 http://savannah.nongnu.org 下 载 2.2 授 权 LwIP 由 BSD 许 可 证 完 成 下 面 是 LwIP 授 权 文 档 副 本, 它 也 包 括 在 源 代 码 中 : /* * 瑞 典 计 算 机 科 学 院 版 权 所 有 (c) 2001-2004 * 保 留 所 有 权 利 * * 若 要 以 源 代 码 或 二 进 制 形 式 对 其 或 使 用, 不 管 修 改 与 否, * 都 必 须 满 足 下 述 条 件 : * * 1. 对 源 代 码 重 新 发 布 时 必 须 保 留 以 上 版 权 说 明 * 此 条 件 列 表 及 下 述 免 责 声 明 DocID025731 Rev 1 7/44 43
LwIP TCP/IP 栈 描 述 * 2. 以 二 进 制 形 式 重 新 发 布 时 必 须 将 以 上 版 权 说 明 * 此 条 件 列 表 及 下 述 免 责 声 明 复 制 到 文 档 * 和 / 或 其 它 一 同 发 布 的 材 料 中 * 3. 未 经 事 先 书 面 允 许, 不 可 使 用 作 者 姓 名 支 持 或 宣 传 * 由 本 软 件 衍 生 的 产 品 * * 此 软 件 由 其 作 者 原 样 提 供, 不 提 供 任 何 明 示 或 暗 示 * 保 证, 包 括 但 不 限 于 对 * 特 定 用 途 的 适 销 性 和 适 用 性 在 任 何 情 况 下, * 作 者 对 任 何 直 接 间 接 附 带 特 殊 * 惩 罚 性 或 后 果 性 损 失 ( 包 括 但 不 限 于, 采 购 * 替 代 商 品 或 服 务 ; 使 用 数 据 或 利 润 损 失 ; 或 业 务 * 中 断 ) 在 任 何 赔 偿 理 论 下, 不 管 是 否 存 在 * 合 同 严 格 责 任, 或 民 事 侵 权 ( 包 括 过 失 或 其 它 ), * 都 不 能 归 咎 于 使 用 此 软 件, 即 使 已 被 告 知 * 此 类 损 害 的 可 能 性 * * 此 文 件 为 lwip TCP/IP 栈 的 一 部 分 * */ 2.3 LwIP 架 构 LwIP 符 合 TCP/IP 模 型 架 构, 规 定 了 数 据 的 格 式 传 输 路 由 和 接 收, 以 实 现 端 到 端 的 通 信 此 模 型 包 括 四 个 抽 象 层, 用 于 根 据 涉 及 的 网 络 范 围, 对 所 有 相 关 协 议 排 序 ( 参 见 图 2) 这 几 层 从 低 到 高 依 次 为 : 链 路 层 包 含 了 局 域 网 的 单 网 段 ( 链 路 ) 通 信 技 术 网 际 层 (IP) 将 独 立 的 网 络 连 接 起 来, 建 立 互 联 传 输 层 处 理 主 机 端 口 到 主 机 端 口 的 通 信 应 用 层 在 实 现 多 个 应 用 进 程 相 互 通 信 的 同 时, 完 成 应 用 所 需 的 服 务 ( 例 如 : 数 据 处 理 ) 8/44 DocID025731 Rev 1
LwIP TCP/IP 栈 描 述 图 2. LwIP 架 构 2.4 LwIP 栈 的 目 录 组 织 解 压 之 后, 可 在 \Middlewares\Third_Party\LwIP 下 看 到 LwIP 栈 文 件 图 3. 图 2 LwIP 目 录 结 构 其 中 doc 包 含 文 档 文 本 文 件 src 包 含 LwIP 栈 的 源 代 码 文 件 api 包 含 Netconn 和 套 接 字 API 文 件 core 包 含 LwIP 内 核 文 件 include 包 含 LwIP 包 含 文 件 netif 包 含 网 络 接 口 文 件 system 包 含 LwIP 端 口 硬 件 实 现 文 件 arch 包 含 STM32 架 构 端 口 文 件 ( 所 用 的 数 据 类 型...) OS 包 含 使 用 操 作 系 统 的 LwIP 端 口 硬 件 实 现 文 件 noos 包 含 独 立 模 式 的 LwIP 端 口 硬 件 实 现 文 件 DocID025731 Rev 1 9/44 43
LwIP TCP/IP 栈 描 述 2.5 LwIP API 概 述 如 上 所 述, LwIP 栈 提 供 了 三 种 API: Raw API Netconn API Socket API 2.5.1 Raw API Raw API 基 于 原 始 LwIP API 它 可 用 于 开 发 基 于 事 件 回 调 机 制 的 应 用 当 初 始 化 应 用 时, 用 户 需 要 为 不 同 内 核 事 件 注 册 所 需 的 回 调 函 数 ( 例 如 TCP_error...) 当 相 应 事 件 发 生 时, LwIP 会 自 发 地 调 用 相 关 的 回 调 函 数 TCP_Sent 表 1 总 结 了 TCP 应 用 的 Raw API 函 数 表 1. TCP Raw API 函 数 API 函 数 说 明 tcp_new 建 立 一 个 新 的 TCP PCB ( 协 议 控 制 块 ) TCP 连 接 建 立 tcp_bind 将 TCP PCB 绑 定 到 本 地 IP 地 址 和 端 口 tcp_listen 启 动 TCP PCB 上 的 监 听 进 程 tcp_accept 注 册 回 调 函 数, 连 接 成 功 建 立 后 调 用 tcp_connect 发 送 连 接 建 立 请 求 tcp_write 将 发 送 数 据 写 入 TCP 缓 冲 区 中 发 送 TCP 数 据 tcp_sent 注 册 回 调 函 数, 数 据 发 送 成 功 后 调 用 tcp_output 发 送 TCP 缓 冲 区 中 的 数 据 接 收 TCP 数 据 tcp_recv 注 册 回 调 函 数, TCP 接 收 到 数 据 后 调 用 应 用 轮 询 tcp_poll 注 册 回 调 函 数, TCP 慢 定 时 器 调 用 (500ms 一 次 ) tcp_close 主 动 关 闭 关 闭 并 终 止 连 接 tcp_err 注 册 回 调 函 数, 出 错 时 调 用 tcp_abort 中 止 连 接, 向 远 程 主 机 发 送 RST 表 2 总 结 了 UDP 应 用 的 Raw API 函 数 10/44 DocID025731 Rev 1
LwIP TCP/IP 栈 描 述 表 2. UDP Raw API 函 数 API 函 数 说 明 udp_new 创 建 新 的 UDP PCB udp_remove 移 除 UDP PCB 并 释 放 相 关 资 源 udp_bind 将 UDP PCB 与 本 地 IP 地 址 和 端 口 绑 定 udp_connect 建 立 UDP PCB 远 程 IP 地 址 和 端 口 udp_disconnect 移 除 UDP PCB 远 程 IP 和 端 口 udp_send 发 送 UDP 数 据 udp_recv 注 册 回 调 函 数, 当 收 到 新 数 据 报 时 即 对 其 调 用 2.5.2 Netconn API Netconn API 为 高 层 有 序 API, 其 执 行 模 型 基 于 典 型 的 阻 塞 式 打 开 - 读 - 写 - 关 闭 机 制 若 要 正 常 工 作, 此 API 必 须 处 于 多 线 程 工 作 模 式, 该 模 式 需 为 LwIP TCP/IP 栈 实 现 专 用 线 程, 并 / 或 为 应 用 实 现 多 个 线 程 表 3 总 结 了 Netconn API 函 数 表 3. Netconn API 函 数 API 函 数 说 明 netconn_new 创 建 一 个 新 连 接 netconn_delete 删 除 一 个 已 有 连 接 netconn_bind 将 连 接 绑 定 到 本 地 IP 地 址 和 端 口 netconn_connect 连 接 远 程 IP 地 址 和 端 口 netconn_send 通 过 UDP 发 送 数 据 netconn_recv 接 收 数 据 netconn_listen 置 TCP netconn 处 于 监 听 模 式 netconn_accept 接 受 正 在 监 听 状 态 的 TCP 连 接 上 的 传 入 连 接 netconn_write 通 过 TCP 数 据 ( 将 数 据 写 入 TCP 缓 冲 区 ) netconn_close 主 动 关 闭 TCP netconn DocID025731 Rev 1 11/44 43
LwIP TCP/IP 栈 描 述 2.5.3 Socket API LwIP 提 供 了 标 准 BSD 套 接 字 API 它 是 有 序 API, 在 内 部 构 建 于 Netconn API 之 上 表 4 总 结 了 主 要 socket API 函 数 表 4. Socket API 函 数 API 函 数 说 明 socket 创 建 一 个 新 套 接 字 bind 将 套 接 字 绑 定 到 IP 地 址 和 端 口 listen 监 听 套 接 字 连 接 connect 将 套 接 字 连 接 到 远 程 主 机 IP 地 址 和 端 口 accept 在 套 接 字 上 接 受 新 连 接 read 从 套 接 字 读 取 数 据 write 向 套 接 字 写 入 数 据 close 关 闭 套 接 字 ( 删 除 套 接 字 ) 2.6 LwIP 缓 冲 管 理 2.6.1 包 缓 冲 结 构 LwIP 使 用 名 为 pbuf 的 数 据 结 构 管 理 包 缓 冲 pbuf 结 构 可 以 通 过 动 态 内 存 申 请 / 释 放 pbuf 为 链 表 结 构, 因 此 数 据 包 可 以 由 多 个 pbuf 组 成 ( 链 表 ) 图 4. Pbuf 结 构 12/44 DocID025731 Rev 1
LwIP TCP/IP 栈 描 述 其 中 next 包 含 了 指 向 pbuf 链 中 下 一 个 pbuf 的 指 针 payload 包 含 了 指 向 包 数 据 载 荷 的 指 针 len 为 pbuf 数 据 内 容 长 度 tot_len 为 pbuf 长 度 与 链 中 后 面 pbuf 的 所 有 len 字 段 之 和 ref 为 4 位 参 考 数, 表 示 指 向 pbuf 的 指 针 数 只 有 pbuf 的 参 考 数 为 0 时, 才 能 将 其 从 内 存 中 释 放 flags (4 位 ) 表 示 pbuf 的 类 型 LwIP 根 据 分 配 类 型, 定 义 了 三 种 pbuf: PBUF_POOL pbuf 动 态 分 配 ( 内 存 池 算 法 ) PBUF_RAM pbuf 动 态 分 配 ( 内 存 堆 算 法 ) PBUF_ROM 不 需 为 用 户 载 荷 分 配 内 存 空 间 :pbuf 载 荷 指 针 指 向 ROM 内 存 中 的 数 据, 仅 能 用 于 发 送 常 量 数 据 对 于 包 的 接 收, 适 合 的 pbuf 类 型 为 PBUF_POOL, 它 允 许 从 pbuf 池 中 为 收 到 的 包 快 速 分 配 内 存 取 决 于 所 收 包 的 大 小, 会 分 配 一 个 或 多 个 链 接 的 pbuf PBUF_RAM 不 适 合 包 接 收, 因 为 此 分 配 算 法 会 造 成 延 时 也 可 能 导 致 内 存 碎 片 对 于 包 的 发 送, 用 户 可 根 据 要 发 送 的 数 据 选 择 最 适 合 的 pbuf 类 型 2.6.2 pbuf 管 理 API LwIP 有 专 门 的 API 可 与 pbuf 共 同 使 用 该 API 实 现 于 pbuf.c 内 核 文 件 中 表 5. Pbuf API 函 数 API 函 数 说 明 pbuf_alloc 分 配 新 的 pbuf pbuf_realloc 改 变 pbuf 大 小 ( 只 能 缩 小 ) pbuf_ref 增 加 pbuf 的 参 考 数 字 段 pbuf_free 释 放 pbuf pbuf_clen 返 回 pbuf 链 中 的 pbuf 数 目 pbuf_cat 将 两 个 pbuf 链 接 在 一 起 ( 但 不 会 更 改 末 尾 pbuf 链 的 参 考 数 ) pbuf_chain 将 两 个 pbuf 链 接 在 一 起 ( 增 加 尾 链 的 参 考 数 ) DocID025731 Rev 1 13/44 43
LwIP TCP/IP 栈 描 述 表 5. Pbuf API 函 数 ( 续 ) API 函 数 说 明 pbuf_dechain 将 第 一 个 pbuf 与 链 中 后 续 的 pbuf 断 开 链 接 pbuf_header 调 整 载 荷 指 针, 隐 藏 或 显 示 载 荷 中 的 头 pbuf_copy_partial 将 ( 部 分 ) 包 缓 冲 内 容 复 制 到 应 用 提 供 的 缓 冲 pbuf_take 将 应 用 提 供 的 数 据 复 制 到 pbuf 中 pbuf_coalesce 从 一 个 pbuf 队 列 中 创 建 单 个 pbuf pbuf_memcmp 将 指 定 偏 移 处 的 pbuf 内 容 与 其 它 内 存 比 较 pbuf_memfind 从 某 偏 移 开 始, 在 pbuf 中 查 找 某 内 存 pbuf_strstr 从 某 偏 移 开 始, 在 pbuf 中 查 找 某 字 符 串 注 : pbuf 可 为 单 个 pbuf 或 pbuf 链 当 使 用 Netconn API 时, 则 使 用 netbuf ( 网 络 缓 冲 ) 发 送 / 接 收 数 据 netbuf 只 是 pbuf 结 构 的 封 装 它 可 容 纳 分 配 的 或 引 用 的 数 据 提 供 了 专 用 API ( 在 文 件 netbuf.c 中 实 现 ) 以 管 理 netbuf ( 分 配 释 放 链 接 解 压 数 据...) 14/44 DocID025731 Rev 1
LwIP 与 STM32Cube 以 太 网 HAL 驱 动 之 间 的 接 口 3 LwIP 与 STM32Cube 以 太 网 HAL 驱 动 之 间 的 接 口 此 软 件 包 包 含 两 个 实 现 : 无 操 作 系 统 时 的 实 现 ( 独 立 ) 有 操 作 系 统 时 使 用 CMSIS-RTOS API 的 实 现 对 于 两 种 实 现, 将 LwIP 移 植 至 STM32F4xx/STM32F2x7xx 的 接 口 文 件 都 位 于 lwip/system 目 录 下 具 体 的 驱 动 程 序 通 过 ethernetif.c 文 件 来 实 现 HAL 的 以 太 网 处 理 句 柄 (ETH_HandleTypeDef) 以 及 以 太 网 DMA 描 述 符 (ETH_DMADescTypeDef) 和 以 太 网 驱 动 的 Rx/Tx 缓 冲 区 应 在 ethernetif.c 文 件 中 声 明 表 6 提 供 了 LwIP 接 口 API 的 说 明 表 6. 以 太 网 接 口 函 数 说 明 函 数 说 明 low_level_init low_level_output low_level_input ethernetif_init ethernet_input 调 用 以 太 网 驱 动 函 数, 初 始 化 STM32F4xx 和 STM32F2x7xx 以 太 网 外 设 调 用 以 太 网 驱 动 函 数 以 发 送 以 太 网 包 调 用 以 太 网 驱 动 函 数 以 接 收 以 太 网 包 初 始 化 网 络 接 口 结 构 (netif) 并 调 用 low_level_init 以 初 始 化 以 太 网 外 设 调 用 low_level_input 接 收 包, 然 后 将 其 提 供 给 LwIP 栈 下 面 的 例 子 展 示 了 怎 样 初 始 化 以 太 网 外 设, 它 使 用 HAL API, 进 入 接 口 API: static void low_level_init(struct netif *netif) { uint8_t macaddress[6]= {MAC_ADDR0, MAC_ADDR1, MAC_ADDR2, MAC_ADDR3, MAC_ADDR4, MAC_ADDR5}; EthHandle.Instance = ETH; EthHandle.Init.MACAddr = macaddress; EthHandle.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE; EthHandle.Init.Speed = ETH_SPEED_100M; EthHandle.Init.DuplexMode = ETH_MODE_FULLDUPLEX; EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_MII; EthHandle.Init.RxMode = ETH_RXINTERRUPT_MODE; EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE; EthHandle.Init.PhyAddress = DP83848_PHY_ADDRESS; DocID025731 Rev 1 15/44 43
LwIP 与 STM32Cube 以 太 网 HAL 驱 动 之 间 的 接 口 /* 配 置 以 太 网 外 设 (GPIO 时 钟 MAC DMA) */ HAL_ETH_Init(&EthHandle) ; /* 初 始 化 Tx 描 述 符 列 表 : 链 接 模 式 */ HAL_ETH_DMATxDescListInit(&EthHandle, DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB); /* 初 始 化 Rx 描 述 符 列 表 : 链 接 模 式 */ HAL_ETH_DMARxDescListInit(&EthHandle, DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);... /* 使 能 MAC 和 DMA 发 送 和 接 收 */ HAL_ETH_Start(&EthHandle); } ethernet_input() 函 数 的 实 现 在 独 立 模 式 和 RTOS 模 式 时 是 不 同 的 : 在 独 立 应 用 中, 此 函 数 必 须 被 插 入 到 应 用 的 主 循 环 中, 以 便 轮 询 任 何 收 到 的 包 在 RTOS 应 用 中, 此 函 数 为 一 个 阻 塞 线 程, 当 得 到 所 等 待 的 信 号 量 时 才 处 理 收 到 的 数 据 包 当 以 太 网 外 设 收 到 数 据 并 生 成 中 断 时, 给 出 此 信 号 量 ethernetif.c 文 件 还 为 底 层 初 始 化 (GPIO CLK ) 实 现 了 以 太 网 外 设 MSP(MCU Support Package) 程 序 和 中 断 回 调 函 数 对 于 RTOS 实 现, 还 需 使 用 其 它 文 件 (sys_arch.c) 此 文 件 为 RTOS 服 务 实 现 了 仿 真 层 ( 共 享 内 存 的 访 问, 信 号 量, 邮 箱 ) 此 文 件 应 根 据 所 使 用 的 RTOS 调 整, 对 于 本 软 件 包 来 说 为 FreeRTOS 16/44 DocID025731 Rev 1
LwIP 配 置 4 LwIP 配 置 LwIP 提 供 了 名 为 lwipopts.h 的 文 件, 它 允 许 用 户 充 分 配 置 栈 及 其 所 有 模 块 用 户 不 需 要 定 义 所 有 LwIP 选 项 : 如 果 未 定 义 某 选 项, 则 使 用 opt.h 文 件 中 定 义 的 默 认 值 因 此, lwipopts.h 提 供 了 覆 盖 许 多 lwip 行 为 的 方 法 4.1 模 块 支 持 用 户 可 为 其 应 用 选 择 他 所 需 的 模 块, 通 过 仅 编 译 选 定 的 特 性 优 化 了 代 码 长 度 例 如, 若 需 要 禁 用 UDP 或 者 启 用 DHCP ( 基 于 UDP 实 现 ), 在 lwipopts.h 文 件 中 分 别 需 进 行 以 下 定 义 : /* 禁 用 UDP */ #define LWIP_UDP 0 /* 启 用 DHCP */ #define LWIP_DHCP 1 4.2 内 存 配 置 LwIP 提 供 了 一 种 灵 活 的 方 法 管 理 内 存 池 的 大 小 和 组 织 它 在 数 据 段 中 保 留 了 一 个 固 定 大 小 的 静 态 内 存 区 它 细 分 为 不 同 的 池, 而 lwip 将 其 用 于 不 同 的 数 据 结 构 例 如, 有 一 个 tcp_pcb 结 构 体 的 池, 还 有 一 个 udp_pcb 结 构 体 的 池 每 个 池 都 可 配 置 为 容 纳 固 定 数 目 的 数 据 结 构 该 数 目 可 在 lwipopts.h 文 件 中 更 改 例 如, MEMP_NUM_TCP_PCB 和 MEMP_NUM_UDP_PCB 定 义 了 在 某 一 时 间 系 统 中 可 激 活 的 tcp_pcb 和 udb_pcb 结 构 的 最 大 数 目 用 户 选 项 可 在 lwipopts.h 中 更 改 表 7 总 结 了 主 要 RAM 内 存 选 项 表 7. LwIP 内 存 配 置 LwIP 内 存 选 项 定 义 MEM_SIZE LwIP 堆 内 存 大 小 : 用 于 所 有 LwIP 动 态 内 存 分 配 MEMP_NUM_PBUF MEM_REF 和 MEM_ROM pbuf 总 数 MEMP_NUM_UDP_PCB UDP PCB 结 构 体 的 总 数 MEMP_NUM_TCP_PCB TCP PCB 结 构 体 的 总 数 MEMP_NUM_TCP_PCB_LISTEN 处 于 监 听 状 态 的 TCP PCB 总 数 MEMP_NUM_TCP_SEG 同 时 在 队 列 中 的 TCP 段 的 最 大 数 目 PBUF_POOL_SIZE PBUF_POOL 类 型 的 pbuf 总 数 DocID025731 Rev 1 17/44 43
LwIP 配 置 表 7. LwIP 内 存 配 置 ( 续 ) LwIP 内 存 选 项 定 义 PBUF_POOL_BUFSIZE PBUF_POOL 类 型 pbuf 的 大 小 TCP_MSS TCP 最 大 段 的 大 小 TCP_SND_BUF 对 于 一 个 连 接, TCP 的 发 送 缓 冲 空 间 TCP_SND_QUEUELEN TCP 发 送 队 列 中 pbuf 的 最 大 数 TCP_WND 声 明 的 TCP 接 收 窗 大 小 18/44 DocID025731 Rev 1
使 用 LwIP 栈 开 发 应 用 5 使 用 LwIP 栈 开 发 应 用 5.1 使 用 Raw API 在 独 立 模 式 中 开 发 5.1.1 工 作 模 型 在 独 立 模 式 中, 工 作 模 型 基 于 轮 询 模 式 不 停 地 检 查 是 否 收 到 了 数 据 包 当 收 到 包 时, 首 先 要 将 数 据 包 从 以 太 网 接 收 缓 冲 区 中 拷 贝 到 LwIP 的 协 议 栈 缓 冲 区 为 了 更 快 的 完 成 数 据 包 的 拷 贝, 应 该 从 缓 冲 池 (PBUF_POOL) 分 配 LwIP 缓 冲 (pbuf) 拷 贝 完 成 后, LwIP 会 对 数 据 包 进 行 处 理 栈 根 据 所 收 到 的 包 确 定 是 否 通 知 应 用 层 LwIP 使 用 事 件 回 调 机 制 与 应 用 层 通 信 因 此, 应 在 进 行 通 信 之 前, 为 相 关 事 件 注 册 回 调 函 数 请 参 考 图 5 中 的 独 立 工 作 模 型 流 图 说 明 图 5. 独 立 工 作 模 型 DocID025731 Rev 1 19/44 43
使 用 LwIP 栈 开 发 应 用 对 于 TCP 应 用, 必 须 注 册 以 下 回 调 函 数 : TCP 连 接 建 立 时 触 发, 通 过 TCP_accept API 注 册 接 收 到 TCP 数 据 包 时 触 发, 通 过 TCP_recev API 注 册 数 据 成 功 发 送 后 触 发, 通 过 TCP_sent API 注 册 TCP 出 错 时 触 发 ( 在 TCP 中 止 事 件 之 后 ), 通 过 TCP_err API 注 册 周 期 性 触 发 (1s 2 次 ), 用 于 轮 询 应 用, 通 过 TCP_poll API 注 册 5.1.2 TCP 回 响 服 务 器 演 示 举 例 TCP 回 响 服 务 器 示 例 在 目 录 \LwIP\LwIP_TCP_Echo_Server 中, 它 是 一 个 TCP 服 务 器 的 简 单 应 用, 可 对 从 远 程 客 户 端 收 到 的 任 何 TCP 数 据 包 做 出 回 响 下 面 的 例 子 提 供 了 固 件 结 构 的 说 明 以 下 内 容 节 选 自 main.c 文 件 int main(void) { /* 复 位 所 有 外 设, 初 始 化 Flash 接 口 和 Systick */ HAL_Init();... /* 初 始 化 LwIP 栈 */ lwip_init(); /* 网 络 接 口 配 置 */ Netif_Config();... /* tcp 回 响 服 务 器 初 始 化 */ tcp_echoserver_init(); /* 无 限 循 环 */ while (1) { /* 从 以 太 网 缓 冲 区 中 读 取 数 据 包, 交 给 LwIP 处 理 */ ethernetif_input(&gnetif); /* 处 理 LwIP 超 时 */ sys_check_timeouts(); } } 20/44 DocID025731 Rev 1
使 用 LwIP 栈 开 发 应 用 其 中 调 用 了 下 列 函 数 : 1. HAL_Init 函 数 调 用 的 目 的 是 复 位 所 有 外 设, 并 初 始 化 Flash 接 口 和 Systick 定 时 器 2. lwip_init 函 数 调 用 的 目 的 是 初 始 化 LwIP 栈 内 部 结 构 体, 并 开 始 栈 操 作 3. Netif_config 函 数 调 用 的 目 的 是 配 置 网 络 接 口 (netif) 4. tcp_echoserver_init 函 数 调 用 的 目 的 是 初 始 化 TCP 回 响 服 务 器 应 用 5. 在 无 限 while 循 环 中 的 ethernetif_input 函 数 轮 询 包 的 接 收 当 收 到 包 时, 将 包 传 给 栈 处 理 6. sys_check_timeouts LwIP 函 数 调 用 的 目 的 是 处 理 某 些 LwIP 内 部 周 期 性 任 务 ( 协 议 定 时 器 TCP 包 的 重 传...) tcp_echoserver_init 函 数 描 述 tcp_echoserver_init 函 数 代 码 如 下 : void tcp_echoserver_init(void) { /* 创 建 新 的 tcp pcb */ tcp_echoserver_pcb = tcp_new(); if (tcp_echoserver_pcb!= NULL) { err_t err; /* 将 echo_pcb 绑 定 到 端 口 7 (ECHO 协 议 ) */ err = tcp_bind(tcp_echoserver_pcb, IP_ADDR_ANY, 7); if (err == ERR_OK) { /* echo_pcb 开 始 tcp 监 听 */ tcp_echoserver_pcb = tcp_listen(tcp_echoserver_pcb); } } /* 注 册 LwIP tcp_accept 回 调 函 数 */ tcp_accept(tcp_echoserver_pcb, tcp_echoserver_accept); } else { /* 释 放 echo_pcb */ memp_free(memp_tcp_pcb, tcp_echoserver_pcb); } LwIP API 调 用 tcp_new 来 分 配 一 个 新 的 TCP 协 议 控 制 块 (PCB)(tcp_echoserver_pcb) 使 用 tcp_bind 函 数, 将 分 配 的 TCP PCB 绑 定 到 本 地 IP 地 址 和 端 口 绑 定 TCP PCB 之 后, 会 调 用 tcp_listen 函 数 以 在 TCP PCB 上 开 始 TCP 监 听 进 程 DocID025731 Rev 1 21/44 43
使 用 LwIP 栈 开 发 应 用 最 后, 应 给 tcp_echoserver_accept 回 调 函 数 赋 值, 以 处 理 TCP PCB 上 传 入 的 TCP 连 接, 这 通 过 使 用 tcp_accept LwIP API 函 数 完 成 从 这 点 开 始, TCP 服 务 器 已 经 准 备 好 接 收 任 何 来 自 远 程 客 户 端 的 连 接 tcp_echoserver_accept 函 数 描 述 下 面 的 例 子 展 示 了 怎 样 使 用 tcp_echoserver_accept 用 户 回 调 函 数, 处 理 传 入 的 TCP 连 接 以 下 内 容 节 选 自 该 函 数 static err_t tcp_echoserver_accept(void *arg, struct tcp_pcb *newpcb, err_t err) {... /* 分 配 结 构 体 es 以 保 存 tcp 连 接 信 息 */ es = (struct tcp_echoserver_struct *)mem_malloc(sizeof(struct tcp_echoserver_struct)); if (es!= NULL) { es->state = ES_ACCEPTED; es->pcb = newpcb; es->p = NULL; /* 将 新 分 配 的 es 结 构 体 作 为 参 数 传 给 newpcb */ tcp_arg(newpcb, es); /* 为 newpcb 注 册 lwip tcp_recv 回 调 函 数 */ tcp_recv(newpcb, tcp_echoserver_recv); /* 为 newpcb 注 册 lwip tcp_err 回 调 函 数 */ tcp_err(newpcb, tcp_echoserver_error); /* 为 newpcb 注 册 lwip tcp_poll 回 调 函 数 */ tcp_poll(newpcb, tcp_echoserver_poll, 1); ret_err = ERR_OK;... } 22/44 DocID025731 Rev 1
使 用 LwIP 栈 开 发 应 用 其 中 调 用 了 下 列 函 数 : 1. 通 过 newpcb 参 数, 将 新 的 TCP 连 接 传 给 tcp_echoserver_accept 回 调 函 数 2. es 结 构 体 被 用 来 存 储 应 用 状 态 通 过 调 用 tcp_arg LwIP API, 将 它 作 为 一 个 参 数 传 给 TCP PCB newpcb 连 接 3. 通 过 调 用 LwIP API tcp_recv, 为 TCP 接 收 回 调 函 数 tcp_echoserver_recv 赋 值 此 回 调 处 理 远 程 客 户 端 的 所 有 数 据 流 4. 通 过 调 用 LwIP API tcp_err, 为 TCP 错 误 回 调 函 数 tcp_echoserver_error 赋 值 此 回 调 处 理 TCP 错 误 5. 通 过 调 用 LwIP API tcp_poll, 为 TCP 轮 询 回 调 函 数 tcp_echoserver_poll 赋 值, 以 处 理 周 期 性 的 应 用 任 务 ( 例 如 检 查 是 否 还 有 应 用 数 据 要 发 送 ) 5.2 使 用 Netconn 或 Socket API 基 于 RTOS 开 发 5.2.1 工 作 模 型 使 用 RTOS 的 工 作 模 型 有 如 下 特 点 : TCP/IP 栈 和 应 用 运 行 在 不 同 的 线 程 中 应 用 通 过 有 序 API 调 用 与 栈 通 信, 它 使 用 RTOS 邮 箱 机 制 进 行 进 程 间 通 信 API 调 用 为 阻 塞 调 用 这 意 味 着 在 从 栈 收 到 响 应 之 前, 应 用 线 程 阻 塞 使 用 另 外 一 个 线 程 网 络 接 口 线 程 用 于 将 驱 动 缓 冲 区 收 到 的 数 据 包 拷 贝 至 LwIP 协 议 栈 缓 冲 区 此 进 程 由 以 太 网 接 收 中 断 所 释 放 的 信 号 量 唤 醒 请 参 考 图 6 中 使 用 RTOS 时 的 lwip 工 作 模 型 流 程 图 说 明 图 6. 使 用 RTOS 时 的 lwip 工 作 模 型 DocID025731 Rev 1 23/44 43
使 用 LwIP 栈 开 发 应 用 5.2.2 使 用 Netconn API 的 TCP 回 响 服 务 器 演 示 举 例 从 应 用 的 角 度 来 看,Netconn API 提 供 了 一 种 比 raw API 更 简 单 的 方 法 来 开 发 TCP/IP 应 用 这 是 因 为 它 有 一 个 更 加 直 观 的 有 序 API 下 面 的 例 子 显 示 了 使 用 Netconn API 开 发 的 TCP 回 响 服 务 器 应 用 以 下 内 容 节 选 自 main.c 文 件 int main(void) {... /* 创 建 并 开 始 线 程 */ osthreaddef(start, StartThread, osprioritynormal, 0, configminimal_stack_size * 2); osthreadcreate (osthread(start), NULL); /* 开 始 调 度 器 */ oskernelstart (NULL, NULL); /* 程 序 不 应 该 运 行 到 这 里, 因 为 现 在 调 度 器 在 控 制 */ for( ;; ); } 开 始 线 程 有 如 下 代 码 : static void StartThread(void const * argument) {... /* 创 建 tcp_ip 栈 线 程 */ tcpip_init( NULL, NULL ); /* 网 络 接 口 配 置 */ Netif_Config(); /* 初 始 化 tcp 回 响 服 务 器 */ tcpecho_init(); } for( ;; ) { } 其 中 调 用 了 下 列 函 数 : 1. 调 用 了 tcpip_init 函 数, 对 LwIP 栈 模 块 初 始 化 并 开 始 TCP/IP 栈 线 程 2. Netif_config 函 数 调 用 的 目 的 是 配 置 网 络 接 口 (netif) 3. TCP 回 响 服 务 器 线 程 在 tcpecho_init 函 数 中 创 建 24/44 DocID025731 Rev 1
使 用 LwIP 栈 开 发 应 用 void tcpecho_init(void) { sys_thread_new("tcpecho_thread", tcpecho_thread, NULL, DEFAULT_THREAD_STACKSIZE, TCPECHO_THREAD_PRIO); } tcpecho_thread 函 数 说 明 TCP 回 响 服 务 器 线 程 有 如 下 代 码 : static void tcpecho_thread(void *arg) { /* 创 建 一 个 新 连 接 标 识 符 */ conn = netconn_new(netconn_tcp); if (conn!=null) { /* 将 连 接 绑 定 至 已 知 的 端 口 号 7 */ err = netconn_bind(conn, NULL, 7); if (err == ERR_OK) { /* 告 知 连 接 进 入 监 听 模 式 */ netconn_listen(conn); while (1) { /* 抓 取 新 连 接 */ accept_err = netconn_accept(conn, &newconn); /* 处 理 新 连 接 */ if (accept_err == ERR_OK) { while (( recv_err = netconn_recv(newconn, &buf)) == ERR_OK) { do { netbuf_data(buf, &data, &len); netconn_write(newconn, data, len, NETCONN_COPY); } while (netbuf_next(buf) >= 0); netbuf_delete(buf); } /* 关 闭 连 接, 丢 弃 连 接 标 识 符 */ netconn_close(newconn); netconn_delete(newconn); DocID025731 Rev 1 25/44 43
使 用 LwIP 栈 开 发 应 用 } } } } } else { netconn_delete(newconn); } 其 中 执 行 了 下 述 序 列 : 1. 调 用 了 Netconn_new API 函 数, 参 数 NETCONN_TCP 将 创 建 一 个 新 TCP 连 接 2. 之 后, 将 新 创 建 的 连 接 绑 定 到 端 口 7 ( 回 响 协 议 ), 方 法 是 调 用 Netconn_bind API 函 数 3. 绑 定 连 接 之 后, 通 过 调 用 Netconn_listen API 函 数, 应 用 开 始 监 听 连 接 4. 在 无 限 while(1) 循 环 中, 通 过 调 用 API 函 数 Netconn_accept, 应 用 等 待 一 个 新 连 接 当 没 有 传 入 的 连 接 时, 进 程 被 阻 塞 5. 当 有 传 入 的 连 接 时, 通 过 调 用 netconn_recv API 函 数, 应 用 可 开 始 接 收 数 据 传 入 的 数 据 接 收 在 netbuf 中 6. 应 用 可 通 过 调 用 netbuf_data netbuf API 函 数 得 到 接 收 的 数 据 7. 通 过 调 用 Netconn_write API 函 数, 将 接 收 的 数 据 发 送 回 ( 回 响 ) 远 程 TCP 客 户 端 8. Netconn_close 和 Netconn_delete 分 别 用 于 关 闭 和 删 除 Netconn 连 接 26/44 DocID025731 Rev 1
LwIP 包 描 述 6 LwIP 包 描 述 6.1 LwIP 包 目 录 该 包 包 含 了 一 组 应 用, 运 行 于 LwIP 栈 STM32Cube HAL 和 BSP 驱 动 之 上 固 件 包 含 下 列 模 块 : 驱 动 : 包 含 STM32F4xx/STM32F2x7xx 微 控 制 器 的 底 层 驱 动 CMSIS BSP 驱 动 器 HAL 驱 动 器 中 间 件 : 包 含 库 和 协 议 组 件 LwIP TCP/IP 栈 FatFS FreeRTOS 项 目 : 包 含 源 文 件 和 每 个 应 用 的 配 置 应 用 位 于 项 目 库 的 此 路 径 之 下 :Projects\STM322xx_EVAL\LwIP\ Projects\STM324xx_EVAL\LwIP\ 和 6.2 应 用 设 置 6.2.1 PHY 接 口 配 置 以 太 网 外 设 与 外 部 PHY 接 口, 提 供 物 理 层 通 信 PHY 寄 存 器 定 义 和 定 义 语 句 位 于 HAL 配 置 文 件 stm32f4xx_hal_conf.h 中 PHY 可 工 作 于 MII 或 RMII 模 式 若 要 选 择 所 需 的 模 式, 请 在 初 始 化 以 太 网 外 设 时 在 Init 结 构 体 中 填 入 MediaInterface 参 数 注 : 当 使 用 STM324x9I-EVAL 板 时, 不 支 持 RMII 模 式 当 使 用 STM324xG-EVAL 板 工 作 于 RMII 模 式 时, 用 户 必 须 提 供 50 MHz 时 钟, 方 法 是 在 CN3 下 的 U3 尺 寸 上, 从 JP5 移 除 跳 线, 焊 接 一 个 50 MHz 振 荡 器 ( 参 考 SM7745HEV- 50.0M 或 同 类 器 件 ) 该 振 荡 器 不 随 板 提 供 6.2.2 MAC 和 IP 地 址 设 置 默 认 MAC 地 址 设 为 00:00:00:00:00:02 若 要 更 改 此 地 址, 请 修 改 stm32f4xx_hal_conf.h 文 件 中 定 义 的 六 个 字 节 默 认 IP 地 址 设 为 :192.168.0.10 若 要 修 改 此 地 址, 请 修 改 main.h 文 件 中 定 义 的 四 个 字 节 DocID025731 Rev 1 27/44 43
LwIP 包 描 述 6.2.3 固 件 特 性 此 软 件 还 具 备 一 些 扩 展 模 块 支 持 DHCP 协 议, 因 此 当 STM32 MCU 连 接 到 DHCP 服 务 器 时, 它 可 作 为 DHCP 客 户 端 得 到 动 态 IP 地 址 若 要 启 用 DHCP 协 议, 请 取 消 下 面 宏 定 义 的 注 释 : #define USE_DHCP from main.h file. 注 : 如 果 配 置 为 通 过 DHCP 获 取 IP 地 址, 但 应 用 无 法 在 它 已 经 连 接 到 的 网 络 上 发 现 DHCP 服 务 器, 则 IP 地 址 会 自 动 设 为 静 态 地 址 (192.168.0.10) 用 户 可 通 过 在 main.h 中 定 义 宏 #define USE_LCD, 启 用 LCD 控 制 器 如 果 启 用, 将 显 示 文 本 消 息 告 知 用 户 应 用 的 状 态 ( 分 配 的 IP 地 址 网 络 链 路 状 态...) 注 : 入 门 级 的 应 用 不 支 持 DHCP 或 LCD 模 块 更 多 信 息, 请 参 见 第 7 章 节 : 使 用 LwIP 应 用 6.3 评 估 板 设 置 6.3.1 STM324x9I-EVAL 设 置 若 需 在 STM324x9I-EVAL 板 上 运 行 软 件, 请 如 表 8 中 所 示 配 置 表 8. STM324x9I-EVAL 跳 线 配 置 跳 线 JP6 MII 模 式 配 置 1-2: 由 外 部 晶 振 提 供 25 MHz 时 钟 2-3: 由 PA8 处 的 MCO 提 供 25 MHz 时 钟 6.3.2 STM324xG-EVAL 设 置 若 需 在 STM324xG-EVAL 板 上 运 行 软 件, 请 如 表 9 中 所 示 配 置 表 9. STM324xG-EVAL 跳 线 配 置 跳 线 MII 模 式 配 置 RMII 模 式 配 置 JP5 1-2: 由 外 部 晶 振 提 供 25 MHz 时 钟 2-3: 由 PA8 处 的 MCO 提 供 25 MHz 时 钟 不 适 用 JP6 2-3: 启 用 MII 接 口 模 式 1-2: 启 用 RMII 接 口 模 式 JP8 开 启 :MII 接 口 模 式 被 选 中 关 闭 :RMII 接 口 模 式 被 选 中 28/44 DocID025731 Rev 1
LwIP 包 描 述 6.3.3 STM3222xG-EVAL 设 置 若 需 在 STM322xG-EVAL 板 上 运 行 软 件, 请 如 表 10 中 所 示 配 置 表 10. STM322xG-EVAL 跳 线 配 置 跳 线 MII 模 式 配 置 RMII 模 式 配 置 JP5 1-2: 由 外 部 晶 振 提 供 25 MHz 时 钟 2-3: 由 PA8 处 的 MCO 提 供 25 MHz 时 钟 不 适 用 JP6 2-3: 启 用 MII 接 口 模 式 1-2: 启 用 RMII 接 口 模 式 JP8 开 启 :MII 接 口 模 式 被 选 中 关 闭 :RMII 接 口 模 式 被 选 中 DocID025731 Rev 1 29/44 43
使 用 LwIP 应 用 7 使 用 LwIP 应 用 STM32Cube LwIP 包 带 有 多 个 应 用, 使 用 了 不 同 LwIP 栈 的 API 集 如 表 11 中 所 示, 这 些 应 用 分 为 三 类 表 11. LwIP 应 用 分 类 分 类 应 用 TCP 回 响 客 户 端 TCP 回 响 服 务 器 入 门 级 ( 基 础 ) UDP 回 响 客 户 端 UDP 回 响 服 务 器 TCP 和 UDP 回 响 服 务 器 (Netconn API) HTTP 服 务 器 (Raw API) 特 性 HTTP 服 务 器 (Netconn API) HTTP 服 务 器 (Socket API) 集 成 TFTP 服 务 器 入 门 级 应 用 使 用 最 低 的 配 置, 在 LwIP 栈 之 上 运 行 应 用 使 用 LED 通 知 用 户 应 用 状 态 特 性 级 应 用 提 供 更 多 的 灵 活 性 和 选 项 它 们 支 持 HTTP DHCP 等 网 络 协 议, 使 用 LCD 消 息 指 示 应 用 状 态 集 成 级 应 用 支 持 FatFS 中 间 件 组 件 和 TFTP 协 议, 以 在 评 估 板 上 的 microsd 卡 上 收 发 文 件 7.1 入 门 级 应 用 7.1.1 TCP 回 响 客 户 端 此 应 用 的 作 用 是 测 试 基 本 的 TCP 连 接 STM32 MCU 作 为 TCP 客 户 端, 连 接 到 TCP 服 务 器 客 户 端 发 送 字 符 串, 服 务 器 将 同 样 的 字 符 串 回 响 给 客 户 端 若 需 测 试 TCP 回 响 客 户 端 应 用, 请 遵 循 如 下 步 骤 : 1. 确 认 STM324xx-EVAL/STM322xG-EVAL 跳 线 设 置 正 确 2. 生 成 演 示 代 码 并 编 程 到 STM32F4xx/STM32F2x7xx 闪 存 LED 指 示 了 LwIP 初 始 化 是 成 功 还 是 失 败 ( 此 应 用 不 支 持 动 态 地 址 分 配 DHCP ) 3. 在 远 程 PC 上, 打 开 命 令 行 提 示 窗 口 在 Windows 中, 选 择 开 始 > 所 有 程 序 > 附 件 > 命 令 行 提 示 30/44 DocID025731 Rev 1
使 用 LwIP 应 用 4. 在 命 令 行 提 示, 输 入 : C:\>echotool /p tcp /s 其 中 : /p tcp 为 TCP 协 议 (TCP 协 议 ) /s 为 连 接 的 实 际 模 式 ( 服 务 器 模 式 ) 5. 当 按 下 STM324xx-EVAL/STM322xG-EVAL 板 上 的 Key 按 键 时, 客 户 端 会 发 送 字 符 串, 服 务 器 将 相 同 的 字 符 串 回 响 给 客 户 端 注 : 请 确 认 远 程 PC IP 地 址 与 main.h 文 件 中 定 义 的 相 同 ( 默 认 为 192.168.0.11) 图 7 显 示 了 此 命 令 字 符 串 和 模 块 响 应 的 例 子 图 7. TCP 回 响 客 户 端 7.1.2 TCP 回 响 服 务 器 此 应 用 的 作 用 是 测 试 基 本 的 TCP 连 接 STM32 MCU 作 为 TCP 服 务 器, 等 待 客 户 端 请 求 它 仅 回 响 发 出 的 内 容 若 需 测 试 TCP 回 响 服 务 器 演 示 程 序, 请 遵 循 如 下 步 骤 : 1. 确 认 STM324xx-EVAL/STM322xG-EVAL 跳 线 设 置 正 确 2. 生 成 演 示 代 码 并 编 程 到 STM32F4xx/STM32F2x7xx 闪 存 LED 指 示 了 LwIP 初 始 化 是 成 功 还 是 失 败 ( 此 应 用 不 支 持 动 态 地 址 分 配 DHCP ) 3. 在 远 程 PC 上, 打 开 命 令 行 提 示 窗 口 对 于 Windows, 选 择 开 始 > 所 有 程 序 > 附 件 > 命 令 行 提 示 DocID025731 Rev 1 31/44 43
使 用 LwIP 应 用 4. 在 命 令 行 提 示, 输 入 : C:\>echotool IP_address /p tcp /r 7 /n 15 /t 2 /d Testing LwIP TCP echo server 其 中 : IP_address 为 实 际 板 子 的 IP 地 址 默 认 情 况 下, 会 使 用 静 态 IP 地 址 : 192.168.0.10 /p tcp 为 协 议 (TCP 协 议 ) /r 为 回 响 服 务 器 的 实 际 远 程 端 口 ( 回 响 端 口 ) /n 为 回 响 请 求 的 数 目 ( 例 如, 15) /t 为 连 接 超 时 时 间, 单 位 为 秒 ( 例 如, 2) /d 为 要 为 回 响 发 送 的 消 息 ( 例 如, Testing LwIP TCP echo server ) 图 8 显 示 了 此 命 令 字 符 串 和 模 块 响 应 的 例 子 图 8. TCP 回 响 服 务 器 注 : 提 供 的 统 计 指 标 为 测 试 结 束 时 收 到 的 和 毁 坏 的 包 数 7.1.3 UDP 回 响 客 户 端 此 应 用 的 作 用 是 测 试 基 本 的 UDP 回 响 连 接 STM32 MCU 作 为 UDP 客 户 端, 连 接 到 UDP 服 务 器 若 需 测 试 UDP 回 响 客 户 端 演 示 程 序, 请 遵 循 如 下 步 骤 : 1. 确 认 STM324xx-EVAL/STM322xG-EVAL 跳 线 设 置 正 确 2. 生 成 演 示 代 码 并 编 程 到 STM32F4xx/STM32F2x7xx 闪 存 LED 指 示 了 LwIP 初 始 化 是 成 功 还 是 失 败 ( 此 应 用 不 支 持 动 态 地 址 分 配 DHCP ) 3. 在 远 程 PC 上, 打 开 命 令 行 提 示 窗 口 对 于 Windows, 选 择 开 始 > 所 有 程 序 > 附 件 > 命 令 行 提 示 4. 在 命 令 行 提 示, 输 入 : 32/44 DocID025731 Rev 1
使 用 LwIP 应 用 C:\>echotool /p udp /s 其 中 : /p udp 为 协 议 (UDP 协 议 ) /s 为 连 接 的 实 际 模 式 ( 服 务 器 模 式 ) 5. 当 按 下 STM324xx-EVAL/STM322xG-EVAL 板 上 的 Key 按 键 时, 客 户 端 会 发 送 字 符 串, 服 务 器 将 相 同 的 字 符 串 回 响 给 客 户 端 注 : 请 确 认 远 程 PC IP 地 址 与 main.h 文 件 中 定 义 的 相 同 ( 默 认 为 192.168.0.11) 图 9 显 示 了 此 命 令 字 符 串 和 模 块 响 应 的 例 子 图 9. UDP 回 响 客 户 端 7.1.4 UDP 回 响 服 务 器 此 应 用 的 作 用 是 测 试 基 本 的 UDP 连 接 STM32 MCU 作 为 UDP 服 务 器, 等 待 客 户 端 请 求 若 需 测 试 UDP 回 响 服 务 器 应 用, 请 遵 循 如 下 步 骤 : 1. 确 认 STM324xx-EVAL/STM322xG-EVAL 跳 线 设 置 正 确 2. 生 成 演 示 代 码 并 编 程 到 STM32F4xx/STM32F2x7xx 闪 存 LED 指 示 了 LwIP 初 始 化 是 成 功 还 是 失 败 ( 此 应 用 不 支 持 动 态 地 址 分 配 DHCP ) 3. 在 远 程 PC 上, 打 开 命 令 行 提 示 窗 口 对 于 Windows, 选 择 开 始 > 所 有 程 序 > 附 件 > 命 令 行 提 示 4. 在 命 令 行 提 示, 输 入 : DocID025731 Rev 1 33/44 43
使 用 LwIP 应 用 C:\>echotool IP_address /p udp /r 7 l/ 7 /n 15 /t 2 /d Testing LwIP UDP echo server 其 中 : IP_address 为 实 际 板 子 的 IP 地 址 默 认 情 况 下, 会 使 用 静 态 IP 地 址 : 192.168.0.10 /p 为 协 议 (UDP 协 议 ) /r 为 回 响 服 务 器 的 实 际 远 程 端 口 ( 回 响 端 口 ) /l 为 客 户 端 的 实 际 本 地 端 口 ( 回 响 端 口 ) /n 为 回 响 请 求 的 数 目 ( 例 如, 15) /t 为 连 接 超 时 时 间, 单 位 为 秒 ( 例 如, 2) /d 为 要 为 回 响 发 送 的 消 息 ( 例 如, Testing LwIP UDP echo server ) 图 10 显 示 了 此 命 令 字 符 串 和 模 块 响 应 的 例 子 图 10. UDP 回 响 服 务 器 注 : 提 供 的 统 计 指 标 为 测 试 结 束 时 收 到 的 和 毁 坏 的 包 数 7.1.5 基 于 netconn API 的 UDP TCP 回 响 服 务 器 此 演 示 程 序 提 供 了 TCP 和 UDP 协 议 的 回 响 服 务 应 用 : 若 需 在 TCP 服 务 器 模 式 中 测 试 UDP TCP 回 响 服 务 器 netconn 演 示 程 序, 请 参 考 第 7.1.2 章 节 : TCP 回 响 服 务 器 若 需 在 UDP 服 务 器 模 式 中 测 试 UDP TCP 回 响 服 务 器 netconn 演 示 程 序, 请 参 考 第 7.1.4 章 节 : UDP 回 响 服 务 器 34/44 DocID025731 Rev 1
使 用 LwIP 应 用 7.2 特 性 级 应 用 7.2.1 基 于 raw API 的 Web 服 务 器 此 应 用 实 现 了 基 于 LwIP raw API 的 Web 服 务 器 此 应 用 中, STM32 MCU 作 为 Web 服 务 器, 可 为 远 程 Web 浏 览 器 提 供 HTTP 服 务 该 Web 服 务 器 应 用 实 现 了 如 下 特 性 : URL 解 析 CGI ( 通 用 网 关 接 口 ) SSI ( 服 务 器 端 嵌 入 ) 动 态 头 生 成 HTTP Post 请 求 若 需 测 试 Web 服 务 器 应 用, 请 遵 循 如 下 步 骤 : 1. 确 认 STM324xx-EVAL/STM322xG-EVAL 跳 线 设 置 正 确 2. 在 main.h 文 件 中, 取 消 注 释 USE_DHCP 或 USE_LCD 选 项 以 启 用 DHCP 客 户 端 或 LCD 显 示 特 性 3. 生 成 应 用 代 码 并 编 程 到 STM32F4xx/STM32F2x7xx 闪 存 4. 若 定 义 了 USE_ DHCP 及 USE_LCD, 则 LCD 屏 幕 上 会 显 示 消 息, 指 示 DHCP IP 地 址 分 配 是 成 功 还 是 失 败, 否 则 LED 会 显 示 此 操 作 的 结 果 5. 当 指 定 IP 地 址 后 ( 动 态 或 静 态 地 址 ), 用 户 可 启 动 应 用 6. 在 远 程 PC 上, 打 开 Web 客 户 端 (Mozilla Firefox 或 Internet Explorer), 并 在 web 浏 览 器 中 键 入 板 子 的 IP 地 址 默 认 情 况 下, 会 使 用 静 态 IP 地 址 :192.168.0.10 DocID025731 Rev 1 35/44 43
使 用 LwIP 应 用 图 11. Web 服 务 器 主 页 服 务 器 端 嵌 入 (SSI) SSI 方 法 用 于 动 态 包 含 HTML 代 码 中 的 动 态 数 据 这 是 通 过 在 网 页 的 HTML 代 码 内 放 置 特 定 的 标 签 做 到 的 标 签 应 为 如 下 格 式 : <!--#tag--> 对 于 ADC 转 换 页 面, HTML 代 码 内 使 用 的 是 如 下 标 签 : <!--#t--> 当 有 ADC 网 页 ( 它 是.shtml 扩 展 名 ) 的 请 求 时, 服 务 器 会 解 析 网 页, 当 发 现 该 标 签 时, 会 将 其 替 换 为 ADC 转 换 值 36/44 DocID025731 Rev 1
使 用 LwIP 应 用 图 12. HTTP 服 务 器 中 的 SSI 使 用 通 用 网 关 接 口 (CGI) CGI 为 标 准 web 技 术, 用 于 在 服 务 器 端 执 行 来 自 客 户 端 的 请 求, 然 后 向 客 户 端 发 送 响 应 在 LwIP 中, 提 供 的 CGI 仅 支 持 GET 方 法 请 求, 最 多 可 处 理 编 码 在 URI 中 的 16 个 参 数 服 务 器 端 执 行 的 CGI 处 理 程 序 会 返 回 HTTP 服 务 器 发 送 给 客 户 端 的 HTML 文 件 在 HTTP 服 务 器 演 示 程 序 中, 此 方 法 用 于 控 制 评 估 板 的 四 个 LED (LED1 LED2 LED3 和 LED4) 7.2.2 基 于 netconn API 的 Web 服 务 器 此 应 用 实 现 了 基 于 netconn API 的 Web 服 务 器 此 应 用 中,STM32 MCU 作 为 Web 服 务 器, 可 为 远 程 Web 浏 览 器 提 供 HTTP 服 务 此 Web 服 务 器 包 含 两 个 HTML 页 面 第 一 个 页 面 给 出 了 STM32F4xx/STM32F2x7xx 微 控 制 器 和 LwIP 栈 的 一 般 信 息 第 二 个 页 面 列 出 了 运 行 的 任 务 和 它 们 的 状 态 此 页 面 每 秒 更 新 一 次 ( 参 见 图 13) DocID025731 Rev 1 37/44 43
使 用 LwIP 应 用 若 需 测 试 HTTP 服 务 器 netconn 演 示 程 序, 请 遵 循 如 下 步 骤 : 1. 确 认 STM324xx-EVAL/STM322xG-EVAL 跳 线 设 置 正 确 2. 在 main.h 文 件 中, 取 消 注 释 USE_DHCP 或 USE_LCD 选 项 以 启 用 DHCP 客 户 端 或 LCD 显 示 特 性 3. 生 成 应 用 代 码 并 编 程 到 STM32F4xx/STM32F2x7xx 闪 存 4. 若 定 义 了 USE_ DHCP 及 USE_LCD, 则 LCD 屏 幕 上 会 显 示 消 息, 指 示 DHCP IP 地 址 分 配 是 成 功 还 是 失 败, 否 则 LED 会 显 示 此 操 作 的 结 果 5. 当 指 定 IP 地 址 后 ( 动 态 或 静 态 地 址 ), 用 户 可 启 动 应 用 6. 在 远 程 PC 上, 打 开 Web 客 户 端 (Mozilla Firefox 或 Internet Explorer), 并 在 web 浏 览 器 中 键 入 板 子 的 IP 地 址 默 认 情 况 下, 会 使 用 静 态 IP 地 址 :192.168.0.10 图 13. 任 务 页 面 的 Web 服 务 器 列 表 7.2.3 基 于 socket API 的 Web 服 务 器 此 应 用 基 于 socket API 实 现 了 一 个 Web 服 务 器 若 需 测 试 此 演 示 程 序, 请 参 考 第 7.2.2 章 节 : 基 于 netconn API 的 Web 服 务 器 38/44 DocID025731 Rev 1
使 用 LwIP 应 用 7.3 集 成 式 应 用 7.3.1 TFTP 服 务 器 TFTP 服 务 器 提 供 文 件 传 输 服 务, 需 要 一 个 远 程 TFTP 客 户 端 它 可 以 从 STM324xx- EVAL/STM322xG-EVAL 板 的 microsd 卡 上 收 发 文 件 TFTP 服 务 器 等 待 来 自 远 程 TFTP 客 户 端 的 请 求 必 须 通 过 远 程 PC 连 接 STM324xx- EVAL/STM322xG-EVAL 评 估 板, 以 上 传 或 下 载 文 件 为 此, 远 程 PC 上 必 须 安 装 TFTP 客 户 端 这 可 通 过 使 用 tftpd32 工 具 做 到, 它 可 以 从 http://tftpd32.jounin.net 下 载 若 需 测 试 TFTP 服 务 器 应 用, 请 遵 循 如 下 步 骤 : 1. 确 认 STM324xx-EVAL/STM322xG-EVAL 跳 线 设 置 正 确 2. 在 main.h 文 件 中, 取 消 注 释 USE_DHCP 或 USE_LCD 选 项 以 启 用 DHCP 客 户 端 或 LCD 显 示 特 性 3. 生 成 应 用 代 码 并 编 程 到 STM32F4xx/STM32F2x7xx 闪 存 4. 若 定 义 了 USE_ DHCP 及 USE_LCD, 则 LCD 屏 幕 上 会 显 示 消 息, 指 示 DHCP IP 地 址 分 配 是 成 功 还 是 失 败, 否 则 LED 会 显 示 此 操 作 的 结 果 5. 当 指 定 IP 地 址 后 ( 动 态 或 静 态 地 址 ), 用 户 可 启 动 应 用 6. 在 远 程 PC 上, 打 开 TFTP 客 户 端 ( 例 如, TFTPD32) 并 配 置 TFTP 服 务 器 地 址 (TFTPD32 中 的 主 机 地 址 ) 7. 开 始 在 STM324xx-EVAL/STM322xG-EVAL 板 的 micro SD 上 收 发 文 件 图 11 给 出 了 tftpd32 工 具 概 述 图 14. TFTP 工 具 (tftpd32) DocID025731 Rev 1 39/44 43
使 用 LwIP 应 用 注 : 在 STM324xx-EVAL/STM322xG-EVAL 板 上 传 / 下 载 文 件 之 前, 请 确 认 microsd 卡 已 插 入 专 用 的 连 接 器 40/44 DocID025731 Rev 1
结 论 8 结 论 LwIP 包 可 通 过 STM32Cube HAL API 使 用 lwip TCP/IP 栈 此 开 源 栈 在 保 持 相 对 较 低 RAM/ROM 使 用 的 同 时, 提 供 了 完 整 的 TCP/IP 栈 服 务 开 发 TCP/IP 应 用 有 两 种 方 法 : 使 用 独 立 模 式, 或 者 使 用 实 时 操 作 系 统 (RTOS) 进 行 多 线 程 工 作 DocID025731 Rev 1 41/44 43
FAQ 附 录 A FAQ A.1 我 怎 样 选 择 静 态 或 动 态 (DHCP) IP 地 址 分 配? 当 main.h 中 的 宏 定 义 #define USE_DHCP 被 注 释 时, 会 为 STM32 微 控 制 器 分 配 静 态 IP 地 址 ( 默 认 为 192.168.0.10, 可 在 main.h 文 件 中 修 改 此 值 ) 若 去 掉 宏 #define USE_DHCP 的 注 释, 则 启 用 DHCP 协 议,STM32 将 作 为 DHCP 客 户 端 A.2 当 以 太 网 网 线 断 开 时, 应 用 如 何 处 理? 当 网 线 断 开 时, 以 太 网 外 设 停 止 收 发 业 务, 网 络 接 口 关 闭 如 果 使 用 了 LCD 控 制 器, 则 会 显 示 一 条 消 息, 告 知 用 户 网 线 未 连 接, 否 则 评 估 板 上 的 红 色 LED 灯 会 亮 起 当 用 户 重 新 链 接 网 线 时, 以 太 网 外 设 再 次 工 作, 网 络 接 口 建 立 如 果 使 用 了 LCD 控 制 器, 则 会 显 示 一 条 消 息, 告 知 用 户 静 态 或 动 态 分 配 的 新 IP 地 址, 否 则 评 估 板 上 的 黄 色 LED 灯 会 亮 起 A.3 怎 样 将 应 用 移 植 到 不 同 的 硬 件 上? 当 使 用 另 一 个 硬 件 平 台 时, 请 检 查 HAL_ETH_MspInit() 函 数 中 以 太 网 外 设 的 GPIO 配 置, 若 应 用 需 要 更 多 PPP 外 设, 则 还 需 检 查 HAL_PPP_MspInit() 或 HAL_MspInit() 42/44 DocID025731 Rev 1
修 订 历 史 9 修 订 历 史 表 12. 文 档 修 订 历 史 日 期 修 订 变 更 2014 年 3 月 28 日 1 初 始 版 本 DocID025731 Rev 1 43/44 43
请 仔 细 阅 读 : 中 文 翻 译 仅 为 方 便 阅 读 之 目 的 该 翻 译 也 许 不 是 对 本 文 档 最 新 版 本 的 翻 译, 如 有 任 何 不 同, 以 最 新 版 本 的 英 文 原 版 文 档 为 准 本 文 档 中 信 息 的 提 供 仅 与 ST 产 品 有 关 意 法 半 导 体 公 司 及 其 子 公 司 ( ST ) 保 留 随 时 对 本 文 档 及 本 文 所 述 产 品 与 服 务 进 行 变 更 更 正 修 改 或 改 进 的 权 利, 恕 不 另 行 通 知 所 有 ST 产 品 均 根 据 ST 的 销 售 条 款 出 售 买 方 自 行 负 责 对 本 文 所 述 ST 产 品 和 服 务 的 选 择 和 使 用,ST 概 不 承 担 与 选 择 或 使 用 本 文 所 述 ST 产 品 和 服 务 相 关 的 任 何 责 任 无 论 之 前 是 否 有 过 任 何 形 式 的 表 示, 本 文 档 不 以 任 何 方 式 对 任 何 知 识 产 权 进 行 任 何 明 示 或 默 示 的 授 权 或 许 可 如 果 本 文 档 任 何 部 分 涉 及 任 何 第 三 方 产 品 或 服 务, 不 应 被 视 为 ST 授 权 使 用 此 类 第 三 方 产 品 或 服 务, 或 许 可 其 中 的 任 何 知 识 产 权, 或 者 被 视 为 涉 及 以 任 何 方 式 使 用 任 何 此 类 第 三 方 产 品 或 服 务 或 其 中 任 何 知 识 产 权 的 保 证 除 非 在 ST 的 销 售 条 款 中 另 有 说 明, 否 则,ST 对 ST 产 品 的 使 用 和 / 或 销 售 不 做 任 何 明 示 或 默 示 的 保 证, 包 括 但 不 限 于 有 关 适 销 性 适 合 特 定 用 途 ( 及 其 依 据 任 何 司 法 管 辖 区 的 法 律 的 对 应 情 况 ), 或 侵 犯 任 何 专 利 版 权 或 其 他 知 识 产 权 的 默 示 保 证 意 法 半 导 体 的 产 品 不 得 应 用 于 武 器 此 外, 意 法 半 导 体 产 品 也 不 是 为 下 列 用 途 而 设 计 并 不 得 应 用 于 下 列 用 途 :(A) 对 安 全 性 有 特 别 要 求 的 应 用, 例 如, 生 命 支 持 主 动 植 入 设 备 或 对 产 品 功 能 安 全 有 要 求 的 系 统 ;(B) 航 空 应 用 ;(C) 汽 车 应 用 或 汽 车 环 境, 且 / 或 (D) 航 天 应 用 或 航 天 环 境 如 果 意 法 半 导 体 产 品 不 是 为 前 述 应 用 设 计 的, 而 采 购 商 擅 自 将 其 用 于 前 述 应 用, 即 使 采 购 商 向 意 法 半 导 体 发 出 了 书 面 通 知, 采 购 商 仍 将 独 自 承 担 因 此 而 导 致 的 任 何 风 险, 意 法 半 导 体 的 产 品 设 计 规 格 明 确 指 定 的 汽 车 汽 车 安 全 或 医 疗 工 业 领 域 专 用 产 品 除 外 根 据 相 关 政 府 主 管 部 门 的 规 定,ESCC QML 或 JAN 正 式 认 证 产 品 适 用 于 航 天 应 用 经 销 的 ST 产 品 如 有 不 同 于 本 文 档 中 提 出 的 声 明 和 / 或 技 术 特 点 的 规 定, 将 立 即 导 致 ST 针 对 本 文 所 述 ST 产 品 或 服 务 授 予 的 任 何 保 证 失 效, 并 且 不 应 以 任 何 形 式 造 成 或 扩 大 ST 的 任 何 责 任 ST 和 ST 徽 标 是 ST 在 各 个 国 家 或 地 区 的 商 标 或 注 册 商 标 本 文 档 中 的 信 息 取 代 之 前 提 供 的 所 有 信 息 ST 徽 标 是 意 法 半 导 体 公 司 的 注 册 商 标 其 他 所 有 名 称 是 其 各 自 所 有 者 的 财 产 2014 STMicroelectronics 保 留 所 有 权 利 意 法 半 导 体 集 团 公 司 澳 大 利 亚 - 比 利 时 - 巴 西 - 加 拿 大 - 中 国 - 捷 克 共 和 国 - 芬 兰 - 法 国 - 德 国 - 中 国 香 港 - 印 度 - 以 色 列 - 意 大 利 - 日 本 - 马 来 西 亚 - 马 耳 他 - 摩 洛 哥 菲 律 宾 新 加 坡 - 西 班 牙 - 瑞 典 - 瑞 士 - 英 国 - 美 国 www.st.com 44/44 DocID025731 Rev 1