OpenEdv-开源电子网

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

STM32F103 串口IAP + 升级终端,心得分享

  [复制链接]

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
发表于 2017-9-19 20:56:17 | 显示全部楼层 |阅读模式
最近在STM32F103VET6的MCU上进行了IAP升级的钻研,写出了IAP的升级程序以及一个桌面的升级终端,现在将一些心得跟过程分享出来

首先,最重要的当然是要对于STM32的FLASH要有一定的理解啦,这个可以去原子哥的开发手册里面参考一下,有对于FLASH 的介绍
大伙儿可以看看从网上搜的,其他高手写的介绍
http://blog.chinaunix.net/uid-20617446-id-3847242.html  或者也可以自己去问度娘,一大堆

好啦,下面进入正题,我使用的STM32F103VET6的FLASH是512K的,所以我将FLASH分为4个区域,分别是IAP , APP1,APP2还有剩下的一部分区域用来存放一些FLAG,如下
[mw_shl_code=cpp,true]#define FLASH_Base_ADDR              0x08000000  //IAP APP Addr:  0x08000000 - 0x08019000 (size:100k) //bootloader
#define FLASH_Sector_A_StartAddr     0x08019000  //Sector A Addr: 0x08019000 - 0x0803E800 (size:150k) //APP1
#define FLASH_Sector_B_StartAddr     0x0803E800  //Sector B Addr: 0x0803E800 - 0x08064000 (size:150k) //APP2[/mw_shl_code]

实际上,bootloader区留个20-30K就很足够了,我留了100K简直太多余了。主要实现的是对于从IAP升级到APP1 或者 APP2,如果当前程序工作在APP1区,那么接下来将会升级将会APP2的区域进行,如果当前程序工作在APP2区,那么就擦写APP1区,这么做有一个好处,就是万一升级出现错误,我们还可以退回到原程序。说的通俗一点,就是整个BootLoader是一个跳板,无论是进行升级,还是掉电重新运行APP,都是要通过BootLoader。整个升级区域跳转如下
1.png
我们定一个标志位
#define FLASH_Running_APP_Flag       0x08065000  //0x08064800 - 0x08065000  (size:2k) 0x1234:run IAP  0x4567:run App1 0x6789:run APP2
当有程序被刷进去后,每次重新上电,程序会读取一个标志位,然后根据读取来的东西,再选择跳转到APP工作还是进行IAP升级[mw_shl_code=cpp,true]                if(Read_Whole_Word(FLASH_Running_APP_Flag)==0x4567)  //Load in sector A
                {
                                #if DEBUG_MODE
                                   printf("go to sector A\r\n");
                                #endif
                        Load_From_Sector(FLASH_Sector_A_StartAddr);
                }
                if(Read_Whole_Word(FLASH_Running_APP_Flag)==0x6789)  //Load in sector B
                {
                                #if DEBUG_MODE
                                   printf("go to sector B\r\n");
                                #endif
                        Load_From_Sector(FLASH_Sector_B_StartAddr);       
                }                       
                else                                                 //IAP
          {  
                        #if DEBUG_MODE
                           printf("got to IAP\r\n");
                        #endif
                                        while(1)
            {
                    TIMER_Event_Handler();               
             }
    }[/mw_shl_code]
我们定一个标志位[mw_shl_code=cpp,true]#define FLASH_Running_APP_Flag       0x08065000  //0x08064800 - 0x08065000  (size:2k) 0x1234:run IAP  0x4567:run App1 0x6789:run APP2
[/mw_shl_code]
当有程序被刷进去后,每次重新上电,程序会读取一个标志位,然后根据读取来的东西,再选择跳转到APP工作还是进行IAP升级
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-12-6 23:01:10 | 显示全部楼层
本帖最后由 BJTT 于 2017-12-6 23:04 编辑

由于某些同志的要求,现在添加了波特率选项,可以选择不同的波特率

但是注意,在发数据的时候千万别手贱去换波特率

