【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的源代码工程的中断向量偏移的偏移设置,如果直接使用要设置为相应的值。
:loveliness::loveliness:赞X3 :):):) :):):):) 屏幕啊屏幕啊 谢谢楼主的分享!! 大神,请教一下,移植LWIP后,ping时拔掉网线,再插上还没ping的通吗 谢谢橙子大大分享 队长shiwo 发表于 2017-7-17 08:56
大神,请教一下,移植LWIP后,ping时拔掉网线,再插上还没ping的通吗
没测试过,如果有能检测到拔掉网线的中断,等插上的时候再初始化一次以太网部分,应可以吧。
有时间的话我可以帮队长测试下。 creep 发表于 2017-7-17 09:32
没测试过,如果有能检测到拔掉网线的中断,等插上的时候再初始化一次以太网部分,应可以吧。
有时间的话 ...
谢谢橙子大神,再初始化一次啊?这个一般是配置以太网参数时才用的,比如改IP,MAC,重插网线不至于吧