基于内部10M-PHY的嵌入式web服务器
本评测基于RT-Thread Studio集成开发环境完成,充分利用CH32V307的内部资源。
评测使用RT-Thread 4.0.4操作系统,通过SPI接口搭建了文件系统,构建了TFTP的服务器,并利用TFTP上传网站数据到文件系统中,搭建了web server服务器,通过浏览器可以正确的访问网页。
驱动芯片内部集成RTC,并构建NTP网络校时系统。
1. 开发环境搭建
测试使用了RT-ThreadStudio集成开发环境,关于开发环境的下载和安装可以参考RT-Thread的官方网站,这里不赘述。
为了可以正确开发CH32V307这款控制器,我们首先需要利用SDK管理器,安装CH32V307的驱动、编译器和仿真调试环境。
当SDK安装完成后,我们就可以利用集成开发环境进行工程创建了。选择 文件->新建->RT-Thread项目,打开工程创建窗口,选择”基于开发板“,并且将开发板选择为”
CH32V307-R1“,其它选项不变。输入工程名后,点击完成,完成工程创建,我这里输入工程名为”t1“。
工程创建完成后,基本目录结构为:
2. 基本硬件构成介绍
由于所使用的开发板集成了以太网控制器和物理层,所以设计系统涉及到的硬件还差SPI Flash,我这里找到了一块飞思卡尔的MxDock板,利用板载的W25Q80BV,这是一块1MB大小的SPIflash,将其连接到CH32V307开发板的SPI2引脚上。
引脚连接关系表
序号 | 功能 | 引脚 | 板载连接器 |
1 | SCK | PB13 | J4-9 |
2 | MISO | PB14 | J4-11 |
3 | MOSI | PB15 | J4-13 |
4 | CS | PB12 | J4-15 |
3. 搭建文件系统
利用SPI接口驱动W25Q80BV构成文件系统,我们需要做如下工作:
1) SPI接口驱动
2) DFS
3) Fatfs
4) SFUD
3.1 SPI接口驱动
通过RT-ThreadSettings界面,开放系统集成的硬件SPI驱动,并选择SPI2设备驱动生效。
3.2 开启SFUD驱动
在 组件 选项页中,找到 设备驱动程序->使用SPI总线/设备驱动程序->使用串行Flash 通用驱动程序(SFUD)。为了保证兼容性,这里将spi总线的缺省速度设置为20MHz。
开始测试的时候,发现SFUD不能正确的检测到W25Q80的信息,是因为SFUD需要将W25Q80的信息配置进SFUD_FLASH_CHIP_TABLE中。
这个文件为sfud_flash_def.h,存放在:
找到宏定义,并添加W25Q80BV的信息到宏定义中,如下所示。
- #ifdef SFUD_USING_FLASH_INFO_TABLE
- /* SFUD supported flash chip information table. If the flash not support JEDEC JESD216 standard,
- * then the SFUD will find the flash chip information by this table. You can add other flash to here then
- * notice me for update it. The configuration information name and index reference the sfud_flash_chip structure.
- * | name | mf_id | type_id | capacity_id | capacity | write_mode | erase_gran | erase_gran_cmd |
- */
- #define SFUD_FLASH_CHIP_TABLE { {"AT45DB161E", SFUD_MF_ID_ATMEL, 0x26, 0x00, 2L*1024L*1024L, SFUD_WM_BYTE|SFUD_WM_DUAL_BUFFER, 512, 0x81}, \
- {"W25Q80BV", SFUD_MF_ID_WINBOND, 0x40, 0x14, 1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \
- {"W25Q40BV", SFUD_MF_ID_WINBOND, 0x40, 0x13, 512L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \
- … …
- {"PCT25VF016B", SFUD_MF_ID_SST, 0x25, 0x41, 2L*1024L*1024L, SFUD_WM_BYTE|SFUD_WM_AAI, 4096, 0x20}, \
- }
- #endif /* SFUD_USING_FLASH_INFO_TABLE */
当然,如果不想修改这个文件的话,也可以自己重新定义这个宏,并添加相关信息。
3.3 开启DFS和Fatfs
开启虚拟设备文件系统(DFS),是能elmchan Fatfs文件系统。
这里需要强调一点,需要将最大扇区大小调整为4096。
3.4 挂载文件系统
通过前面步骤的配置和调整,我们终于可以开始挂载文件系统了。首先,挂载SPI总线,并通过sfud自动探测SPI设备,从而获得spi总线设备。
- #define SPI_BUS_NAME "spi2"
- #define SPI_DEVICE_NAME "spi20"
- #define W25Q_FLASH_NAME "W25Q80BV"
- #define SPI_CS_PIN GPIO_Pin_12
- #define SPI_CS_PORT GPIOB
- /* read the JEDEC SFDP command must run at 50 MHz or less */
- #define RT_SFUD_DEFAULT_SPI_CFG
- {
- .mode = RT_SPI_MASTER | RT_SPI_CPHA | RT_SPI_CPOL | RT_SPI_MSB,
- .data_width = 8,
- .max_hz = RT_SFUD_SPI_MAX_HZ,
- }
- //struct rt_spi_device spi20_dev;
- static int rt_hw_spi_flash_init(void)
- {
- if(rt_hw_spi_device_attach(SPI_BUS_NAME, SPI_DEVICE_NAME, SPI_CS_PORT, SPI_CS_PIN) != RT_EOK)
- return -RT_ERROR;
- if(RT_NULL == rt_sfud_flash_probe(W25Q_FLASH_NAME, SPI_DEVICE_NAME))
- return -RT_ERROR;
- return RT_EOK;
- }
- INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
如下图所示。当系统执行完rt_hw_spi_flash_init()函数后,系统已经识别了SPI设备为”spi20”,同时sfud也自动探测并加载了flash存储器”W25Q80BV“。其次,挂载文件到flash设备,让文件系统和设备建立关联。
第一步执行完后,系统已经知道有flash存储器设备了,但是还不知道用什么样的文件系统来管理他们,所以,我还需要将文件系统和flash设备之间建立关联。
- #define FS_PARTITION_NAME "W25Q80BV"
- static int onboard_spiflash_mount(void)
- {
- if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == RT_EOK)
- {
- LOG_I("spi flash mount to '/'");
- }
- else
- {
- dfs_mkfs("elm", FS_PARTITION_NAME);
- if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == RT_EOK)
- {
- LOG_I("spi flash mount to '/'");
- }
- else
- {
- LOG_E("spi flash failed to mount to '/'");
- }
- }
- return RT_EOK;
- }
到这里,我们才真正的将W25Q80BV设备和文件系统elm之间建立了关联,同时我们也会发现,W25Q80BV 的块设备使用数量从0变为了1 。当我们执行mount命令时,我们可以看到如下图所示,文件系统中已经包含了elm文件系统,并且挂载到W25Q80的根目录”/“下。文件系统已经完成了挂载。
4. 网络功能的建立
本次测试的主要目的就是利用CH32V307的网络,所以这一步非常重要,后面的测试内容都依赖它。在RT-ThreadSettings管理界面中,选择硬件页,开启以太网支持。
还要在组件页选择轻量级TCP/IP堆栈。
为了后续任务的执行,这里需要调整LwIP线程的栈大小为1600,设置使用静态IPv4地址,地址根据实际情况设置就可以了。
5. 建立TFTP服务器
通过搜索资料查询到RT-Thread提供了一个网络小工具集netutils,其中包含了TFTP文件传输的支持,我们添加这个软件包到工程中。
开启TFTP服务器和NTP(这个我们后面会用到)。
实际测试中发现,作为TFTP 服务器使用时,非常方便,这里就以服务器为例来简单介绍使用。如图所示,启动tftp 服务器。
使用tftpd64这个软件完成文件传输。Tftpd64运行于Tftp Client模式,如下图所示。注意,Host为Tftp服务器地址,端口号为69。
点击”Get“按钮获取服务器文件,点击”Put“按钮向服务器传输本地文件。
6. 实时钟及网络校时系统
RT-Thread的板级支持包没有为我们提供RTC的驱动程序,这里移植了在片RTC时钟驱动,并结果官方提供的RTC例程完成驱动移植。
驱动移植成功后,系统启动后会出现rtc设备。
系统提供了date命令,可以显示和设置系统时钟。
前面提到了RT-Thread提供的网络小工具中,包含NTP同步功能,我们开启它,并且让服务器地址指向我们的时钟源。
通过执行”ntp_sync 服务器地址“来同步时钟。
7. 建立web服务器
大名鼎鼎的webnet工具在RT-Thread上也已经有移植好的包了,我们将它添加到我们的工程中。这里需要注意几点设置内容,一个是最大连接数,由于CH32V307的资源有限,经过测试设置为1时,系统运行是稳定的。另一个是服务器的根目录,这个必须指向文件系统中包含我们网页文件的目录,这里设置为”/web”。
设置完成后,需要通过调用webnet_init()函数来启动web服务器。
官方历程中有一个以太网webserver的例子,我把它移植过来,苦于其中的图标没有找到官方的,所以找一些替代图标,但是不影响我们的测试和使用。
启动webnet服务器。
通过浏览器打开logo页。
点击“登录”,进入到主网页画面:
还包括各个子画面,此处不一一列举。
8. 演示和测试
视频文件较大不好上传,因此按照功能测试分为三个视频。
RTC及NPT网络同步校时测试:
TFTP文件上传测试视频:
web服务器测试视频:
9.实际驱动代码
继续阅读本篇相关更多标签
全部回复 1
- 5 主题
- 21 帖子
- 1113 积分
身份:LV4 高级技术员
E币:316
发消息
竟然可以作服务器
>>资料:基于嵌入式的移动公交一卡通POS机的设计与实现