17.12.6

STM32 USART IAP TERMINAL.zip

13.16 KB, 下载次数: 2237

添加波特率选项

回复 支持 1 反对 0

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-12-6 23:15:46 | 显示全部楼层
this version is suitable for X86 32bit platform

X86 STM32 USART IAP TERMINAL .zip

13.16 KB, 下载次数: 1356

32位系统可用

回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-11-27 15:49:31 | 显示全部楼层
asianeast 发表于 2017-11-27 09:43
也就是这个数组crc_ta  是没有的

u16 crc_ta[256]={               
    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
    0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
    0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
    0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
    0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
    0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
    0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
    0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
    0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
    0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
    0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
    0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
    0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
    0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
    0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
    0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
    0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
    0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
    0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
    0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
    0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
    0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
  };
回复 支持 1 反对 0

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-12-4 14:30:20 | 显示全部楼层
asianeast 发表于 2017-12-4 09:09
首先传到网上的上位机确实是460800的波特率
另外如果只有一个串口且已经使用  比如串口是9600的波特率
...

不好意思,我查看了一下代码,是460800的
你的理解是正确的
但是我的上位机,当你点击  连接设备  后,所有的串口选择项都会被冻结,没法更改了的,直到升级完成或者升级失败,才会释放

但是为什么不能统一一下波特率呢?跟我的上位机一样就可以了嘛
回复 支持 1 反对 0

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-19 21:32:33 | 显示全部楼层
每次发帖都失败,我也懒得搞了,导了个PDF,大家自己看吧

STM32 IAP笔记1.pdf

669.49 KB, 下载次数: 3388

回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-19 21:36:46 | 显示全部楼层
附件是main.c   flash.c  还有升级终端APP,大家自己看吧

FLASH.zip

8.38 KB, 下载次数: 2748

main.zip

971 Bytes, 下载次数: 2514

STM32 USART IAP TERMINAL.zip

12.79 KB, 下载次数: 2419

回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-19 21:37:59 | 显示全部楼层
谁能告诉我这特么是什么鬼,每次都是这样
2.png
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-19 21:38:44 | 显示全部楼层
BJTT 发表于 2017-9-19 21:37
谁能告诉我这特么是什么鬼,每次都是这样

发帖的时候有这个问题,我自己回帖也有这个问题,不知道什么鬼
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-19 21:41:20 | 显示全部楼层
升级终端图,大家可以看看
3.png

W.png
R.png
T.png

E.png


u.png
G.png
y.png
Q.png
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-19 21:43:04 | 显示全部楼层
IAP程序与升级终端通讯协议
2.png
6.png
7.png
8.png
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-9-19 23:24:21 | 显示全部楼层
牛逼,上位机用C#写的吧
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-9-20
在线时间
1 小时
发表于 2017-9-20 17:26:30 | 显示全部楼层
楼主能给我发一份你的工程吗,谢谢了
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-20 18:44:16 | 显示全部楼层
八度空间 发表于 2017-9-19 23:24
牛逼,上位机用C#写的吧

是的呢
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-20 18:45:10 | 显示全部楼层
补刀杰克 发表于 2017-9-20 17:26
楼主能给我发一份你的工程吗,谢谢了

项目工程,只能分享一部分哦,有什么不懂的可以直接来问,升级终端是直接可以用的
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-9-20 21:18:56 | 显示全部楼层
BJTT 发表于 2017-9-20 18:45
项目工程,只能分享一部分哦,有什么不懂的可以直接来问,升级终端是直接可以用的

也就是C#部分不能分享了,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-20 23:00:24 | 显示全部楼层
八度空间 发表于 2017-9-20 21:18
也就是C#部分不能分享了,呵呵

APP可以拿去用啊,通信协议也给出来了,这不就够了吗
回复 支持 反对

使用道具 举报

12

主题

241

帖子

0

精华

高级会员

Rank: 4

