# n32g457_mongoose **Repository Path**: dingl/n32g457_mongoose ## Basic Information - **Project Name**: n32g457_mongoose - **Description**: No description available - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2024-11-19 - **Last Updated**: 2024-11-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 基于W5500的Webserver数据展示 本来要做的的基于 SDI-12 的传感数据记录器,拿到板子后,发现并不合适;恰好手头有个 W5500 模块,就做了个用于展示传感器数据的 webserver; 基于W5500和Mongoose开发的webserver;硬件部分由W5500模块,N32G457主控板等组成;软件部分主要移植了Mongoose 7.4, 适配了 RT-Thread SPI驱动,填了一点 W5500 软件包的一点坑。 # 硬件接线 ## W5500 模块硬件 SPI1 CS_PIN -> PA3 RST_PIN -> PC4 IRQ_PIN -> PA0 ## ADC 温度 VRFE_N -> GND VREF_P -> 3V3 # 软件实现 该项目软件架构主要使用2个线程完成,其中: MG线程:Mongoose http server 主线程; INFO线程:负责获取芯片温度,由于手头没有其他类型的传感器,就在该线程中产生了一些用于展示的随机数; 由于没有存储器件,js 部分的代码存在 ROMFS 中,js部分使用 d3.js 进行动态图表的绘制和更新,使用 axios 进行http的请求; # 作品完整图片 ![harware](Doc/harware.png) # 演示效果 ![show](Doc/show.gif) # 代码地址 https://gitee.com/yukelab7/n32g457_mongoose # 其他 ## 基本开发环境配置 使用RT-Thread 的最初的 env 环境进行代码的编译; ### 编译环境 ![env](Doc/env.png) ### 使用pyocd进行烧录 #### pyocd 烧录环境配置 [文档](https://pyocd.io/docs/target_support.html#manual-pack-usage)中对目标芯片的支持中(Target support)讲了可以通过三种方式进行目标芯片的支持; 1. Built-in 2. CMSIS-Packs 3. Manual pack usage 我这里通过CMSIS-Packs 的方式,使用国民科技提供了 N32G45x 的 `Nationstech.N32G45x_DFP.1.0.4.pack`包,但是注意要对这个包的压缩文件路径进行适当修改,注意左边是正确的配置; ![pkgs](Doc/pkgs.png) 使用默认的配置文件, 文件名必须为 `pyocd.yaml` 或 `pyocd.yml` , 然后通过 `pyoncd flash ./rtthread.bin` 下载固件; pyocd.yaml 文件内容 ```yaml probes: 0001A0000002: # Probe's unique ID. target_override: n32g457vel7 test_binary: ./rtthread.bin pack: - ./pyocd_flash/Nationstech.N32G45x_DFP.1.0.4.pack ``` ![pyocd](Doc/pyocd.png) ## 软件开发过程中的三个坑 ### spi 部分 #### 问题描述 自己仿硬件库,整了个 spi 驱动,进行 `spi_transmitreceive` 时遇到,在填充数据之前发现 SPI_I2S_RNE_FLAG 置位,导致回读的数据数据错位及缺失; #### 解决方案 在进行数据数据读写过程中,确保 SPI_I2S_RNE_FLAG 处于非置位状态,通过一次 dummy 读操作; ### W5500 部分 #### 问题描述 wiznet 包没有对wiznet 包 wiz_setsockopt 函数没有对 SO_REUSEADDR, SO_KEEPALIVE 选项进行处理,导致 mongoose 启动失败; #### 解决方案 增加这两个选项参数; ### mongoose部分1 #### 问题描述 mongoose 在 qemu 上运行正常; 由于 n32g457 板上没有存储器件,将服务器相关文件以 ROMFS 的方式存入flash中,然后使用 mongoose 默认的文件接口,读写 `index.html`失败; #### 解决方案 查看发现mg_file 的本质是用标准库实现的,可能 RTT 中标准库对 ROMFS 的读不支持,基于 DFS 的 poxis 接口,做了文件接口; ### mongoose部分2 #### 问题描述 mg socket 部分使用了 POSIX 接口的 close,用来关闭 socket;然而,RTT下的该接口直接调用了 `.\rt-thread\components\net\sal_socket\dfs_net\dfs_net.c` 下的 dfs_net_close,该函数只是进行了sal_closesocket,并没有释放socket 的文件描述符( fd )资源,导致创建accept 端口数量有限; #### 解决方案 将 mongoose 下的 closesocket 指定为 RTT 系统中的 closesocket,而非 close; # 存在问题 1. 偶尔出现 `E/DFS: DFS fd new is failed! Could not found an empty fd entry`,需要进行重启; 更新 mongoose bug 后没有再现,仍旧需要测试;