我想在F103的开发板上试一下基于网络的IAP实验,初步想法很简单,就是将APP程序发送给开发板然后开发板在接受完APP程序后跳转执行程序。开发板带有网络通信实验的例程,我只需在通信例程的例程上再加入串口IAP例程的iap和stmflash等程序文件,主要是利用iap.c里的读写flash和跳转执行APP的函数。 我把网络编程中接收数据长度上限增大(比如初步试验我采用小规模的APP,将tcp server或者client的最大数据接收长度定为10000字节。其实我也试了一下,由于网络编程的例程这里采用了动态内存管理,接收到的数据其实都是先存储到ram中的,最大接收长度太大编译就会出错)。我用的是tcp server test,最后是在tcp_server_test函数加入iap.c中的iap_write_appbin和iap_load_app函数,如附图所示。tcp_server_recvbuf存储着接收到的程序文件,其最大为10000字节,事实上我测试用程序只有5kb左右。我没有改动tcp_server_recv函数,这里就不贴出tcp_server_recvbuf是如何接收tcp server test传送过来的文件的了。由于网络编程的原始程序大小有210kb左右,我目前只是简单测试没有裁剪程序,所以就将FLASH_APP1_ADDR定为0x08040000,这样就是给带网络编程的Bootloader程序留了256kb,给APP程序也留了256kb。实际程序运行时能够跑到在LCD上显示出“RUNNING FLASH APP”,但是之后程序就没有反应了,不能真正执行我发送过去的APP程序。此外,我发送时是用原点附赠的网络调试助手直接发送的bin文件。本人也是前不久刚上手学习stm32,希望各位大神指点迷津,能告诉我问题可能在哪里或者可以往哪个方向去找问题,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我按照你的方法试了一下,果然发现了一个问题,程序在调用tcp_server_recv函数在接收数据时并不能一口气在TCP_SERVER_RX_BUFSIZE的范围内全部接收上位机发送过来的数据,就算我把TCP_SERVER_RX_BUFSIZE定为10000,它一次性只能接收1460 bytes的数据,超出这个大小的数据程序会反复调用tcp_server_recv函数来接收。比如,我的小程序大小为4960 bytes,那么一共调用了4次tcp_server_recv函数。所以我又把tcp_server_demo的函数改了一下,如图1,2,3所示。
C:UsersmacbookproDesktop图1.PNG
C:UsersmacbookproDesktop图2.PNG
C:UsersmacbookproDesktop图3.PNG
图1,2为对tcp_server_test函数的修改,图3为对tcp_server_recv函数的修改。增加了rece_cnt这个变量来统计tcp_server_recv函数调用了多少次,也利用这个变量和app_size来计算新接收到的程序写入flash的地址。如前所述,data_len其实最大只能为1460,而由图3也可知,app_size并不和data_len同步变化,而是等于上一次调用tcp_server_recv函数时data_len的值。这样从串口接收的结果就如图4所示。
C:UsersmacbookproDesktop图4.PNG
我也从串口将接收到的数据全部送回来检查了一下,没有一个个对,但开头几十个和结尾几十个数据都是对的,但即使这样我的小程序依旧不能执行,现在也还没检查出原因。
PS:我的小程序用串口IAP验证过,是可以正确执行的。
一周热门 更多>