积分
806
金钱
806
注册时间
2017-8-17
在线时间
159 小时
发表于 2017-9-21 08:41:32 | 显示全部楼层
mark看看
回复 支持 反对

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-9-21 10:28:22 | 显示全部楼层
收藏一下
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-9-20
在线时间
1 小时
发表于 2017-9-21 10:40:26 | 显示全部楼层
BJTT 发表于 2017-9-20 18:45
项目工程,只能分享一部分哦,有什么不懂的可以直接来问,升级终端是直接可以用的

好的,谢谢楼主
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2017-9-21 12:06:50 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

12

主题

432

帖子

0

精华

高级会员

Rank: 4

积分
729
金钱
729
注册时间
2012-6-21
在线时间
59 小时
发表于 2017-9-23 20:59:39 来自手机 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

3

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2015-3-1
在线时间
123 小时
发表于 2017-9-23 22:01:20 | 显示全部楼层
虽然自己也能写,不过想参考下楼主WINFORM的编程风格,自己写的有点LOW
- -个性的签名
回复 支持 反对

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
发表于 2017-9-24 16:53:30 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-8-6
在线时间
6 小时
发表于 2017-9-25 11:57:24 来自手机 | 显示全部楼层
我想问下,你写到Flash里的代码有几个,断电后,不又回到bootload了么?有什么用?
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-25 19:10:15 | 显示全部楼层
chenfujun062 发表于 2017-9-25 11:57
我想问下,你写到Flash里的代码有几个,断电后,不又回到bootload了么?有什么用?

一共三个区,bootloader, APP1 , APP2,其中APP1 和 APP2是交替着来擦写的,
我这个断电后还是会跳到程序执行的哦,因为我有在FLASH里置了flag,断电后flag是不会消失的,所以每次上电会检测flag位,再决定是跳转到APP 还是执行IAP升级
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-25 19:10:58 | 显示全部楼层
Ray______ 发表于 2017-9-23 22:01
虽然自己也能写,不过想参考下楼主WINFORM的编程风格,自己写的有点LOW

哈哈,我有强迫症,没办法。。。。。
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-8-6
在线时间
6 小时
发表于 2017-9-26 15:28:30 来自手机 | 显示全部楼层
BJTT 发表于 2017-9-25 19:10
一共三个区,bootloader, APP1 , APP2,其中APP1 和 APP2是交替着来擦写的,
我这个断电后还是会跳到程 ...

那如果下次再串口升级,怎么解决
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-8-6
在线时间
6 小时
发表于 2017-9-26 15:28:54 来自手机 | 显示全部楼层
有联系方式么?
回复 支持 反对

使用道具 举报

5

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2017-9-26
在线时间
25 小时
发表于 2017-9-26 16:53:03 | 显示全部楼层
有点小疑惑,这个标志位能够起到控制运行APP还是IAP,但是怎么控制这个地址(0x08065000) 里的数据改变呢?
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-29 21:58:13 | 显示全部楼层
青春梦飞翔 发表于 2017-9-26 16:53
有点小疑惑,这个标志位能够起到控制运行APP还是IAP,但是怎么控制这个地址(0x08065000) 里的数据改变呢 ...

该地址的值默认是跑IAP程序的(就是一次升级都没有的时候),然后在每次IAP升级完成,运行新的APP前都重新刷写该地址的FLASH的值,更新为新的标志(注意这个flag的更新是在新程序里面完成得),其余时间不变,每次掉电进来,首先读这个位置的FLAG
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-9-29 22:02:30 | 显示全部楼层
chenfujun062 发表于 2017-9-26 15:28
那如果下次再串口升级,怎么解决

还是一样啊,比如现在工作在APP1,要升级时,从APP1跳回到IAP,然后在APP2区域升级,最后在APP2区域工作,如果升级过程中失败了,就跳回APP1工作
回复 支持 反对

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-4-10
在线时间
10 小时
发表于 2017-10-2 14:10:40 | 显示全部楼层
发帖的时候有这个问题,我自己回帖也有这个问题,不知道什么鬼
回复 支持 反对

使用道具 举报

12

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-9-20
在线时间
56 小时
发表于 2017-10-9 09:53:14 | 显示全部楼层
膜拜大佬
回复 支持 反对

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2315
金钱
2315
注册时间
2017-7-6
在线时间
281 小时
发表于 2017-10-10 22:50:30 | 显示全部楼层
楼主666,我先学习一下。我思路没你清晰
回复 支持 反对

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2315
金钱
2315
注册时间
2017-7-6
在线时间
281 小时
发表于 2017-10-11 10:04:52 | 显示全部楼层
楼主,问你个问题,当我芯片SRAM空间不够大,一次放不下所有IAP程序 ,你是怎么搞的
回复 支持 反对

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2017-10-11 10:22:22 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2017-8-21
在线时间
35 小时
发表于 2017-10-11 10:33:35 | 显示全部楼层
楼主,我也在做IAP,想着做两个app;想法是先进入bootloader读取标志,跳转到正在工作的APP;升级时,如果工作在APP1区时,则对APP2写bin文件,操作完之后写标志位,切换工作APP2;如此轮换升级,请问有没有问题?bin文件能烧到随便的地方执行吗?bootloader跳转和向量表地址我都修改了,但是实际操作下来发现轮换不正常。
回复 支持 反对

使用道具 举报

20

主题

227

帖子

0

精华

高级会员

Rank: 4

积分
605
金钱
605
注册时间
2017-7-14
在线时间
116 小时
发表于 2017-10-11 11:02:06 | 显示全部楼层
几个月前已经实现,这个东西不难,楼主用的是什么无线通讯?
回复 支持 反对

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2017-10-11 12:37:49 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-10-11 20:38:02 | 显示全部楼层
Alionlu 发表于 2017-10-11 10:33
楼主,我也在做IAP,想着做两个app;想法是先进入bootloader读取标志,跳转到正在工作的APP;升级时,如果 ...

这个是可以实现的,我的也是这么干的
你说的是没有跳转成功吗?还是跳转的时候程序就死了?
不正常的现象是什么样的
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-10-11 20:39:13 | 显示全部楼层
SimpleLife 发表于 2017-10-11 11:02
几个月前已经实现,这个东西不难,楼主用的是什么无线通讯?

多钻研,肯定是不难的
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2017-8-21
在线时间
35 小时
发表于 2017-10-12 09:32:18 | 显示全部楼层
BJTT 发表于 2017-10-11 20:38
这个是可以实现的,我的也是这么干的
你说的是没有跳转成功吗?还是跳转的时候程序就死了?
不正常的现 ...

boot里面和main文件里面分别如图 main.png boot.png 我现在的问题就是,我app1(keil上针对0x8007000写的100ms延时led翻转)是jtag烧录进去,位置在0x08007000,然后通过app1下载App2(keil上针对0x08007000写的2s延时led翻转),也下载下去了,位置在0x08013800;理论上来说,应该就跳到app2,然后led每2s翻转一次,但是现在结果是执行的app1;在boot里面看到其实也是跳过去了的,app里面没办法看到偏转。但是我去读标志位的时候是读取的0x08013800的,如果main函数没错的话也就意味着我一定是在main里面偏转了0x08013800的C:\Users\admin\Desktop\boot\main.png
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-10-12 11:36:38 | 显示全部楼层
1547674987 发表于 2017-10-11 10:04
楼主,问你个问题,当我芯片SRAM空间不够大,一次放不下所有IAP程序 ,你是怎么搞的

我是放在FLASH 里面的,从FLASH启动的,我还没试过从SRAM启动呢
你的SRAM是多大的呀,
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-10-12 11:49:03 | 显示全部楼层
Alionlu 发表于 2017-10-12 09:32
boot里面和main文件里面分别如图我现在的问题就是,我app1(keil上针对0x8007000写的100ms延时led翻转) ...

