基于RT-Thread nano的通用Bootloader框架(兼容官方打包加密软件)

发表在 Bootloader2019-12-2 22:25   [复制链接] 92 2513

基于STM32的开源Bootloader框架-RT-FOTA

- y7 J$ s6 `: Y0 T( z( P! o

简介

+ E' N' {. _* @$ G  n* I2 k

RT-Thread官方推出了STM32系列单片机的通用bootloader,在其网站可以通过网页配置就可以生成bootloader的烧录文件,使广大嵌入式工程师不用编写一行代码,就能够轻松完成自己产品的bootloader功能。但是由于RTT官方的bootloader软件RT-OTA是商用性质,不公开源码,不仅仅限制了在其他平台的移植,而且也不方便加入产品的特定功能。本人软件水平有限,但是基于对开源精神的崇拜和RTT多年的感情,蒙发出利用业余时间编写一款开源的且基于RTT系统bootloader通用软件,贡献给大家。

5 P6 D0 R- z" E/ D) q4 |  ]$ k

由于RTT官方推出的bootloader名字叫RT-OTA,因此为了蹭点RTT的流量,我这个bootloader名字就叫RT-FOTA。

. j* x( l) q; c2 S0 |6 |

【RT-FOTA的需求分析】

  Y$ t( a1 M4 c( j
    4 O8 n1 e" L' u) j; i1 a, B, P
  • % h' v2 i9 f# i! ]9 R$ k

    开发基于ROTS的bootloader软件,网上很多牛人会说bootloader最好是裸机程序编写,就像u-boot一样稳定和可靠。但我个人认为目前32位单片机资源丰富,RT-Thread的稳定和可靠性不言而喻,加之RTT的组件丰富,后续功能拓展方便(比如加入网络和USB功能)。因此我使用RT-Thread的阉割版本rtt-nano实现。

    ) H# u. g: ?9 H- S5 N
  • / P( [8 f  J9 v0 Q) g- W% K
  • 8 S- e; C+ t4 {) Q' @4 Z! u

    兼容RTT官方的rbl文件:使用RTT官方的打包软件生成下载文件,可以实现加密压缩功能。由于个人水平问题,只能做到尽可能的兼容,比如RBL文件里面的HASH_CODE我就不知道怎么计算出来的。

    ! W0 S! S8 o+ b& M/ d
  • ' I' R) s. N4 I4 I# R
  • 移植方便:由于RT-FOTA基于RT-Thread开发,因此只要你的平台被RT-Thread支持,就可以很方便的移植到。
  • # x4 G1 g% c+ q) L$ W6 B
# h4 z- W$ B5 V" r1 {( s

【RT-FOTA主要的功能】

, b; L2 n& n1 h) r% J+ |
    . V* s) ]( [2 J1 w/ u/ C
  • 支持RTT官方的RBL打包软件,使用方式也一致。目前支持包括CRC32、AES256、quicklz和fastlz功能;
  • 7 F! K! Z9 z. U. a) F' Z& F
  • 支持命令行模式(FINSH组件)和出厂固件恢复;
  • & j; E1 V: u  \2 [
  • 支持FLASH分区(FAL组件);
  • 2 f* i, Y/ P/ [  }" u3 D
  • 支持功能扩展(RTT组件);
  • $ w8 u/ ^0 b0 o% y
  • 其他功能可自行方便扩展;
  • 8 n- q6 v. s) m+ f* W
8 d3 `% N9 V, H; I

软件开发目录

* r. k+ |* v1 S, L+ A) p6 k

软件开发目录参照RTT的目录形式,如下图所示:

) N' R. N. W  ]8 U8 q1 N

目录

