基于内部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的驱动、编译器和仿真调试环境。

image.png
image.png

      当SDK安装完成后,我们就可以利用集成开发环境进行工程创建了。选择  文件->新建->RT-Thread项目,打开工程创建窗口,选择”基于开发板“,并且将开发板选择为”

image.png

      CH32V307-R1“,其它选项不变。输入工程名后,点击完成,完成工程创建,我这里输入工程名为”t1“。

      工程创建完成后,基本目录结构为:

image.png

      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

image.png


      3.   搭建文件系统

      利用SPI接口驱动W25Q80BV构成文件系统,我们需要做如下工作:

      1)     SPI接口驱动
      2)     DFS
      3)     Fatfs
      4)     SFUD

      3.1        SPI接口驱动

      通过RT-ThreadSettings界面,开放系统集成的硬件SPI驱动,并选择SPI2设备驱动生效。
image.png

      3.2         开启SFUD驱动

      在 组件 选项页中,找到 设备驱动程序->使用SPI总线/设备驱动程序->使用串行Flash 通用驱动程序(SFUD)。为了保证兼容性,这里将spi总线的缺省速度设置为20MHz。
image.png
      开始测试的时候,发现SFUD不能正确的检测到W25Q80的信息,是因为SFUD需要将W25Q80的信息配置进SFUD_FLASH_CHIP_TABLE中。
      这个文件为sfud_flash_def.h,存放在:

image.png

      找到宏定义,并添加W25Q80BV的信息到宏定义中,如下所示。
  1. #ifdef SFUD_USING_FLASH_INFO_TABLE
  2. /* SFUD supported flash chip information table. If the flash not support JEDEC JESD216 standard,
  3. * then the SFUD will find the flash chip information by this table. You can add other flash to here then
  4. *  notice me for update it. The configuration information name and index reference the sfud_flash_chip structure.
  5. * | name | mf_id | type_id | capacity_id | capacity | write_mode | erase_gran | erase_gran_cmd |
  6. */
  7. #define SFUD_FLASH_CHIP_TABLE                                                                                  {                                                                              {"AT45DB161E", SFUD_MF_ID_ATMEL, 0x26, 0x00, 2L*1024L*1024L, SFUD_WM_BYTE|SFUD_WM_DUAL_BUFFER, 512, 0x81},      \
  8.     {"W25Q80BV", SFUD_MF_ID_WINBOND, 0x40, 0x14, 1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20},                        \
  9.     {"W25Q40BV", SFUD_MF_ID_WINBOND, 0x40, 0x13, 512L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20},                        \
  10. … …
  11.     {"PCT25VF016B", SFUD_MF_ID_SST, 0x25, 0x41, 2L*1024L*1024L, SFUD_WM_BYTE|SFUD_WM_AAI, 4096, 0x20},              \
  12. }
  13. #endif /* SFUD_USING_FLASH_INFO_TABLE */
      当然,如果不想修改这个文件的话,也可以自己重新定义这个宏,并添加相关信息。

      3.3 开启DFS和Fatfs

      开启虚拟设备文件系统(DFS),是能elmchan Fatfs文件系统。

image.png

      这里需要强调一点,需要将最大扇区大小调整为4096。

      3.4  挂载文件系统

      通过前面步骤的配置和调整,我们终于可以开始挂载文件系统了。首先,挂载SPI总线,并通过sfud自动探测SPI设备,从而获得spi总线设备。
  1. #define SPI_BUS_NAME       "spi2"
  2. #define SPI_DEVICE_NAME    "spi20"
  3. #define W25Q_FLASH_NAME     "W25Q80BV"

  4. #define SPI_CS_PIN          GPIO_Pin_12
  5. #define SPI_CS_PORT         GPIOB

  6. /* read the JEDEC SFDP command must run at 50 MHz or less */
  7. #define RT_SFUD_DEFAULT_SPI_CFG                  
  8. {                                                
  9.     .mode = RT_SPI_MASTER | RT_SPI_CPHA | RT_SPI_CPOL | RT_SPI_MSB,         
  10.     .data_width = 8,                             
  11.     .max_hz = RT_SFUD_SPI_MAX_HZ,               
  12. }


  13. //struct rt_spi_device spi20_dev;
  14. static int rt_hw_spi_flash_init(void)
  15. {
  16.     if(rt_hw_spi_device_attach(SPI_BUS_NAME, SPI_DEVICE_NAME,  SPI_CS_PORT, SPI_CS_PIN) != RT_EOK)
  17.         return -RT_ERROR;
  18.     if(RT_NULL == rt_sfud_flash_probe(W25Q_FLASH_NAME, SPI_DEVICE_NAME))
  19.         return -RT_ERROR;
  20.     return RT_EOK;
  21. }
  22. INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
      如下图所示。当系统执行完rt_hw_spi_flash_init()函数后,系统已经识别了SPI设备为”spi20”,同时sfud也自动探测并加载了flash存储器”W25Q80BV“。其次,挂载文件到flash设备,让文件系统和设备建立关联。