你的意思是说你跳转后,还是APP1 的现象是吗?
1.检查一下你的APP2 的bin文件对不对,因为我之前就范过这个错误,APP1和APP2下载了同一个bin文件,导致每次升级的现象都一样
你的APP2的程序应该是COPY APP1的,然后更改部分地方的是不?哪就检查你生成bin文件的那一段代码,看你生成APP2的bin文件的时候是不是load的是APP1 的 .axf文件,如果是这样,那每次实际上你都是下载的APP1的bin文件
1.png
最好是用串口,APP1   APP2 都定时抛不同的东西出来,这样更直观一点
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2017-8-21
在线时间
35 小时
发表于 2017-10-12 14:21:32 | 显示全部楼层
BJTT 发表于 2017-10-12 11:49
你的意思是说你跳转后,还是APP1 的现象是吗?
1.检查一下你的APP2 的bin文件对不对,因为我之前就范过 ...

有可能是这个问题,我再看看
回复 支持 反对

使用道具 举报

1

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1820
金钱
1820
注册时间
2015-11-30
在线时间
255 小时
发表于 2017-11-21 16:07:09 | 显示全部楼层
楼主   串口相关的操作可否发来看看  
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-7-30
在线时间
5 小时
发表于 2017-11-22 14:18:35 | 显示全部楼层
先拿过来学习下
回复 支持 反对

使用道具 举报

1

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1820
金钱
1820
注册时间
2015-11-30
在线时间
255 小时
发表于 2017-11-23 16:42:23 | 显示全部楼层
楼主  你的CRC校验采用是哪种算法呀   程序里的校验写的感觉有问题
u16 DATA_CRC(u8 * data,u16 len)
{
   u16 crc=0;
   u8 da;
   while(len--!=0)
    {
       da=(unsigned short)crc>>8;
        crc<<=8;     
        //crc^=crc_ta[da^*data];  
        data++;
      }
   return crc;
}

另外采用了几种标准的方法都和你上位机发送出来的校验值不一样     
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-11-26 21:44:53 | 显示全部楼层
asianeast 发表于 2017-11-21 16:07
楼主   串口相关的操作可否发来看看

串口操作其实就是根据我上面给的通讯协议来的,判断数据的长度,和头尾
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
 楼主| 发表于 2017-11-26 21:47:39 | 显示全部楼层
asianeast 发表于 2017-11-23 16:42
楼主  你的CRC校验采用是哪种算法呀   程序里的校验写的感觉有问题
u16 DATA_CRC(u8 * data,u16 len)
{

用的是CRC16,在进行CRC校验的时候,会有一个标准的  CRC校验值的table表  参与运算的
这个表也是由一个CRC校验值产生函数生成的
我记得在flash.c上面有的吧
回复 支持 反对

使用道具 举报

1

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1820
金钱
1820
注册时间
2015-11-30
在线时间
255 小时
发表于 2017-11-27 09:40:31 | 显示全部楼层
BJTT 发表于 2017-11-26 21:47
用的是CRC16,在进行CRC校验的时候,会有一个标准的  CRC校验值的table表  参与运算的
这个表也是由一个 ...

flash.c里面确实没有这个table表  
另外DATA_CRC函数也屏蔽掉了   因此如果用现在的上位机   就没法使用校验功能

另外想确认一下pdf里面的就是所有的串口协议么   还有没有一些错误重发的协议没有写入?
回复 支持 反对

使用道具 举报

1

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1820
金钱
1820
注册时间
2015-11-30
在线时间
255 小时
发表于 2017-11-27 09:43:40 | 显示全部楼层
BJTT 发表于 2017-11-26 21:47
用的是CRC16,在进行CRC校验的时候,会有一个标准的  CRC校验值的table表  参与运算的
这个表也是由一个 ...

也就是这个数组crc_ta  是没有的  
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 16:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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