! ~( M7 v' B4 _3 n

我原本计划添加SCONS进行编译,但目前对SCONS的使用还不熟悉,下次再实现,因此暂时使用MDK 完成。

( j% E* }8 H: b4 Z1 J

可以看到我并未按照RTT官方推荐的使用MDK或cube生成rtt-nano的工程,原因是我有强迫症,感觉IDE生成的目录很不爽。

3 o4 N1 j$ z% {( X" }( T7 R$ }

软件配置说明

$ r, u1 F0 H/ U

RT-FOTA的软件配置仍然集中在rtconfig.h中,其中一些.c文件中有一些默认的配置宏,但可以根据需求进行修改。

& o, ?$ ]" U6 x# I+ d) V
/* RT-Thread config file */
$ r6 A9 U5 K& z/ u4 F#ifndef RT_CONFIG_H__
/ z: ~& o* c" A9 e5 O: G#define RT_CONFIG_H__
4 h( e: T2 m, |8 y" n) i. r) ^+ k  `
#define RT_THREAD_PRIORITY_MAX      88 O; o+ g+ B! T7 |5 ]* g) @  B8 \- G) u
#define RT_TICK_PER_SECOND          1000
* J  T* c4 e) p3 V. O: b/ ]#define RT_ALIGN_SIZE               4
, b7 I2 U; H" }* }' K: T#define RT_NAME_MAX                 81 M1 O0 r0 F2 p& n. k/ D

6 A6 n! Y5 M0 p/ V- h( _1 t( U/* Kernel Device Object */  $ X' n3 e& k8 D5 i6 s. G6 _6 x
#define RT_USING_DEVICE
1 K2 j( Y. V7 _$ c#define RT_USING_CONSOLE; i$ b  k- C2 s8 p# H% C
#define RT_CONSOLEBUF_SIZE          5123 X1 _! P7 M: {; Z6 }1 S1 |
#define RT_CONSOLE_DEVICE_NAME      "uart1") b5 u6 N' z5 u6 {
#define RT_VER_NUM                  0x30102
2 [* V: f9 Z2 B7 d; e2 E- a1 K+ P) k5 F. r3 _4 q! f2 w
#define RT_USING_CPU_FFS
: c7 C2 `. ]: b# B  n; \( o# `1 u/ C  s
3 P$ R( ^' y- N( n5 {/* RT-Thread Components */$ p- ?% y0 x3 D3 g9 S
#define RT_USING_COMPONENTS_INIT
: ~3 V, c# ?0 A- B+ z#define RT_USING_USER_MAIN7 V8 @; e$ R$ t+ b6 d* A

5 a* G" T' s7 _6 ]- Q#define RT_DEBUG_INIT 0  e. g- A/ h3 x; ^, u& _0 X5 r
#define RT_USING_OVERFLOW_CHECK
+ @3 _! _) b' O// #define RT_USING_HOOK9 t2 y! t" C5 s% U' J
// #define RT_USING_IDLE_HOOK: j  S$ U% B' a+ h- B' A0 r

0 @- O$ D) V1 r% H. T) d7 ~/* Software timers Configuration */ 
: h  A0 m# P) F( q  v8 ^#define RT_USING_TIMER_SOFT         0
: Y' l3 @% w1 A! V% T1 p: [#if RT_USING_TIMER_SOFT == 0
8 @( }, i) W  a; ~' K#undef RT_USING_TIMER_SOFT
. Z2 S' ^3 A; ?" _& R8 m% t$ \. \#endif; a7 G4 \. a$ D. ]7 E% Q

  R. i# h$ x# X& C#define RT_TIMER_THREAD_PRIO        44 }; X8 O/ C5 v
#define RT_TIMER_THREAD_STACK_SIZE  512; K7 l+ o7 P: O/ t
#define RT_TIMER_TICK_PER_SECOND    100
2 U- Y  a4 i7 `( c" n1 w# x
! m; `# f: h# F3 `/* IPC(Inter-process communication) Configuration */
2 G' L9 c: ^! Y( k4 q! f: p#define RT_USING_SEMAPHORE- ]8 t( d3 c; J! r7 ?1 r; [
#define RT_USING_MUTEX) z+ y0 f8 r) `/ j& D" R  S
//#define RT_USING_EVENT( C8 a. C- z2 Z. q7 B( J5 s3 m2 l
//#define RT_USING_MAILBOX5 r. [% _. @* ?
//#define RT_USING_MESSAGEQUEUE# t+ E3 i; i+ l: r* s+ O) L8 M

& p1 U: C* Z  S/ i" U: c/* Memory Management Configuration */7 u6 {1 i3 C* U# y3 ?! g5 Z
#define RT_USING_HEAP$ u+ K! h  I# @9 j- a% k+ O
#define RT_USING_MEMHEAP
. u1 n' s. T5 F# Q! n6 c' c: e#define RT_USING_SMALL_MEM9 @# s/ w% p) g
; e( y7 H; S1 R. [  a
/* Finsh Configuration */% z7 n. Y/ e2 z4 u( i
#define RT_USING_FINSH
0 C$ G8 O- C. v7 v1 O1 R#define FINSH_USING_MSH
3 X* @+ J- z# B, w7 o) l#define FINSH_USING_MSH_ONLY8 |* [6 m0 P4 b% ]  i4 V  t# K- G
#define __FINSH_THREAD_PRIORITY     5
- O+ }0 X1 H5 g% c. V2 h#define FINSH_THREAD_PRIORITY       (RT_THREAD_PRIORITY_MAX / 8 * __FINSH_THREAD_PRIORITY + 1)
0 j8 L& u* h1 v' x) A, M* x6 d#define FINSH_THREAD_STACK_SIZE     2048. `! C% X2 S; v
#define FINSH_USING_HISTORY
/ _* o- S5 ~0 C" r#define FINSH_HISTORY_LINES         5! N" K/ S+ d3 z$ c( }, h: [% L3 a& V& E
#define FINSH_USING_SYMTAB# Q9 ]! j2 F2 z! I. A8 e( k
#define FINSH_USING_AUTH            /* 可配置FINSH的authencation功能,防止随意使用FINSH */
$ |( X8 s- {$ n/ m#define FINSH_DEFAULT_PASSWORD      "radiation" : M8 X% T2 w( b% e9 O
#define FINSH_PASSWORD_MIN          6! q# n+ b  w! A* \6 \) Q
#define FINSH_PASSWORD_MAX          16  
+ t& Y% }3 s' [6 W6 d* G6 ]. b  w, N) ?* w0 O# k' [4 [+ N$ X' s
/* Device Drivers */    4 c5 K: z4 y& N& S% l# z1 H: J' @
#define RT_USING_PIN
2 D" z, U) i9 G+ m: _#define RT_USING_SERIAL% E8 t9 Q' N- q) k
// #define RT_SERIAL_USING_DMA* Y1 A! i$ b" D" o1 j- c
#define RT_USING_RTC
6 ~' {9 {0 [1 r/ v3 e#define RT_USING_SPI
' M: x3 ~" d" l& S+ W4 ~#define RT_USING_SFUD
' v6 s$ o, ]& J( ^+ U. ]#define RT_SFUD_USING_SFDP
4 x, q" m! L2 w6 n+ Q8 Y#define RT_SFUD_USING_FLASH_INFO_TABLE
7 [! v+ u1 y1 \  z( |! V/ _3 @#define RT_USING_WDT4 L8 ^5 U* N4 _' G
- W, g0 Z" T6 t1 i" B- X6 c
/* RTT组件配置 */8 Y+ r1 j7 D7 h' z: q- i
/* fal package */
3 a1 z$ u5 ], c6 S8 X: L3 X#define PKG_USING_FAL
4 p6 e) j. A# `; A4 a/ L% O#define FAL_DEBUG_CONFIG
0 F, V! l+ f2 m/ n1 V3 ~/ ]#define FAL_DEBUG 05 J5 A# }  R2 L+ ]4 O3 m( `
#define FAL_PART_HAS_TABLE_CFG7 y2 D# n# ?7 J9 H5 Y% ~
#define FAL_USING_SFUD_PORT7 I$ K- j7 X/ ^9 G. `2 J
#define FAL_USING_NOR_FLASH_DEV_NAME    "nor_flash0"
2 Y, p$ j% h. Q7 {% v; {: x#define PKG_USING_FAL_LATEST_VERSION
6 ]5 D! y5 y* o! w/ z#define PKG_FAL_VER_NUM                 0x99999
- z* @/ o* M4 b9 ~
! ~6 ]* |  J# S( A! w0 s/* Tinycrypt package */
: j0 Y; r3 o3 [1 D2 C+ [4 \& ^1 B#define TINY_CRYPT_AES1 U* Q& N% D) ^8 }/ h' W7 ~
, k) }7 a. A) H) }) Q
/* Compress package */5 L) _3 ^1 e* D5 [& F5 x! i: W& S
#define QLZ_COMPRESSION_LEVEL   3
! }( ?3 a& R& a+ T( Q6 z" R$ Z$ _( v6 |4 E( m* ?& Y
/* Hardware Drivers Config */
. f/ W. N, B) q* E  {- }# G#define SOC_FAMILY_STM328 t; t# B1 w! Z/ C0 I
#define SOC_SERIES_STM32F4
3 |' W* B  h5 z# G- J& M#define SOC_STM32F407ZE* p5 O" U( S* d3 S0 L# Y! h
4 h$ B7 C1 R6 b" J- _
/* On-chip Peripheral Drivers */    
+ h4 M! L2 L8 q, a#define BSP_USING_GPIO
; a/ b! x2 I& ~" E! c- T# \! X  F* o#define BSP_USING_ON_CHIP_FLASH
1 `/ ]  }6 a/ |8 x& y#define BSP_USING_ONCHIP_RTC) c3 r4 a$ _* E, H1 _! N% e: ^
#define BSP_USING_UART5 f  V. h' r) w) L1 ^  g' z
#define BSP_USING_UART1
1 T  r. r# y$ w+ P6 w#define BSP_USING_SPI0 s! {3 f7 T5 ^! a  d8 N/ j
#define BSP_USING_SPI16 O9 M4 j: S2 r, f3 m* V: d
. w' F( ?' T5 g& K  n
/* Onboard Peripheral Drivers */    ' s0 m$ C, @$ Z9 q( r0 G
#define BSP_DATAFALSH_CS_PIN 30# |; J/ T1 l9 `3 C2 G
( F0 M  i  Z- W4 \, {! [% H  W' g
/* Board extended module Drivers */ 1 v7 a! V7 p" z4 P& _1 l
#define BSP_RS485_DIR_PIN 52
: r& |/ V  K" r+ {& G9 g) ]7 g3 m5 e. j+ |  D+ l' i0 S) f
/* RT-FOTA module define */
# l7 I9 k) v6 O! u7 U. |; |! L#define RT_FOTA_SW_VERSION      "1.0.0"
- O# V$ F1 s" `
9 K7 I' [: M: k) \9 k6 b7 Q& S/* Enable Ymodem OTA */
' \7 n! s6 h" J#define PKG_USING_YMODEM_OTA* ^, r6 r+ q( F6 i8 p% Q4 S1 O  J& |
* U8 y* @7 x5 a6 l2 k
/* 分区名字可以根据自己的需求而定 */
5 `; Q0 r/ O5 A- ]/* FOTA application partition name */
: P/ I- W7 `3 y8 o7 D" S#ifndef RT_FOTA_APP_PART_NAME( r% x/ y( ~" x4 E* P* I
#define RT_FOTA_APP_PART_NAME   "app"
2 v8 O! o2 D: b. D/ ]9 ~7 f( D9 q#endif  
) _6 L- i& C. D/* FOTA download partition name */" @. Z4 b+ X0 O# }. [  ]- T8 X
#ifndef RT_FOTA_FM_PART_NAME, {* i& r/ R/ i8 Z$ q, H. w
#define RT_FOTA_FM_PART_NAME    "fm_area"
, k6 w* X: H6 _$ q#endif  
9 h3 Q) o8 m" B% e) I/* FOTA default partition name */) U' t) U, g: \1 P/ F0 L
#ifndef RT_FOTA_DF_PART_NAME
3 ]/ Z3 z; h/ P0 P0 R$ H3 d#define RT_FOTA_DF_PART_NAME    "df_area"
1 y: x0 I8 n/ `; i; U* V#endif6 m9 G  R2 K8 a3 h& R
3 v3 M& G5 q4 T$ `) p. s; \
/* 此两项密码必须与RTT的打包软件设置一致 */% d) p$ S! K* o$ s4 U' u
/* AES256 encryption algorithm option */
2 W- M! k4 N  j/ v' Y#define RT_FOTA_ALGO_AES_IV     "0123456789ABCDEF"
  D- G; P2 ^6 ], O3 f& R2 y#define RT_FOTA_ALGO_AES_KEY    "0123456789ABCDEF0123456789ABCDEF"  