image.png

      第一步执行完后,系统已经知道有flash存储器设备了,但是还不知道用什么样的文件系统来管理他们,所以,我还需要将文件系统和flash设备之间建立关联。
  1. #define FS_PARTITION_NAME              "W25Q80BV"

  2. static int onboard_spiflash_mount(void)
  3. {
  4.     if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == RT_EOK)
  5.     {
  6.         LOG_I("spi flash mount to '/'");
  7.     }
  8.     else
  9.     {
  10.         dfs_mkfs("elm", FS_PARTITION_NAME);
  11.         if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == RT_EOK)
  12.         {
  13.             LOG_I("spi flash mount to '/'");
  14.         }
  15.         else
  16.         {
  17.             LOG_E("spi flash failed to mount to '/'");
  18.         }
  19.     }

  20.     return RT_EOK;
  21. }
      到这里,我们才真正的将W25Q80BV设备和文件系统elm之间建立了关联,同时我们也会发现,W25Q80BV 的块设备使用数量从0变为了1 。当我们执行mount命令时,我们可以看到如下图所示,文件系统中已经包含了elm文件系统,并且挂载到W25Q80的根目录”/“下。文件系统已经完成了挂载。
image.png

      4.   网络功能的建立

      本次测试的主要目的就是利用CH32V307的网络,所以这一步非常重要,后面的测试内容都依赖它。在RT-ThreadSettings管理界面中,选择硬件页,开启以太网支持。
image.png
      还要在组件页选择轻量级TCP/IP堆栈。
image.png

      为了后续任务的执行,这里需要调整LwIP线程的栈大小为1600,设置使用静态IPv4地址,地址根据实际情况设置就可以了。

      5.   建立TFTP服务器

      通过搜索资料查询到RT-Thread提供了一个网络小工具集netutils,其中包含了TFTP文件传输的支持,我们添加这个软件包到工程中。

image.png

      开启TFTP服务器和NTP(这个我们后面会用到)。

      实际测试中发现,作为TFTP 服务器使用时,非常方便,这里就以服务器为例来简单介绍使用。如图所示,启动tftp 服务器。

image.png
      使用tftpd64这个软件完成文件传输。Tftpd64运行于Tftp Client模式,如下图所示。注意,Host为Tftp服务器地址,端口号为69。

image.png

      点击”Get“按钮获取服务器文件,点击”Put“按钮向服务器传输本地文件。

      6.   实时钟及网络校时系统

      RT-Thread的板级支持包没有为我们提供RTC的驱动程序,这里移植了在片RTC时钟驱动,并结果官方提供的RTC例程完成驱动移植。
      驱动移植成功后,系统启动后会出现rtc设备。
      系统提供了date命令,可以显示和设置系统时钟。
      前面提到了RT-Thread提供的网络小工具中,包含NTP同步功能,我们开启它,并且让服务器地址指向我们的时钟源。
image.png
      通过执行”ntp_sync 服务器地址“来同步时钟。
image.png

      7.   建立web服务器

      大名鼎鼎的webnet工具在RT-Thread上也已经有移植好的包了,我们将它添加到我们的工程中。这里需要注意几点设置内容,一个是最大连接数,由于CH32V307的资源有限,经过测试设置为1时,系统运行是稳定的。另一个是服务器的根目录,这个必须指向文件系统中包含我们网页文件的目录,这里设置为”/web”。

image.png

      设置完成后,需要通过调用webnet_init()函数来启动web服务器。

      官方历程中有一个以太网webserver的例子,我把它移植过来,苦于其中的图标没有找到官方的,所以找一些替代图标,但是不影响我们的测试和使用。

      启动webnet服务器。

image.png

通过浏览器打开logo页。

image.png
      点击“登录”,进入到主网页画面:
image.png
      还包括各个子画面,此处不一一列举。

      8.   演示和测试

      视频文件较大不好上传,因此按照功能测试分为三个视频。

      RTC及NPT网络同步校时测试:

<iframe height=340 width=100% allowscriptaccess="always" src='https://player.youku.com/embed/XNTg4NDg1Mjk1Ng==' frameborder=0 allowfullscreen="true"></iframe>

      TFTP文件上传测试视频:

<iframe height=340 width=100% allowscriptaccess="always" src='https://player.youku.com/embed/XNTg4NDg1MzIwNA==' frameborder=0 allowfullscreen="true"></iframe>
web服务器测试视频:
<iframe height=340 width=100% allowscriptaccess="always" src='https://player.youku.com/embed/XNTg4NTkzODY0NA==' frameborder=0 allowfullscreen="true"></iframe>

      9.实际驱动代码

hal_drivers.rar (52.69 KB, 下载次数: 1)
继续阅读本篇相关更多标签
举报
您需要登录后才可以评论 登录 立即注册
全部回复 1
  • 2 主题
  • 18 帖子
  • 934 积分
身份:LV3 中级技术员
E币:1061
回复楼主
您需要登录后才可以评论 登录 立即注册