OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...

查看: 242|回复: 10

STM32F103 IAP升级问题

[复制链接]

  离线 

2

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2018-4-12
在线时间
6 小时
发表于 2018-7-12 17:05:32 | 显示全部楼层 |阅读模式
1金钱
if(USART_RX_CNT)
        {
                if(oldcount==USART_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.
                {
                        applenth=USART_RX_CNT;
                        oldcount=0;
                        USART_RX_CNT=0;
                        printf("用户程序接收完成!\r\n");
                        printf("代码长度:%dBytes\r\n",applenth);
                        printf("开始更新固件...\r\n");       
                        if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
                        {         
                                //iap_write_appbin((FLASH_APP1_ADDR+offset_addr),USART_RX_BUF,applenth);//更新FLASH代码
                                printf("固件更新完成!\r\n");
                                offset_addr+=applenth;//下一个地址
                        }
                        else
                        {
                                printf("非FLASH应用程序!\r\n");
                        }
                }
                else
                        oldcount=USART_RX_CNT;       
                delay_ms(10);
        }

各位大神麻烦帮我看看,这是我移植原子的例程,我现在用的芯片容量比较小所以想把升级包分多次次发送,每次发送256个字节,之前的实验结果是一次性发完升级包可以正常跳转到APP也可以正常运行,分多次发送就会出现问题,第一个256发过去后显示成功,但是接下来的数据都不成功,都没有进这个条件if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)!之后都打印“非FLASH应用程序!”,希望那个有经验的大神和我分享下经验谢谢!

最佳答案

查看完整内容[请看2#楼]

同事帮我看了下是地址错了现在已经搞定了。
回复

使用道具 举报

  离线 

2

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2018-4-12
在线时间
6 小时
 楼主| 发表于 2018-7-12 17:05:33 | 显示全部楼层
胖子阳 发表于 2018-7-13 16:04
既然分包了,那应该首先确认分包函数的正确性,第一个包正确,分包很大可能是正确的。现在主要看你那个判断 ...

同事帮我看了下是地址错了现在已经搞定了。
回复

使用道具 举报

  离线 

501

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
130074
金钱
130074
注册时间
2010-12-1
在线时间
1173 小时
发表于 2018-7-13 01:43:35 | 显示全部楼层
你这想的太简单了吧? 分包发送,就得有分包发送的样子。你电脑端,自己拆封成256字节一个包了么?没有的话,你凭什么认为串口每次只发256字节给你?
回复

使用道具 举报

  离线 

13

主题

178

帖子

0

精华

高级会员

Rank: 4

积分
531
金钱
531
注册时间
2017-9-21
在线时间
124 小时
发表于 2018-7-13 09:07:54 | 显示全部楼层
你这犯得错误太多了
回复

使用道具 举报

  离线 

2

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2018-4-12
在线时间
6 小时
 楼主| 发表于 2018-7-13 09:52:33 | 显示全部楼层
正点原子公众号
正点原子 发表于 2018-7-13 01:43
你这想的太简单了吧? 分包发送,就得有分包发送的样子。你电脑端,自己拆封成256字节一个包了么?没有的话 ...

用软件拆的,计算出总长度,每次往串口发256个字节,不够的就按实际字节发出去,原子哥,可否给个样本看看。
回复

使用道具 举报

  离线 

2

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2018-4-12
在线时间
6 小时
 楼主| 发表于 2018-7-13 09:55:45 | 显示全部楼层
哆啦A萌 发表于 2018-7-13 09:07
你这犯得错误太多了

大牛可否给点思路,新手上路太生疏
回复

使用道具 举报

  离线 

2

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2018-4-12
在线时间
6 小时
 楼主| 发表于 2018-7-13 15:51:18 | 显示全部楼层
帮我解决问题发红包100块,君无戏言!
回复

使用道具 举报

  离线 

8

主题

58

帖子

0

精华

高级会员

Rank: 4

积分
884
金钱
884
注册时间
2015-5-19
在线时间
86 小时
发表于 2018-7-13 16:04:30 | 显示全部楼层
既然分包了,那应该首先确认分包函数的正确性,第一个包正确,分包很大可能是正确的。现在主要看你那个判断语句, if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)只要你串口发送数据,这句话就成立吗?还是与地址有关系?感觉主要考虑为什么第一次总是成功的(不管包的大小),而第二次这句话不通过,是不是第二天就有什么限制,或者标志位的问题?
回复

使用道具 举报

  离线 

13

主题

178

帖子

0

精华

高级会员

Rank: 4

积分
531
金钱
531
注册时间
2017-9-21
在线时间
124 小时
发表于 2018-7-14 17:02:09 | 显示全部楼层
哆啦A萌 发表于 2018-7-13 09:07
你这犯得错误太多了

程序不是你想发就随时都能给接收端发送的,拆包发送一定要加校验已经对应的各个状态控制的:准备、接收、校验、写入、单包数据接收完成,只有接收方处于接收状态才能给其发送数据,不然数据百分百丢包的
回复

使用道具 举报

  离线 

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2017-12-25
在线时间
39 小时
发表于 2018-7-14 19:15:07 | 显示全部楼层
你可以了解下Ymodem协议 这个就是分包发的 1KB一个包,,然后还有Xmodem协议 是128个字节一个包
回复

使用道具 举报

  离线 

2

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2018-4-12
在线时间
6 小时
 楼主| 发表于 7 天前 | 显示全部楼层
Alle 发表于 2018-7-14 19:15
你可以了解下Ymodem协议 这个就是分包发的 1KB一个包,,然后还有Xmodem协议 是128个字节一个包

我是256个字节发的,现在问题解决了,是保存的时候地址出了问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




关闭

"原子哥”推荐上一条 /1 下一条

QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-7-23 21:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */