OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8258|回复: 24

STM32F103 IAP问题没办法第二次更新

[复制链接]

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-12-3
在线时间
21 小时
发表于 2021-1-27 21:31:54 | 显示全部楼层 |阅读模式
3金钱
请问一下,原子IAP的代码,为什么只要进行iap升级一次后就没办法第二次升级(另一个新的bin)如果要第二次必须重新刷一遍boot,例程也是这样。请问有哪位大佬知道这个怎么解决吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

34

主题

252

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
473
金钱
473
注册时间
2020-5-11
在线时间
217 小时
发表于 2021-1-28 13:54:17 | 显示全部楼层
本帖最后由 asshole 于 2021-1-28 14:00 编辑

要进行更新,,,要运行在bootloader段,引导bin文件下载

所以要在app程序中加一个触发信号,比如说按下按键,程序跳转到bootloader程序段,比如:
  1. if(key0 == 0)                      //按键按下
  2. {
  3. delay_ms(100);
  4.      __set_FAULTMASK(1);                //关闭所有中断
  5.                                                          NVIC_SystemReset();                //系统复位
  6. }
复制代码



回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-12-3
在线时间
21 小时
 楼主| 发表于 2021-1-28 15:15:31 | 显示全部楼层
asshole 发表于 2021-1-28 13:54
要进行更新,,,要运行在bootloader段,引导bin文件下载

所以要在app程序中加一个触发信号,比如说按下 ...

我这是是在系统复位后,再发送另一个新的app,写入flash后跳转失败。如果再复位把之前第一次的app发送过去就能跳转。新的app就是不能跳转。
回复

使用道具 举报

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2020-4-22
在线时间
241 小时
发表于 2021-1-28 15:19:43 | 显示全部楼层
gggdddx 发表于 2021-1-28 15:15
我这是是在系统复位后,再发送另一个新的app,写入flash后跳转失败。如果再复位把之前第一次的app发送过 ...

新app有设置中断向量的偏移吗
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-12-3
在线时间
21 小时
 楼主| 发表于 2021-1-28 15:25:00 | 显示全部楼层
moranyidui 发表于 2021-1-28 15:19
新app有设置中断向量的偏移吗

设置了的,其实都是同一个程序,只是改了几句串口打印为了区分两个app的一些标志。然后分别生成了两个不同名字的bin然后来测试的。
回复

使用道具 举报

34

主题

252

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
473
金钱
473
注册时间
2020-5-11
在线时间
217 小时
发表于 2021-1-28 16:31:21 | 显示全部楼层
gggdddx 发表于 2021-1-28 15:15
我这是是在系统复位后,再发送另一个新的app,写入flash后跳转失败。如果再复位把之前第一次的app发送过 ...

你去看看.map文件中的运行地址和你bootloader中设置的是不是一样
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-12-3
在线时间
21 小时
 楼主| 发表于 2021-1-28 19:48:30 | 显示全部楼层
asshole 发表于 2021-1-28 16:31
你去看看.map文件中的运行地址和你bootloader中设置的是不是一样

一样的,都是一个工程出来的呢
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2021-1-29 07:31:37 来自手机 | 显示全部楼层
是不是逻辑上就只支持下载一次bin,就是说如果只有boot,那么这个时候boot程序就会一直运行,等待bin下载;如果已下载APP,那么上电后boot程序就会立马跳转到APP程序员运行,这个时候boot程序就失效了
回复

使用道具 举报

4

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2019-5-11
在线时间
39 小时
发表于 2021-1-29 16:07:38 | 显示全部楼层
无痕幽雨 发表于 2021-1-29 07:31
是不是逻辑上就只支持下载一次bin,就是说如果只有boot,那么这个时候boot程序就会一直运行,等待bin下载; ...

理论上不存在这样的现象,除非你刻意去设计。因为BOOT和程序在不同地址。理论每次重新上电或开始内存地址跳转后。都会从设定的地方启动。
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2021-1-29 21:54:41 来自手机 | 显示全部楼层
不在一个频道上!看这篇文章吧,https://blog.csdn.net/wuhenyouyuyouyu/article/details/102851287
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-12-3
在线时间
21 小时
 楼主| 发表于 2021-1-30 14:21:28 | 显示全部楼层
