在 NuMaker IoT 板上使用 CycloneTCP 和 FreeRTOS 构建 Web 服务器需要以下步骤。以下是详细指南:
1. 准备工作
所需组件
- 硬件:NuMaker IoT 开发板(如 NuMaker-IoT-M487)
- 软件:
- IDE:Keil MDK 或 IAR Embedded Workbench
- SDK:NuMaker 官方 BSP(Board Support Package)
- 协议栈:CycloneTCP(集成 TCP/IP 协议栈)
- RTOS:FreeRTOS(任务调度)
- 依赖库:
2. 配置开发环境
(1) 导入基础工程
- 下载 NuMaker IoT 板的 BSP 和示例代码(从 Nuvoton 官网)。
- 在 IDE 中创建一个新工程,包含:
- FreeRTOS 内核(配置任务、队列、定时器)。
- CycloneTCP 协议栈(需支持 M480 系列 MCU)。
(2) 配置 CycloneTCP
在 cyclone_tcp_config.h 中启用必要功能:
#define HTTP_SERVER_SUPPORT ENABLED
#define NET_INTERFACE_ETH_SUPPORT ENABLED
#define ETH_SUPPORT ENABLED
3. 初始化网络接口
(1) 以太网 PHY 初始化
在 BSP 中初始化板载以太网 PHY(如 LAN8720):
#include "net.h"
#include "ethernet.h"
void ETH_Init(void) {
// 初始化 MAC 和 PHY(参考 BSP 示例)
ETH_MACInit();
ETH_PHYInit();
}
(2) 启动 TCP/IP 协议栈
在 FreeRTOS 任务中初始化 CycloneTCP:
void tcpIpTask(void *pvParameters) {
NetInterface *interface = &netInterface[0];
IpAddr ipAddr = IP_ADDR(192, 168, 1, 100); // 静态 IP
IpAddr netMask = IP_ADDR(255, 255, 255, 0);
IpAddr gateway = IP_ADDR(192, 168, 1, 1);
// 配置网络接口
netSetInterfaceName(interface, "eth0");
netSetDriver(interface, &nuEthernetDriver); // NuMaker 以太网驱动
netSetPhyDriver(interface, &lan8720PhyDriver); // PHY 驱动
// 配置 IP 地址
ipv4SetHostAddr(interface, ipAddr);
ipv4SetSubnetMask(interface, netMask);
ipv4SetDefaultGateway(interface, gateway);
// 启动协议栈
netInit();
while (1) {
netTask(); // CycloneTCP 主任务
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}
4. 实现 Web 服务器
(1) 创建 HTTP 服务器
使用 CycloneTCP 的 HTTP 模块:
HttpServerContext httpServer;
void httpServerTask(void *pvParameters) {
error_t error;
// 初始化 HTTP 服务器
httpServerInit(&httpServer);
httpServer.port = 80; // 监听 80 端口
httpServer.interface = &netInterface[0]; // 绑定网络接口
// 启动服务器
error = httpServerStart(&httpServer);
if (error != NO_ERROR) {
printf("HTTP server failed to start!n");
vTaskDelete(NULL);
}
while (1) {
// 处理 HTTP 请求
httpServerTask(&httpServer);
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}
(2) 添加请求处理函数
处理 HTTP GET 请求(例如根路径 /):
void httpGetCallback(HttpConnection *connection, const char_t *uri) {
HttpResponse *response = &connection->response;
if (strcmp(uri, "/") == 0) {
// 返回 HTML 页面
response->status = 200;
response->contentType = "text/html";
response->content = "Hello from NuMaker IoT!
";
response->contentLength = strlen(response->content);
} else {
// 404 处理
response->status = 404;
}
httpSendResponse(connection);
}
注册回调函数(在 httpServerInit 之后):
httpServerSetRequestCallback(&httpServer, httpGetCallback);
5. 集成 FreeRTOS 任务
在 main() 中创建任务:
int main(void) {
// 硬件初始化(时钟、外设等)
BOARD_Init();
ETH_Init();
// 创建 TCP/IP 任务
xTaskCreate(tcpIpTask, "TCP/IP", 2048, NULL, 4, NULL);
// 创建 HTTP 服务器任务
xTaskCreate(httpServerTask, "HTTP Server", 2048, NULL, 3, NULL);
// 启动 FreeRTOS 调度器
vTaskStartScheduler();
while (1);
}
6. 测试 Web 服务器
- 将程序烧录到 NuMaker IoT 板。
- 通过网线连接开发板与路由器。
- 在浏览器中输入开发板的 IP 地址(如
http://192.168.1.100)。
- 应显示 "Hello from NuMaker IoT!"。
常见问题解决
- PHY 初始化失败:检查 PHY 地址、复位引脚和 MDIO 配置。
- IP 无法获取:确认路由器 DHCP 或静态 IP 配置正确。
- HTTP 无响应:确保防火墙未拦截端口 80,并启用
HTTP_SERVER_SUPPORT。
- 内存不足:调整 FreeRTOS 任务堆栈大小(至少 1KB 以上)。
通过以上步骤,即可在 NuMaker IoT 板上构建基于 CycloneTCP 和 FreeRTOS 的 Web 服务器。如需动态内容(如传感器数据),可在回调函数中生成 HTML 或使用 CGI 接口。