creep 发表于 2017-7-16 18:46:13

【F769IDISCOVERY评测】LwIP之以太网固件升级



相关推荐:【F769IDISCOVERY评测】LwIP Echo 及数据传输测试



    下周ST会有个在线的以太网进阶培训直播,因为时间冲突没法凑热闹跟着学习,所以趁着周末自己先提前准备下。这次培训的实验部分有个以太网更新固件,下面的测试就是简单实现下局域网内以太网更新固件的功能。


1、硬件部分及LwIP移植。


本次测试使用的开发板是STM32F769-DISCO,板载的的以太网PHY是LAN8742A,很多的ST的板子都是使用的这个芯片,移植起来可以参考的例子很多。





从上面可以看到使用接口模式是RMII,这在初始化外设的时候需要注意别选择错误了。测试移植的是LwIP,,如果系统系统中没有使用RTOS,PHY的RX模式要设置为轮询模式,如果是RTOS,可以选择使用中断模式。





注意了上面容易忽略的地方后,LwIP 部分的初始化如下:我们本次开发板作为客户端使用,Netif_Config() 函数会初始化PHY外设,注册接收函数,根据具体的设置设置服务器的IP和端口已经客户端的静态IP,当然也可以使用动态IP模式。
<font face="微软雅黑" size="3">lwip_init();
    Netif_Config();
    tcp_echoclient_connect();
    User_notification(&gnetif);</font>然后周期调用查询接收处理即可:
<font face="微软雅黑" size="3"> ethernetif_input(&gnetif);

          sys_check_timeouts();</font>

客户端程序中会周期的去连接服务器,一旦连接上了就会请求固件文件。





2 IAP 部分


IAP的功能应该很多的同学的都比较熟悉,该功能用一个bootloader 更新BIN文件,本次演示更新的bin文件是之前的测试的一个“弹幕”的简化版。(【F769IDISCOVERY评测】”弹幕“来了) .IAP功能中需要对FLASH进行擦除写操作,这些使用方法可参考参考手册的操作步骤来或者直接参考帖子中附件的代码。等对FLASH操作完成后还需要一个操作是判断BIN文件的有效的堆栈地址,然后取出复位地址的直接复位设备进入BIN中执行代码。
<font face="微软雅黑" size="3">void j2a(void)
{
   /* Check if valid stack address (RAM address) then jump to user application */
if (((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
    /* Jump to user application */
    JumpAddress = *(__IO uint32_t*) (USER_FLASH_FIRST_PAGE_ADDRESS + 4);
    Jump_To_Application = (pFunction) JumpAddress;
   
    /* Initialize user application's Stack Pointer */
    __set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);
    Jump_To_Application();
}
}</font>

3 固件的更新


本次测试总体的步骤是:
1)开发板STM32F769-DISCO 作为客户端连接局域网的服务器,连接上之后请求发送BIN文件。
2)局域网内的PC运行服务器上位机,在接收到客户端的连接和请求BIN文件后,分包发送BIN文件。
3)服务器发送的数据包使用的协议比较简单:包序号+数据长度+校验+数据部分组成。(为了简化操作没有使用校验部分)。
4)STM32F769-DISCO 接收到分包的数据后使用FATFS创建文件并保存BIN文件到SD卡,等到BIN文件接收完成后便软复位进入IAP模式。
5)IAP中判断BIN文件是否存在,如果存在开始更新BIN,包括上面说到的擦除扇区写扇区,更新完成后进入BIN代码部分运行。
6)IAP如果检测不到需要更新的BIN文件会自动运行之前的BIN代码部分,为了演示方便,IAP并没有进行版本以及BIN文件的校验。




上位机我是用C#写的一个简陋的小软件,因为对C#不太熟悉这部分代码写的差劲,高手如果路过请无视。


上位机发送BIN文件到开发板:





根据长度判断发送完成:







开发板接收部分,本来是一个完整的视频,为了方便加载我转化为了2个GIF文件:


1)连接服务器接收BIN文件





2) 下面的图片中读取bin文件后要擦除扇区需要一些时间







有的时候网络不好的时候可能连接服务器或者传输文件有些延迟和卡顿,上面的局域网的更新固件的方法可以延伸到远程更新,只要有个云服务器把服务器程序和固件BIN文件放到服务器就可以先远程固件了。因为只是测试验证所以代码和操作流程难免有不合理的地方,实际项目使用要仔细规划测试。