无痕幽雨 发表于 2021-1-29 07:31
是不是逻辑上就只支持下载一次bin,就是说如果只有boot,那么这个时候boot程序就会一直运行,等待bin下载; ...

前半句是这么的,后半句也差不多,只是我先在一定时间内检测有没有新app,没有就执行上一次的。要是有新的就接收再执行。接收后跳转到新app就不行了。
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-12-3
在线时间
21 小时
 楼主| 发表于 2021-1-30 14:22:24 | 显示全部楼层
ma3264175 发表于 2021-1-29 16:07
理论上不存在这样的现象,除非你刻意去设计。因为BOOT和程序在不同地址。理论每次重新上电或开始内存地址 ...

所以都应该先幸运星boot,有app再运行app的
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2021-2-1 08:55:07 | 显示全部楼层
gggdddx 发表于 2021-1-30 14:22
所以都应该先幸运星boot,有app再运行app的

说的压根不是一回事,我说的Boot失效,是指上电后,判断APP是否有效,如果有效立刻跳转到APP运行,这个时间如果不做特殊逻辑处理是很短的,还没反应过来,就已经跳转到APP了,看看这篇文章吧:https://blog.csdn.net/wuhenyouyuyouyu/article/details/102851287
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-12-3
在线时间
21 小时
 楼主| 发表于 2021-2-1 13:52:54 | 显示全部楼层
无痕幽雨 发表于 2021-2-1 08:55
说的压根不是一回事,我说的Boot失效,是指上电后,判断APP是否有效,如果有效立刻跳转到APP运行,这个时 ...

boot在有app的时候是有特殊处理的,我的问题是,在等待判断是否有新app的这段时间内发送app过去,然后写入flash后跳转失败。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-12-3
在线时间
7 小时
发表于 2021-2-3 09:20:27 | 显示全部楼层
无痕幽雨 发表于 2021-1-29 07:31
是不是逻辑上就只支持下载一次bin,就是说如果只有boot,那么这个时候boot程序就会一直运行,等待bin下载; ...

不会,跳转没成功吧
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
发表于 2021-2-3 10:10:59 | 显示全部楼层
把你代码贴出来很快就解决了,这玩意儿看你代码的
回复

使用道具 举报

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2020-4-22
在线时间
241 小时
发表于 2021-2-3 11:14:04 | 显示全部楼层
就是说你在运行APP时,需要有一个跳回boot的指令,然后等待新app。
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-12-3
在线时间
21 小时
 楼主| 发表于 2021-2-3 18:46:44 | 显示全部楼层
Mrjiang 发表于 2021-2-3 10:10
把你代码贴出来很快就解决了,这玩意儿看你代码的

  1. while(1)
  2.         {
  3.                 printf("boot is run\r\n");
  4.                  if(USART_RX_CNT)
  5.                 {
  6.                         if(oldcount==USART_RX_CNT)//DÂÖüÆúÄú,ûóDêÕμ½èÎoÎêy¾Y,èÏÎa±¾′Îêy¾Y½óêÕíê3é.
  7.                         {
  8.                                 applenth=USART_RX_CNT;
  9.                                 oldcount=0;
  10.                                 USART_RX_CNT=0;
  11.                                 printf("óû§3ìDò½óêÕíê3é!\r\n");
  12.                                 printf("′úÂë3¤¶è:%dBytes\r\n",applenth);
  13.                         }else oldcount=USART_RX_CNT;                       
  14.                 }
  15.                 delay_ms(1000);

  16.                         if(applenth)
  17.                          {
  18.                                 printf("¿a꼸üDÂ1ì¼t...\r\n");       
  19.                                 if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x8000000)//ÅD¶ÏêÇ·ñÎa0X08XXXXXX.
  20.                                 {         
  21.                                         iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//¸üDÂFLASH′úÂë   
  22.                                         printf("1ì¼t¸üDÂíê3é!\r\n");               
  23.                                         printf("¿aê¼ÖØÆô!\r\n");
  24.                                         delay_ms(10000);
  25.                                         NVIC_SystemReset();               
  26.                                 }else
  27.                                 {
  28.                                
  29.                                         printf("·ÇFLASHó|óÃ3ìDò!\r\n");
  30.                                 }
  31.                 if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x8000000)//ÅD¶ÏêÇ·ñÎa0X08XXXXXX.
  32.                         {                 printf("¿aê¼Ö′DDFLASHóû§′úÂë!!\r\n");//
  33.                                 applenth=0;

  34.                                 iap_load_app(FLASH_APP1_ADDR);//Ö′DDFLASH APP′úÂë
  35.                         }else
  36.                         {
  37.                                 printf("·ÇFLASHó|óÃ3ìDò,ÎT·¨Ö′DD!\r\n");
  38.                        
  39.                         }                                       
  40.                         }else
  41.                         {
  42.                                 printf("ûóD¿éòÔ¸üDÂμÄ1ì¼t!\r\n");
  43.                         }
  44.         if(ti==5)
  45.                 {
  46.                         ti=0;
  47.                         if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x8000000)//ÅD¶ÏêÇ·ñÎa0X08XXXXXX.                       
  48.                         iap_load_app(FLASH_APP1_ADDR);
  49.                 }
  50.                         ti++;               
  51.         }             
复制代码

回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-12-3
在线时间
21 小时
 楼主| 发表于 2021-2-3 18:51:13 | 显示全部楼层
moranyidui 发表于 2021-2-3 11:14
就是说你在运行APP时,需要有一个跳回boot的指令,然后等待新app。

大佬请问一下是在aap中直接跳回boot,不能用NVIC_SystemReset();   吗?
回复

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2021-2-3 19:16:41 | 显示全部楼层
假设你用的串口 你在APP里面加一条升级命令 接收到该命令后往FLASH里面写一个有更新的标志位 跳转回或者直接重启到BOOT里
BOOT的逻辑就是判断这个标志位 有效的话反馈一条信息然后进行接收更新 无效正常跳到APP
世界和平
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-12-3
在线时间
21 小时
 楼主| 发表于 2021-2-3 22:00:20 | 显示全部楼层
礼拜天真好 发表于 2021-2-3 19:16
假设你用的串口 你在APP里面加一条升级命令 接收到该命令后往FLASH里面写一个有更新的标志位 跳转回或者直 ...

大佬你好,我按照你那个思路写了发现还是最初那样,还是app2进不去,请问还可能存在什么问题嘛。 PQ4AYQ(PCBGH)JD}$PZYRLE.png 这是我串口收到的数据。中间我也没发现什么问题,还是我第二次flash没写进去。
回复

使用道具 举报

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2020-4-22
在线时间
241 小时
发表于 2021-2-4 09:15:13 | 显示全部楼层
gggdddx 发表于 2021-2-3 18:51
大佬请问一下是在aap中直接跳回boot,不能用NVIC_SystemReset();   吗?

都在学习,我的理解是,APP更改中断向量偏移,NVIC_SystemReset()复位的起始地址是0x08010004,不会去运行boot。这个链接好像挺有用的http://www.openedv.com/posts/list/392.htm
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-12-3
在线时间
21 小时
 楼主| 发表于 2021-2-4 14:46:24 | 显示全部楼层
礼拜天真好 发表于 2021-2-3 19:16
假设你用的串口 你在APP里面加一条升级命令 接收到该命令后往FLASH里面写一个有更新的标志位 跳转回或者直 ...

大佬你好,我按照你那个思路写了发现还是最初那样,还是app2进不去,请问还可能存在什么问题嘛。这是我串口收到的数据。中间我也没发现什么问题,还是我第二次flash没写进去。
PQ4AYQ(PCBGH)JD}$PZYRLE.png
回复

使用道具 举报

1

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2021-6-29
在线时间
97 小时
发表于 2021-7-14 09:57:56 | 显示全部楼层
我的iap升级也是这个问题不知道怎么解决,楼主要是解决了,希望能分享一下。
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-12-3
在线时间
21 小时
 楼主| 发表于 2021-7-27 14:19:34 | 显示全部楼层
zjw7184 发表于 2021-7-14 09:57
我的iap升级也是这个问题不知道怎么解决,楼主要是解决了,希望能分享一下。

把存app的那部分的flash重新擦除就好了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 16:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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