【RT-Thread】STM32H743IIT6开发板+LAN8720+W25Q128移植RT-Thread(包含文件系统+TFTP+web服务器+AJAX前端与服务器CGI联动)

简介

手头上有一块H743IIT6的开发板,打算来捣鼓下RTT。但是RTT官方没有专门给H743弄BSP适配,我这个也不是支持范围内的有名的开发板,我只能是以正点原子H743Pro的BSP来修改下适配成我的开发板。
记录下适配中的难点。
我适配完成的外设:

  1. LAN 8720与网络协议栈
  2. W25Q128与文件系统
  3. SD卡与文件系统
  4. TFTP与网络抓包功能tcpdump功能
  5. Web服务器的移植

成果展示

系统跑起来的~~
请添加图片描述
SD卡的文件系统
请添加图片描述
W25Q128的文件系统
请添加图片描述
板卡ping电脑
请添加图片描述
电脑ping板卡
请添加图片描述
tftp功能(RTT加入netutils组件)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
文件名也可以显示出中文,但是需要用修改过配置的putty
在这里插入图片描述

抓包(这个功能真是太好用)(RTT加入netutils组件)
在这里插入图片描述
电脑读取出来的PING抓包
在这里插入图片描述
HTTP服务器DEMO(Mongoose)
在这里插入图片描述
在这里插入图片描述
HTTP服务器(RTT自家的WebNet)
上传文件的玩法没有搞起,运行就会宕机
在这里插入图片描述
在这里插入图片描述

前端AJAX与板卡进行数据交互

这个需要了解些前端知识
在这里插入图片描述
我分享下我的主页

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>

var xmlhttp;
function loadXMLDoc(url,cfunc)
{
  //这个是根据浏览器判断需要生成哪一种请求
  if (window.XMLHttpRequest)
  {
    //ie7之后它的ajax对象都跟随其他其他浏览器一样,使用的是XMLHttpRequest
     xmlhttp=new XMLHttpRequest();
  }
  else
  {
    //ie5和ie6支持的ajax对象叫ActiveXObject
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  //当请求被发送到服务器时,我们需要执行一些基于响应的任务。
  xmlhttp.onreadystatechange=cfunc;
  xmlhttp.open("GET",url,true);
  xmlhttp.send();
}

var text;

function update(){
   loadXMLDoc("/cgi-bin/show_tick",function()
  {
    //当 readyState 等于 4 且状态为 200 时,表示响应已就绪
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
	  text = xmlhttp.responseText;
      console.log(text);
      document.getElementById("h22").innerText = "当前TICK: "+text;

    }
  });

}
function init()
{
 setInterval(update,1000);  //1s 1刷新
}

</script>
</head>
<body onload="init()">
<h2 id = "h22">TEXT</h2>
</body>
</html>

在WebNet组件源代码加入一个回调函数

static void cgi_show_tick_handler(struct webnet_session* session)
{
    const char* mimetype;
    struct webnet_request* request;
    RT_ASSERT(session != RT_NULL);
    request = session->request;
    RT_ASSERT(request != RT_NULL);
    /* get mimetype */
    mimetype = mime_get_type(".html");
    char buff[20] = {0};
    /* 设置应答头 */
    session->request->result_code = 200;
    webnet_session_set_header(session, mimetype, 200, "Ok", -1);
    /*把板卡目前的Tick值回复给浏览器*/
    webnet_session_printf(session,   itoa( rt_tick_get_millisecond(),buff,10) );
}

webnet初始化的时候加入回调函数注册
webnet_cgi_register(“show_tick”, cgi_show_tick_handler);
把网页装到SD卡之后,板卡上电,访问主页,你就可以看到板卡的Tick值1s 1刷新啦
这个搞定了,可以用这个服务器实现很多有意思的功能
想想市售的交换机/路由器等等设备,无需GUI屏幕,无需额外的工具,仅仅需要网页就可以做配置与信息展示,很方便。

移植要点

使用RTT官方做的正点原子H743的BSP
在这里插入图片描述
这个BSP初始状态如下:

  1. 时钟帮调好了,400MHz,开箱即可运行RTT
  2. 有SD卡驱动(没有加入编译环境,事后发现不太好用,换了一个)
  3. 有SPI驱动(没有加入编译环境,这个可以用)
  4. 有SDRAM驱动(没有加入编译环境,没有搞移植适配)
  5. 有LAN8720的驱动(没有加入编译环境,这个网络的也有点问题没有用,换了一个,并替换ETH的HAL库为我自己调好的HAL源文件,因为我的IO口和正点原子的有点不一样)
  6. 有点LED的驱动
    针对以上
    首先通过宏定义在board.h打开需要的外设
#define BSP_USING_SPI5
#define BSP_USING_SDIO
#define BSP_USING_SDIO1
#define BSP_USING_ETH
#define RT_USING_LWIP
#define BSP_USING_ETH
#define PHY_USING_LAN8720A

先弄SPI FLASH
把我自己的SPI5的适配驱动整好,我的板子接的不是QSPI就是普通的SPI
然后RTT设置打开以下设置
在这里插入图片描述
注意因为我要同时挂载SPI和SD卡,所以挂载文件系统的最大数目调整成3,最大扇区大小改成4096.
在这里插入图片描述
设备驱动程序
在这里插入图片描述
在这里插入图片描述
POSIX
在这里插入图片描述
网络
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
基本没有改,就是改了IP地址为静态
在这里插入图片描述
其他的设置就基本没有动了。
先实现功能再优化

SPI存储

SPI比较好弄,在board.c里面

  1. 把W25存储器挂载到SPI5上
  2. 存储器注册块设备
  3. 存储器挂载到文件系统

SD卡

SD卡比较难弄,主要是不熟悉RTT这个IDE加上它原来的这个驱动也有点问题,一直编译不过,我直接换了一个驱动。套路和SPI存储差不多。

  1. 把SD挂载到系统里
  2. SD注册块设备
  3. SD挂载到文件系统
    但是注意SD卡初始化可能时间没有那么块,所以在文件系统初始化阶段要搞一个多次判断监测的机制,待系统读取到SD卡之后,再挂载它到文件系统里。

注意,这个Sconscript似乎可以和IDE联动,如果IDE读取不到BSP宏定义的话,它对应的drv源文件不会显示出来也不会进行编译,可是把我一顿整,我直接把网络和sd卡的这个条件去掉了,让它强制包含。
在这里插入图片描述

在这里插入图片描述

网络部分

原来的BSP没有做网络部分,这个非常的难搞

  1. 需要改mpu部分的代码,包含网络DMA描述符的保护
  2. 需要修改链接文件,包含网络描述符部分的分段
  3. 需要更换它原本的drv源文件,因为我的IO口和他不一样,而且原来的不知道为什么没有考虑网络描述符
    在这里插入图片描述
  4. 原来的PHY地址也不对,正确的应该是0
  5. 原来的初始化部分也没有注意Cache清除的问题
  6. 它底层的HAL库部分对于没有启用的部分没有开启,而且它这个库我对比了下和我手头上调通了网络的HAL库也不一样,直接替换掉。

一整个下午都在找问题在那里,一进网络中断就网络DMA异常,最后发现它HAL库部分文件都有问题
最后到了晚上,还是调通了网络
请添加图片描述
请添加图片描述

总结

初次搞RTT移植还是问题挺多,不过它这个IDE确实很方便,功能配置很好用,但是也有很多坑需要注意。
最后放出我的工程,需要的可以拿走(H743IIT6开发板+LAN8720+W25Q128移植RT-Thread(包含tftp,web服务器的功能))
链接

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值