6 u  f# i) Y7 ]9 v) h$ d2 [- i( v#endif
6 P+ C# j, @& S, L' `- q5 Q5 v

RBL文件说明

$ U5 r* E. b0 w+ e% ]  h7 m

使用过RTT官方的RT-OTA组件的朋友都知道,下载的不是bin文件,而是需要通过RTT打包软件“装饰”成rbl文件之后,才能被RT-OTA识别。

, ]1 h& t1 v& f& H2 N

RT-OTA打包软件

, y- k$ m, G* \5 e% C# p" x

RTT的打包软件可以设置代码加密和压缩,其配置信息都存在rbl文件前96字节中:

. Y2 T) R# ~8 v& S. v% Z& ^
rt-fota />fota show fm_area 0 96
3 t/ g, {$ f4 r1 x- v- c9 @00000000: 52 42 4C 00 00 02 00 00 5E A9 A4 5D 61 70 70 00 
$ s, t6 h% X* n/ [+ w+ {00000010: 00 00 00 00 00 00 00 00 00 00 00 00 31 2E 30 2E 
) R" _& @$ q1 l- [: I1 O00000020: 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
, r$ i# _8 A& I1 F9 d00000030: 00 00 00 00 31 2E 30 2E 36 00 00 00 00 00 00 00 
3 l, y  t2 L8 Q2 Y00000040: 00 00 00 00 00 00 00 00 00 00 00 00 43 33 29 0A 
7 Q4 r6 m9 K6 Y" U/ _00000050: 47 08 F6 DA 84 BB 00 00 1C 84 00 00 C4 3D E3 B5
3 O/ p. m+ X2 h5 E5 T

其具体含义如下:

1 a1 ^( X" {5 k  W# N# w
typedef struct {
( X0 ]  ]& c. p$ V( H% L" h    char type[4];               /* RBL字符头 */ 
. L$ ~6 w. c/ `8 c. j$ D    rt_uint16_t fota_algo;      /* 算法配置: 表示是否加密或者使用了压缩算法 *// W2 X, s* `  r( O! _2 U
    rt_uint8_t fm_time[6];      /* 原始bin文件的时间戳, 6位时间戳, 使用了4字节, 包含年月日信息 */7 D/ L6 ~5 w: w  g( x8 a
    char app_part_name[16];     /* app执行分区名 */6 O% y7 t: E% y/ y5 v
    char download_version[24];  /* 固件代码版本号 */
3 N% V+ U6 H4 `8 W5 K    char current_version[24];   /* 这个域在rbl文件生成时都是一样的,我用于表示app分区当前运行固件的版本号,判断是否固件需要升级 */. y; @& p8 O1 v( U# h
    rt_uint32_t code_crc;       /* 代码的CRC32校验值,它是的打包后的校验值,即rbl文件96字节后的数据 */
3 _" p  K2 C2 Z$ \  H& a# x    rt_uint32_t hash_val;       /* 估计这个域是指的原始代码本身的校验值,但不知道算法,无法确认,故在程序中未使用 */1 }6 Z7 d, F8 Y
    rt_uint32_t raw_size;       /* 原始代码的大小 */) j: c  z2 B* Z9 Y2 U- E- R9 b
    rt_uint32_t com_size;       /* 打包代码的大小 */" ]9 h3 x+ g3 ]2 Y; K, B
    rt_uint32_t head_crc;       /* rbl文件头的CRC32校验值,即rbl文件的前96字节 */- n* C6 T4 S' F& O9 l
} rt_fota_part_head, *rt_fota_part_head_t;
8 T) J1 R( k0 C2 D# w) g5 F; y3 J

开机界面

$ E( T% {' d3 K6 W; e. C

RT-FOTA开机界面如下图:

/ A) v' f' p1 P2 J' X; f

开机界面

1 ~6 k) K  b% B4 O! ^9 l  V

可以看出使用了RTT的SFUD和FAL组件,同时列出了分区变信息。

0 M, o. R* h3 ]/ x/ A

RT-FOTA源码公开,你想怎么改就怎么改,不在受限制:)

& S) J4 ?5 W4 j- `  H2 x

最后一行是表示在5秒钟内,按下Enter键,即0x0d,就可以进入命令行模式:

, M9 k7 `# R6 o" u0 g

命令行模式

) o, n- `& H2 x0 ?

由于FINSH具备authencation功能,可以设置shell密码。具体详见RTT相关文档。

9 S) x$ k7 x5 I

命令行模式

( ?, F+ [( k0 n  U' I$ ^$ \

RT-FOTA的命令行模式使用的RTT的FINSH组件, 除了RTT系统自带命令外,还增加fota和ymdown命令:

5 h1 G6 [) \" z# F$ y: A

fota命令

0 G, W% i. P7 ?! ^

键入fota命令后回车即可看到帮助命令:

: g5 S1 K9 `, B/ J' ~) i# l
rt-fota />fota, _$ O/ T- ]: N1 [3 h
Usage:
. f6 W- X; W/ I+ S  T; Yfota probe                       - probe RBL file of partiton
, g' g& X1 t+ S- U& b  F/ Jfota show partition addr size    - show 'size' bytes starting at 'addr'* X+ n' M# M/ S6 d2 S: X
fota clone des_part src_part     - clone src partition to des partiton
& G8 v2 _7 _7 j/ _# \& Ofota exec                        - execute application program
9 n' v% e* o+ y- s( W1 A

probe参数可以打印出当分区的RBL信息:

5 t, D: G+ A, k" e* P: E5 ]( |* Y
rt-fota />fota probe
# E) ], a3 t8 M. M' E' d[I/fota] ===== RBL of fm_area partition =====
% q+ Y0 i+ ?' D6 m/ `' r[I/fota] | App partition name |         app |* l$ O8 t2 P1 D
[I/fota] | Algorithm mode     |  AES && QLZ |2 P6 z) |& V: k2 f0 A
[I/fota] | Firmware version   |       1.0.3 |  y9 @7 z$ X4 v$ F5 Y
[I/fota] | Code raw size      |       48004 |2 {5 X- i, r: S: w) f
[I/fota] | Code package size  |       33824 |- v2 o/ {- w1 f0 V% w' m6 _4 ~
[I/fota] | Build Timestamp    |  1571072350 |
5 k' Y, l' i- ?+ j: o) b[I/fota] ===== RBL of df_area partition =====
5 a- {: g; j; j3 g7 \9 K; S' \[I/fota] | App partition name |         app |+ w" p0 v) ]( K( R, Y2 v2 t$ t  R
[I/fota] | Algorithm mode     |  AES && QLZ |6 E+ o, T7 L3 u- k: v9 J" ]
[I/fota] | Firmware version   |       1.0.3 |
4 y1 K' B; A3 ]: v6 T[I/fota] | Code raw size      |       48004 |
% l* a5 F& B: d$ b0 h' J3 v[I/fota] | Code package size  |       33824 |
* d& g4 x; s" F6 i; ?6 V[I/fota] | Build Timestamp    |  1571072350 |
; k# H+ J2 Z" a2 z

这里列出了fm_area和df_area分区中RBL文件的主要信息项,便于开发者查询:

  j* d% z. }9 N$ P2 k* i* X

App partition name: 指的是RTT打包文件时设置的分区名

& u4 N) z  s. h+ h" ]

Algorithm mode    : 指的是RTT打包文件使用那些算法:AES256/Quicklz/Fastlz

& N. b+ K4 {3 Y4 S0 b

Firmware version  : 指的是RTT打包文件设置的固件版本号

1 ?7 V2 ^  v% [

Code raw size     : 指的代码原始大小

: L3 k  U. j$ [

Code package size : 指的代码打包后的大小

3 j, b! t3 N2 Z5 V/ h4 j1 w4 D, L: |

Build Timestamp   : 指的代码生成的时间戳

; E% Y# f0 {! B4 J2 T, l0 t0 b

show参数可以显示分区的具体实际数据,方便调试与检查:

* y% U: B0 ]! `
rt-fota />fota show app 0 96
( S) _0 f( C. g5 g00000000: C0 08 00 20 E5 57 02 08 5D 04 02 08 5F 04 02 08 
& i; `( V6 O( Q- o3 G00000010: 63 04 02 08 67 04 02 08 6B 04 02 08 00 00 00 00 
6 l; D3 l1 y, d" a! }4 n) v+ S# U00000020: 00 00 00 00 00 00 00 00 00 00 00 00 6F 04 02 08 
2 J3 M8 y! |4 Z2 W00000030: 71 04 02 08 00 00 00 00 73 04 02 08 75 04 02 08 ; }& `. Z  q) ?6 R
00000040: FF 57 02 08 FF 57 02 08 FF 57 02 08 49 55 02 08 
3 ~, m1 v4 J( f! v+ g00000050: FF 57 02 08 FF 57 02 08 FF 57 02 08 FF 57 02 08 
9 }; G$ }& P  ]- K$ Q

这里列出了app分区0到96字节的数据

7 P$ l7 y3 t( M5 w

clone参数是实现分区数据克隆

" `. h" A) `% [; n% g
rt-fota />fota clone fm_area df_area1 a/ M5 [# a3 r7 T" ^2 P$ Z5 c
Clone df_area partition to fm_area partition:+ g( C, `* M3 f% U4 [# M( K
#########################################################
8 b3 W  s- d+ G7 g#########################################################
+ @8 V) A  ~1 K; ?#########################################################. F9 V( K4 g+ H) W+ c
#########################################################
* m& A" v9 X/ _5 ?: {9 P0 `############################9 G$ d/ C9 a) U+ F8 c. ^
Clone partition success, total 1048576 bytes!
0 B& U  ?8 j8 d+ y

这里是将df area分区数据完整的克隆岛fm area中。

, H6 C' b- E5 ?( y

exec参数是用于执行app分区的应用代码

+ u0 r, J$ s9 f
rt-fota />fota exec+ G/ \) g! k& W2 i. d: X( Y$ y
[I/fota] Implement application now.
; Z& f( o6 e! g. |' p9 ^ LCD ID:5510
0 K: U7 S7 I1 M+ E6 j

ymdown命令

- p8 E' l5 i/ x+ T' M9 N

ymdown是基于Ymodem协议的下载命令,使用RTT的ymodem和ymodem ota组件实现,其中将ymodem ota.c中的DEFAULT_DOWNLOAD_PART设置为需要默认使用分区名,即在使用ymdown不带参数的情况下就下载到DEFAULT_DOWNLOAD_PART分区,也可加分区名作为参数指定下载位置。

) P4 X$ K  S8 Z4 |+ {
rt-fota />ymdown; r2 \# i& @4 P3 _0 j5 e; l
Default save firmware on download partition.# x0 s. U8 P4 \2 Q. e
Warning: Ymodem has started! This operator will not recovery.4 A, A7 @! V$ v
Please select the ota firmware file and use Ymodem to send.
! ]& E. p: q+ J% K1 M, ~6 u" w4 y1 JCCCCCC- B+ A* f8 ~- d. t6 @' n8 f
Starting ymodem transfer.  Press Ctrl+C to cancel.
+ ^( o/ A5 W1 q8 O/ I2 y  100%      33 KB    6 KB/s 00:00:05       0 Errors
8 ]) F  L. ~/ O$ h+ \/ U0 ^- t# \  A7 i% I  g
Download firmware to flash success." f  S& [' m- d! A; ]
Download firmware verify........[OK]
4 d; Z" ~* N) DReset system and apply new firmware.
( G. K/ G3 X1 E% r1 b0 _6 \

下载完成后,会自动复位重新启动,将新固件搬运到app分区中:

. t% K, v3 ]( r3 Z. b- F
 ____ _____      _____ ___  _____  _        , E# x+ q6 E6 n2 F$ v
|  _ \_   _|    |  ___/ _ \ _   _|/ \      
7 z, \. z. b  G8 m" {) ^: e3 z| |_) || |_____ | |_  || ||  | | / _ \      
" {9 o0 x( Q$ ]; V' j, y|  _ < | |_____ |  _| ||_||  | |/ ___ \     
* t9 `6 c# b7 i2 [$ G% F* \|_| \_\|_|      |_|   \___/  |_/_/   \_\  
+ W6 G  J8 P7 O6 B. h( J. Z2016 - 2019 Copyright by Radiation @ warfalcon 
/ [; E6 M3 ]" yVersion: 1.0.0 build Oct 18 2019
+ s/ N; o  B! d9 Z4 a) z* e) X9 {6 o- o* Q8 u
[SFUD] Find a Winbond flash chip. Size is 16777216 bytes.
+ p  a/ B3 s; z8 P[SFUD] nor_flash0 flash device is initialize success.5 W1 [  y5 U* g, @3 i
[I/FAL] ==================== FAL partition table ====================
+ ~6 n# k3 a( T: c' P5 o5 E% a+ I[I/FAL] | name    | flash_dev    |   offset   |    length  |
$ z9 w) |6 H2 w/ t* h) ?: X  i6 ~[I/FAL] -------------------------------------------------------------
! v$ w, z% T7 m8 |& m6 b[I/FAL] | app     | onchip_flash | 0x00020000 | 0x000e0000 |2 }' Z0 q, F7 F) z9 [. X. J
[I/FAL] | fm_area | nor_flash0   | 0x00000000 | 0x00100000 |
; d4 r' a6 Y7 R4 Z[I/FAL] | df_area | nor_flash0   | 0x00100000 | 0x00100000 |
! e* l0 `! H" c  y[I/FAL] =============================================================
5 c) K+ p# Q6 {0 @4 P3 P  m[I/FAL] RT-Thread Flash Abstraction Layer (V0.4.0) initialize success.* e  b+ X) t$ V% H
Please press [Enter] key into shell mode in 5 secs:
, [- W$ A- s3 q. t+ u[I/fota] Partition[app] erase start:
# w1 Q( Z" h& b[I/fota] Start to copy firmware from fm_area to app partition:6 T* L. M2 t  t' [( }- W8 y2 B
############
) j  m3 ?2 _# f* b8 f, I( x8 i[I/fota] Upgrade success, total 48004 bytes./ G% @- ]& o) [% |5 Q7 V
[I/fota] Copy firmware version Success!  L; k3 U% v: o
[I/fota] Implement application now.
& Y6 l6 h  \2 ~0 C4 e" Z/ C LCD ID:5510
4 W; }3 ]1 P$ {" T+ h8 B7 U% x8 t

出厂固件恢复

. j  |* d! H$ L& I) `

恢复出厂固件的方式比较多,本人多年的工程实践经验,倾向于使用外部按键长按后进行出厂固件恢复。出厂固件存储在df area分区中(分区名在代码中任意设置),长按按键10s后(长按时间在代码中任意设置),RT-FOTA会自动解密解压df area分区代码,并搬运到app分区进行执行。

4 y0 \5 @# i( b
Default firmware key pressed:
3 t9 Y1 I2 g, r: u/ N>>>>>>>>>>
) a: d+ Z- _: b- U/ v# v. |6 e[I/fota] Partition[app] erase start:0 D& \4 j- w, `* Z( A# D/ c% S
[I/fota] Start to copy firmware from df_area to app partition:
5 r7 u% D2 N2 c5 F; ]" ~1 D############
6 \/ a; E7 l7 L* ?- Q( ?; x( v[I/fota] Upgrade success, total 48004 bytes.6 H5 J( \5 T, m9 ~8 e
[I/fota] Implement application now.* B) t# |) w* A5 C% L$ H) y
 LCD ID:5510
8 Y/ c4 [; m- `" u& s4 D

RT-FOTA移植

1 {- \) O- S1 i  u

RT-FOTA移植很简单,只要RT-Thread源码包中有你的平台的BSP包即可:)

" l6 p8 z  t. T" A1 Q" r

RT-FOTA中使用的各种组件的修改也很简单,比如FAL和SFUD就可以参照RTT官方说明,SignalLED参照源码包里的README.md即可。

3 S7 s2 q( ^8 j! n  W# M4 l

RT-FOTA可以直接使用在RT-Thread的完整版搭载,只需要将rt _ fota.crt _ fota.hrt _ fota_crc.c放入工程中即可实现,然后用env配置相关组件即可。

6 h, j# _% a2 _) U1 s

编译下载

- Y( ]2 R7 m+ l& l( G& ?3 d6 z

双击 bootloader.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。

7 n# _: S: \2 J5 C, h5 g
8 M+ k$ y  b$ p

工程默认配置使用 JLINK 仿真器下载程序,点击下载按钮即可下载程序到开发板

2 S' p% T& u) ~
) V: O2 Y/ ?. r: h

运行结果

4 U7 _2 b7 v5 W  p! V. {

下载程序成功之后,系统RT-FOTA会运行:

" V1 S7 d, F5 B2 [1 e
    2 h! C5 H1 b8 E/ \/ L) G) X
  • 启动后LED会常亮;
  • 2 R/ |2 K9 D0 H" ?
  • 如果进入shell模式, LED会1Hz闪烁;
  • " P' F7 e( u* I1 }
  • 如果进入upgrade模式, LED会10Hz闪烁;
  • + b7 |1 `$ C# f+ C) E; ^
" ^) ~, \% P. ?2 S- Z4 V

连接目标板的串口1到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-FOTA 的输出信息:

6 p1 ]" Z9 ^4 @7 |4 F' k
 ____ _____      _____ ___  _____  _        
5 ~0 Y% H+ q6 Q! c|  _ \_   _|    |  ___/ _ \ _   _|/ \      
* B( ?  a0 ~3 `6 ^| |_) || |_____ | |_  || ||  | | / _ \      
* o& X% j2 X/ |( M( z# g|  _ < | |_____ |  _| ||_||  | |/ ___ \     / l9 B5 O4 P+ s7 A3 o1 h
|_| \_\|_|      |_|   \___/  |_/_/   \_\  ; a4 r- O: d& h
2016 - 2019 Copyright by Radiation @ warfalcon & o1 m* s4 @- s& X- r; x2 L
Version: 1.0.0 build Oct 18 2019
+ _' w  \2 J6 @/ q# Y3 P& i' B6 B
6 U0 B6 Z6 D" [7 G$ W[SFUD] Find a Winbond flash chip. Size is 16777216 bytes.
2 w. J% f3 \, {[SFUD] nor_flash0 flash device is initialize success.
, N# ^: E# V- X- j! e& x[I/FAL] ==================== FAL partition table ====================
2 H' I1 r! C& u- h1 B[I/FAL] | name    | flash_dev    |   offset   |    length  |
4 l( W- {+ h$ S% P6 v[I/FAL] -------------------------------------------------------------: L" f3 N) \* y- \3 l1 j, C
[I/FAL] | app     | onchip_flash | 0x00020000 | 0x000e0000 |- a3 y0 }( A) V9 N7 W
[I/FAL] | fm_area | nor_flash0   | 0x00000000 | 0x00100000 |! J' G. n4 e" C. ?# f4 f
[I/FAL] | df_area | nor_flash0   | 0x00100000 | 0x00100000 |; q. z2 u8 w6 h9 ~# w; X( z
[I/FAL] =============================================================
4 Y( P1 \* p; k0 Y3 K+ u8 M[I/FAL] RT-Thread Flash Abstraction Layer (V0.4.0) initialize success.
6 v4 {" v! ?* C' b

注意事项

. z; `. P  r" L4 F- J
    % q, {( C/ N9 h7 k1 M
  • + C; @# j2 R. ?) e6 V

    RT-FOTA使用正点原子的探险者开发板,如果要运行到其他目标板,可能需要修改相关设置;

    ) r( a5 G. e6 T9 x$ n1 p! a
  • - i8 u5 w! _, n3 A) t4 V' b2 a& J' V
  • # a- N% D$ _$ p, ~

    代码中使用的硬件有usart0、spi0、PE4(key0)、PF9(led0);

    7 C* q& S' X+ W6 m
  • " t) f* J, p* E' c2 z" e. y
  • 由于业余时间开发,文档逐步完善,但只要有一定编程基础的朋友,开代码注释即可知道如果进行相关修改;
  • 9 F& ?5 x( Y7 J4 a( l" }" F' I
4 T+ B( m7 }: E, g

联系人信息

& ?, p% L: |7 A

维护人: 王希

/ W3 }. V$ r( h+ E& b/ @- F' d
: U# `, G8 V  q$ J* _% A! h
shell.png
poweron.png
pack1.png
dir.png
shell.png
poweron.png
pack1.png
dir.png
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-12-3 05:05:59 | 显示全部楼层
完成版的使用 可以做成软件包,维护和使用更方便
使用道具 举报 回复
发表于 2019-12-3 08:55:08 | 显示全部楼层
在哪里可以下载?
使用道具 举报 回复
发表于 2019-12-3 09:02:47 | 显示全部楼层
不错哦,有人把bootload开源出来支持下
使用道具 举报 回复
发表于 2019-12-3 09:06:14 来自手机 | 显示全部楼层
https://gitee.com/spunky_973/rt-fota
使用道具 举报 回复
发表于 2019-12-3 09:10:08 | 显示全部楼层
感谢分享
使用道具 举报 回复
发表于 2019-12-3 09:16:17 | 显示全部楼层
这个厉害了
使用道具 举报 回复
发表于 2019-12-3 09:21:09 | 显示全部楼层
支持一下!
使用道具 举报 回复
发表于 2019-12-3 10:09:10 | 显示全部楼层
本帖最后由 hnhebing 于 2019-12-3 10:11 编辑 * ]  [. s1 m4 s+ @
% Y/ r8 n; `( h" U  I
编译出来代码大小75K byte, 占用资源有点大, 管方代码<30K ,有优化空间?
) R8 N; K' Z$ v5 i5 e; _& u( v
使用道具 举报 回复
发表于 2019-12-3 10:23:20 | 显示全部楼层
hnhebing 发表于 2019-12-3 10:09; s$ P7 Q- y# F# e
编译出来代码大小75K byte, 占用资源有点大, 管方代码

& I8 C+ j- v) Z: a当然可以优化:
' `  G+ B: o0 E9 K8 F" R1. 编译选项变为-o3;
4 Z8 p; k5 L9 u! j2. 根据你的实际需求,可以屏蔽选择一种压缩方式:falslz和quicklz,或者不需要代码加密等
* \  X) J+ A# y3 Y5 Z. W% B. u) G3. 根据需求可以裁剪finsh相关功能,比如密码功能;
* @; V+ w3 g2 j$ j3 A4. 删除ymodem功能,放在应用代码中实现。. w% {/ @  w8 J3 f1 p
总之,源码在手,根据自己的需求来进行改进。我记得最小的方式应该可以裁剪在32K以内。
) X& z7 I8 ~5 T5 H9 v0 }) v6 i/ }: s# [, f, |* M# R4 l
春节有空了,我会把优化项罗列出来,进行可配置。目前这个版本是全功能的。
使用道具 举报 回复
发表于 2019-12-3 10:35:03 | 显示全部楼层
nice 我看好你哦!
使用道具 举报 回复
发表于 2019-12-3 10:43:34 | 显示全部楼层
NICE,目前RTT的不支持H7,正好看看楼主的这个能不能在STM32H7上实现。
使用道具 举报 回复
发表于 2019-12-3 11:57:55 | 显示全部楼层
whj467467222 发表于 2019-12-3 10:438 @' \, ^7 b* I/ a9 `! H6 W
NICE,目前RTT的不支持H7,正好看看楼主的这个能不能在STM32H7上实现。
- C3 U) \, T  q7 H/ N
肯定可以啊,在H7的BSP的nano基础上,把application目录里面文件加入到你的工程即可。但是串口、LED和按键要根据你的板子进行改动。
使用道具 举报 回复
发表于 2019-12-3 12:08:50 来自手机 | 显示全部楼层
6666666666
使用道具 举报 回复
发表于 2019-12-3 13:06:06 | 显示全部楼层
感谢分享,学习一下。
使用道具 举报 回复
发表于 2019-12-3 14:15:56 | 显示全部楼层
支持
使用道具 举报 回复
发表于 2019-12-3 15:42:38 | 显示全部楼层
赞一个,支持!   hash_code算法如何用的,群内大佬支持下!
使用道具 举报 回复
发表于 2019-12-3 17:33:53 | 显示全部楼层
手上有个16k以下的boot
使用道具 举报 回复
发表于 2019-12-3 17:40:08 | 显示全部楼层
也是rt-thread还是寄存器应用
使用道具 举报 回复
发表于 2019-12-4 11:09:44 | 显示全部楼层
gideon518j 发表于 2019-12-3 17:33& O! F& y' {4 H. Y' p/ l! n
手上有个16k以下的boot

  {- w' r; z+ ^5 Y& Q, k4 {! dFINSH的代码空间比较大,不加FINSH功能,代码容量应该会小一些。另外代码支持裁剪,目前是全功能的,两种压缩代码和加密代码都是使能了的。根据具体应用可以在rtconfig.h中进行设置。
使用道具 举报 回复
发表于 2019-12-4 11:10:01 | 显示全部楼层
hnhebing 发表于 2019-12-3 17:40
  U  b% Z1 N- t9 S6 z  Z6 i) t& \  Y也是rt-thread还是寄存器应用

4 `' [* w' P8 [8 r- L基于RT-Thread nano的应用
使用道具 举报 回复
发表于 2019-12-4 11:10:46 | 显示全部楼层
hnhebing 发表于 2019-12-3 15:42
( k. {; Y  Y% H7 C赞一个,支持!   hash_code算法如何用的,群内大佬支持下!

2 q9 f' P# Y. v" T" k5 r! a- y  k同问,暂时不清楚RTT官方hash_code的计算算法。
使用道具 举报 回复
发表于 2019-12-4 11:14:44 | 显示全部楼层
HelloBye 发表于 2019-12-3 05:05
# F+ H! t6 ^. E/ ]" \完成版的使用 可以做成软件包,维护和使用更方便

& d0 `4 d. Y+ g  @. ?  J4 r1 A这个建议倒是可以哈,我思考下,春节期间有时间弄一下。
使用道具 举报 回复
发表于 2019-12-4 17:18:01 | 显示全部楼层
真的有大神把我一直想做还没做的事 做了。。。
使用道具 举报 回复
发表于 2019-12-4 18:55:06 | 显示全部楼层
大佬牛逼!
使用道具 举报 回复
发表于 2019-12-5 15:50:08 | 显示全部楼层
7位QQ号,一定是个工作经验丰富的大佬。
使用道具 举报 回复
发表于 2019-12-5 20:24:48 | 显示全部楼层
这个必须顶起,完美解决当今boot开发难的痛点
使用道具 举报 回复
发表于 2019-12-6 08:52:44 | 显示全部楼层
这个可以有 6666666
使用道具 举报 回复
发表于 2019-12-19 10:49:54 | 显示全部楼层
咋这么牛逼呢相当厉害
使用道具 举报 回复
发表于 2019-12-19 11:16:24 | 显示全部楼层
给楼主点赞!
使用道具 举报 回复
发表于 2019-12-19 12:47:05 | 显示全部楼层
在当前形势下,单片机flash空间已经不是主要限制因素了,这种全功能的boot还是有很大用处的。
使用道具 举报 回复
发表于 2019-12-21 19:50:22 | 显示全部楼层
Summer_gift 发表于 2019-12-19 11:169 f) C/ D2 Y! _1 U2 e  V
给楼主点赞!

. |- c$ e6 ^( `( W" U1 x+ t# O; J我这个算是盗版你们的了
使用道具 举报 回复
发表于 2019-12-21 20:49:04 | 显示全部楼层
这篇发布很重量
使用道具 举报 回复
发表于 2019-12-21 23:06:53 | 显示全部楼层
这个老NB了,至此LZ
使用道具 举报 回复
发表于 2019-12-23 09:41:04 | 显示全部楼层
你这让官方情何以堪
使用道具 举报 回复
发表于 2020-1-10 10:01:11 | 显示全部楼层
我怀疑楼主是内部人员
使用道具 举报 回复
发表于 2020-1-10 14:21:38 | 显示全部楼层
灰大狼mk 发表于 2020-1-10 10:01* v1 }- k- {5 @& ]1 z# E
我怀疑楼主是内部人员

$ R. c3 w4 o: R, Z7 \0 D这并不是内部人员
使用道具 举报 回复
发表于 2020-1-13 16:21:09 | 显示全部楼层
我夏了夏天 发表于 2020-1-10 14:210 Q, x0 x" [9 b2 K* h/ Q
这并不是内部人员

) M8 ~7 {$ n# Z6 \% `; }1 ~一直想问下原作者,你们HASH_CODE是怎么算出来的啊?
使用道具 举报 回复
发表于 2020-1-13 16:32:14 | 显示全部楼层
Spunky 发表于 2020-1-13 16:212 z) |9 v- _, N- T
一直想问下原作者,你们HASH_CODE是怎么算出来的啊?
5 ]) _( ?. f  s# a$ e1 k) l5 N" ~4 @
你指的是用什么哈希算法?
使用道具 举报 回复
发表于 2020-1-16 22:23:28 | 显示全部楼层
我夏了夏天 发表于 2020-1-13 16:32
% ?2 ]2 l3 g6 U( S4 y4 B你指的是用什么哈希算法?
2 U- m: L8 d& i: T
是的,就是那个HASH_CODE是什么哈希算法算出的
使用道具 举报 回复
发表于 2020-1-17 10:05:35 | 显示全部楼层
Spunky 发表于 2020-1-16 22:237 M# \2 H5 _# J
是的,就是那个HASH_CODE是什么哈希算法算出的
8 w$ g- Z" r. r) r! D8 M) f
你在网上找一个通用的就可以啦
使用道具 举报 回复
发表于 2020-2-5 21:04:57 | 显示全部楼层
我夏了夏天 发表于 2020-1-17 10:05
, _9 F- c' ]! O6 M# n2 n1 B你在网上找一个通用的就可以啦
' R* r5 j4 u7 S# V+ U+ E
我是问你们官方使用的什么,以便兼容啊
使用道具 举报 回复
发表于 2020-2-6 00:23:04 | 显示全部楼层
你好,请问采用完整版rtt移植rt-fota,stm32f429不能跳转到app运行,同样的app固件使用rtt官方的bootloader是OK的,不知道是不是还有哪里需要注意的地方没关注到。。。。。。
2020-02-06_002138.png
使用道具 举报 回复
发表于 2020-2-6 20:02:09 | 显示全部楼层
superopt 发表于 2020-2-6 00:238 A4 _+ N( ]' b+ ^1 Z7 S
你好,请问采用完整版rtt移植rt-fota,stm32f429不能跳转到app运行,同样的app固件使用rtt官方的bootloader ...
: k: j- J8 l, d
你跳转前的检查都通过了吗?移植的时候你要保证FAL和EASYFLASH模块都能够正常使用。你可以把代码发过来我看下。
7 F/ D$ p. C( p% [6 ]5 Y" w% L6 {% k7 |% J
另外,我使用的打包软甲版本是V1.0.7,你用这个版本打包,应该不会出错。
使用道具 举报 回复
发表于 2020-2-7 17:17:22 | 显示全部楼层
Spunky 发表于 2020-2-6 20:02! p" `- I( }+ v& _+ }3 J+ d# f
你跳转前的检查都通过了吗?移植的时候你要保证FAL和EASYFLASH模块都能够正常使用。你可以把代码发过来我 ...
% S* v) D  V" e: Q+ W  L& ]1 h: Q
你好,我只是用了SFUD和FAL组件,跳转前的检查没有打印错误信息,应该是OK的。代码发你qq邮箱了,谢谢。
使用道具 举报 回复
发表于 2020-2-7 20:18:44 | 显示全部楼层
superopt 发表于 2020-2-7 17:17
, t3 [! A& |- \' j  \: V. V$ W你好,我只是用了SFUD和FAL组件,跳转前的检查没有打印错误信息,应该是OK的。代码发你qq邮箱了,谢谢。 ...
4 }: j  X  t1 R$ Y5 i; [: w( U
你的邮件已经收到,你发过来的不是完整的工程文件包,只是那几个移植文件和FAL配置文件。从这几个文件上看没有什么问题,但从你邮件图片看,我又几个建议你试试:/ S/ }, _+ j) ]4 g/ ?: v; c2 P
1. 截图上没有看见固件从NOR FLASH搬运到Onchip FLASH上,难道是已经搬运完成自己跳转的情况?
3 R8 S+ g- a) Q9 c! v2. 进入shell,使用fota probe命令,看看RBL信息,可以截图给我看下。
9 N# K( v: H. G& q* f3. 使用仿真器进行全片擦除,然后下载FT-FOTA固件,使用shell进行操作:
" S( P' A# k4 f7 Q9 n    1) ymdown进行下载;ymdown的主文件有个partition的设置要注意;
7 T! c0 v  W+ I1 u$ C    2) 使用fota exec进行手动跳转;
: ~  J! L/ R( q2 C+ ]6 `: W
使用道具 举报 回复
发表于 2020-2-8 12:38:32 | 显示全部楼层
Spunky 发表于 2020-2-7 20:18" l& x( t8 \8 W0 J
你的邮件已经收到,你发过来的不是完整的工程文件包,只是那几个移植文件和FAL配置文件。从这几个文件上 ...

- v' ]& B; j+ d6 v, @6 ?1、目前没有做升级操作,只是使用rt-fota引导app中的应用程序启动,rt-fota和app都放在片内flash中,通过st-link烧录;
. ^; r$ f1 N9 u/ E" K" |3 G: F2、fota probe如下图;5 o9 f4 `  ~9 g
3、已经擦除过full chip,使用ymodem将rtt打包的0.0.1版本的固件下载到外置的flash中;使用fota exec也不起作用,还是没有跳转过去。( @* _& T- E  P3 C- {7 C# @+ @

8 m& M$ }. D$ D4 q5 z- Y0 t

  E6 M2 G8 q5 S3 c- n6 u" J0 @! U$ }2 M/ K% i. b1 s# H
fota show.png
fota exec.png
fota probe.png
使用道具 举报 回复
发表于 2020-2-8 15:57:59 | 显示全部楼层
superopt 发表于 2020-2-8 12:380 A3 V/ {4 o% j; U/ ]7 C
1、目前没有做升级操作,只是使用rt-fota引导app中的应用程序启动,rt-fota和app都放在片内flash中,通过 ...
( N3 x- k$ N; |  O. @- B
你的APP的偏移设置是怎样的?包括中断向量
使用道具 举报 回复
发表于 2020-2-8 17:46:37 | 显示全部楼层
Spunky 发表于 2020-2-8 15:57* L* J$ Q- L* j+ I& U, h/ n
你的APP的偏移设置是怎样的?包括中断向量

. j: w9 w# O. `9 ~6 {7 E根据官网的文档增加了跳转函数。
2020-02-08_174536.png
使用道具 举报 回复
发表于 2020-2-8 17:47:49 | 显示全部楼层
superopt 发表于 2020-2-8 17:46
$ w5 t3 ?* z. C& i/ u根据官网的文档增加了跳转函数。
- v* P6 m6 `, L0 H% |1 }7 n" Q9 {
app的位置偏移是0x08020000
使用道具 举报 回复
12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  1. 19 主题
  2. 451 帖子
  3. 451 积分

Ta的主页 发消息

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

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