测试代码如下,注意带BIN的源代码工程的中断向量偏移的偏移设置,如果直接使用要设置为相应的值。











creep 发表于 2017-11-6 16:24:44

队长shiwo 发表于 2017-7-17 08:56
大神,请教一下,移植LWIP后,ping时拔掉网线,再插上还没ping的通吗
我简单测试了下,在ping和发送TCP数据的过程中拔掉网线然后再插入可以继续ping通,数据还会继续发送过来。
左侧串口是读取的PHY的状态寄存器 :PHY_LINKED OK 表示LINK UP;    PHY_LINKED KO 表示 LINK DOWN.
中间是开发板作为client发送数据到PC,右侧是ping的开发板。
不知道是不是测试方法不对还是什么情况,没法重现你说的问题。(单击查看大图)
http://ww1.sinaimg.cn/large/62842993gy1fl8fsexd90g216r0geaoc.gif

creep 发表于 2017-7-20 21:20:01

15616384352 发表于 2017-7-20 19:55
你好大神,在您发的工程代码中有个keil2vs.exe应用程序,作用是把KEIL MDK工程文件结构转移到VS中,我也很 ...

如果转换keil5 工程的话吧keil5的.uvprojx后缀文件修改为keil4的.uvproj 然后运行那个转换小软件,转换完成后再修改回来即可。

主要的那个软件识别不了keil5 工程文件格式,我没有源码也没法修改,只能暂时这样用了。

群星闪烁 发表于 2017-7-20 19:55:52

你好大神,在您发的工程代码中有个keil2vs.exe应用程序,作用是把KEIL MDK工程文件结构转移到VS中,我也很喜欢能使用这个功能。安装这个程序的说明,测试发现,以前用标准库写的代码可以正常转移,但是用STM32CubeMX生成的工程,转接总是失败,出现如下错误提示
请问您有遇到这样的情况吗?是否有解决办法?谢谢

Paderboy 发表于 2017-7-16 20:53:55

:loveliness::loveliness:赞X3

Stm32McuLover 发表于 2017-7-16 21:56:37

:):):)

Stm32McuLover 发表于 2017-7-16 21:56:58

:):):):)

Inc_brza 发表于 2017-7-16 23:34:05

屏幕啊屏幕啊

samhong 发表于 2017-7-17 05:07:30

谢谢楼主的分享!!

队长shiwo 发表于 2017-7-17 08:56:44

大神,请教一下,移植LWIP后,ping时拔掉网线,再插上还没ping的通吗

zero99 发表于 2017-7-17 09:09:15

谢谢橙子大大分享

creep 发表于 2017-7-17 09:32:27

队长shiwo 发表于 2017-7-17 08:56
大神,请教一下,移植LWIP后,ping时拔掉网线,再插上还没ping的通吗

没测试过,如果有能检测到拔掉网线的中断,等插上的时候再初始化一次以太网部分,应可以吧。
有时间的话我可以帮队长测试下。

队长shiwo 发表于 2017-7-17 09:57:07

creep 发表于 2017-7-17 09:32
没测试过,如果有能检测到拔掉网线的中断,等插上的时候再初始化一次以太网部分,应可以吧。
有时间的话 ...

谢谢橙子大神,再初始化一次啊?这个一般是配置以太网参数时才用的,比如改IP,MAC,重插网线不至于吧

creep 发表于 2017-7-17 10:02:21

队长shiwo 发表于 2017-7-17 09:57
谢谢橙子大神,再初始化一次啊?这个一般是配置以太网参数时才用的,比如改IP,MAC,重插网线不至于吧 ...

队长客气了!
对这方面我应该还没有队长了解的多,无论如何能搞定问题就行。:)

队长shiwo 发表于 2017-7-17 10:06:23

creep 发表于 2017-7-17 10:02
队长客气了!
对这方面我应该还没有队长了解的多,无论如何能搞定问题就行。 ...

橙子大神好谦虚,我也搞不定这问题的:'(,后来用其他大神的协议栈了,听他说是栈堆死了

涛哥2035 发表于 2017-7-17 16:26:18

赞一个,不错

ychlucky 发表于 2017-7-18 10:23:04

点赞啊

埃斯提爱慕 发表于 2017-7-18 13:56:28

页: [1] 2 3
查看完整版本: 【F769IDISCOVERY评测】LwIP之以太网固件升级