你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】基于Ymodem协议通过RS-485对STM32F3的IAP升级

[复制链接]
STMCU小助手 发布时间:2021-12-6 10:09
环境说明:
% ?. V$ T# e. u1 M) A
* [; _" \* ]* d: B电脑系统:win7 64bit) I. y; h  y6 c8 }1 f. s" }4 L# t

$ D+ V" ~* Z/ J0 @. \ST官方软件库:STSW-STM32111! V+ E" l0 B* z& ?

& r0 s6 C, t, ?( s0 B软件IDE开发平台:IAR for arm V7.20
2 O  T" ~4 G, D- V) s' t+ s, g, k
上位机通信软件:SecureCRT8 J7 Z* v6 N9 G1 ?7 _  h4 Y, Y
* K# N5 H8 z9 B8 W; b" |

& w1 k9 B4 x- b% L7 A  B) k$ L3 G实现方法:
2 I0 K2 u$ M7 Z# L7 A: {8 W5 x4 i/ V6 L( _
一、修改官方软件
7 P) m# D, q0 z; \8 E  d
9 f" t+ X' |1 c8 l. t6 R选定我所使用的处理器型号* m# \" R( n8 `$ R5 F

9 V6 i* P7 F7 o" S. }
2018051910012216.png
) f6 d: N1 F: {! |# S1 Z1 h
6 ~$ P, |  W" [0 w5 d5 ^& r
修改处理器资源和硬件端口配置- r' Q. J7 t  v$ Z8 M% y# @7 x1 `6 p
# D8 U) p9 S6 e% e
  1. /**2 t# @. C+ ^) p4 I. Z% _
  2. * @brief Key push-button         //PB9
    . ^9 V/ F: x0 b: J
  3. */5 l3 h9 ]+ n( F/ z6 L3 @
  4. #define KEY_BUTTON_PIN                         GPIO_Pin_95 U, a. a3 S& s# l6 E
  5. #define KEY_BUTTON_GPIO_PORT             GPIOB
    & m1 A! U) f# {/ Z8 w- `) I# |
  6. #define KEY_BUTTON_GPIO_CLK                RCC_AHBPeriph_GPIOB
    1 ~8 |! f3 C  x# w
  7. #define KEY_BUTTON_EXTI_LINE                EXTI_Line9( Y0 {4 `- \5 ?  {; i" A
  8. #define KEY_BUTTON_EXTI_PORT_SOURCE      EXTI_PortSourceGPIOB
    2 W  j% m/ Z# K  @
  9. #define KEY_BUTTON_EXTI_PIN_SOURCE         EXTI_PinSource9# e7 m7 G% k% A- I6 a
  10. % b& `0 r& u! A
  11. #define KEY_BUTTON_EXTI_IRQn                      EXTI9_5_IRQn
复制代码
1 G* D0 w2 G8 _2 r& O3 y; D) V
修改IAP功能触发按键端口(上电时,MCU检测到KEY_BUTTON一直为低电平,则进入IAP升级模式,否则执行用户程序)
& v, Y: }5 C9 B! }' B7 R& F
# T3 _  p- E5 Y2 N; M
  1. /** @addtogroup STM32373C_EVAL_LOW_LEVEL_COM6 O# D- A5 e; s; G/ }9 X" j
  2.   * @{
    ' v& K! s! }" F9 b
  3.   */
    * @7 p( _& F; V, l) [- j! r5 e
  4. #define COMn                             1
    - _& y/ u& E$ d! E) L+ c
  5.   S* F" {+ Q: l/ H/ d/ D( U- P/ Q$ z, N
  6. /**
    9 R" G/ {" c: m; J  C) s. [7 f  J
  7. * @brief Definition for COM port1, connected to USART1
    4 W1 @2 b+ R. H& F6 K+ y' `* k5 A
  8. */
    5 T+ `; H' M2 V. b# m4 p
  9. #define EVAL_COM1                        USART1
    ) _; q# B" i: @# p
  10. #define EVAL_COM1_CLK                    RCC_APB2Periph_USART12 @* R0 p& m: e# Q& u/ i0 q3 B

  11. * Z) y% r. I3 T
  12. #define EVAL_COM1_TX_PIN                 GPIO_Pin_6
    $ |" X- o/ \* I; O
  13. #define EVAL_COM1_TX_GPIO_PORT           GPIOB& F  y9 B& ?! C# i' ^* X
  14. #define EVAL_COM1_TX_GPIO_CLK            RCC_AHBPeriph_GPIOB
    " u0 K: F( _( O
  15. #define EVAL_COM1_TX_SOURCE              GPIO_PinSource6% J2 ~9 o9 W$ }# M: r' P& E
  16. #define EVAL_COM1_TX_AF                  GPIO_AF_7% @! G+ b& y' U# G) m% v) A. R9 O5 I
  17. $ _! l% x$ U, p1 z; w
  18. #define EVAL_COM1_RX_PIN                 GPIO_Pin_7& X; d0 ]9 L5 u1 {0 ]* s& A3 B
  19. #define EVAL_COM1_RX_GPIO_PORT           GPIOB4 P6 i# {: y$ T3 C% p, u! H
  20. #define EVAL_COM1_RX_GPIO_CLK            RCC_AHBPeriph_GPIOB
    2 F' {; I% V( E: j
  21. #define EVAL_COM1_RX_SOURCE              GPIO_PinSource74 z: M; W2 m" ^8 c7 e% D
  22. #define EVAL_COM1_RX_AF                  GPIO_AF_7
    + r6 Y: _$ Z# u  ?. j" k* m
  23. ( \% t5 v8 ]: G) B: r/ u
  24. #define EVAL_COM1_CTS_PIN                GPIO_Pin_3. n% J( M* n* X7 u  X% W. w8 _3 W- r
  25. #define EVAL_COM1_CTS_GPIO_PORT          GPIOD
    - P! ~* g( J2 d3 P' G9 ]  P* p9 A& R
  26. #define EVAL_COM1_CTS_GPIO_CLK           RCC_AHBPeriph_GPIOD/ j- s7 R$ T' }5 J7 y& S* G
  27. #define EVAL_COM1_CTS_SOURCE             GPIO_PinSource3: P" \& z0 F4 _3 K
  28. #define EVAL_COM1_CTS_AF                 GPIO_AF_7
    7 e5 [+ M$ }- N  r# z

  29. 4 m3 r9 y% @7 [( {; Z
  30. #define EVAL_COM1_RTS_PIN                GPIO_Pin_4$ ^- z4 S3 A' `8 n9 K5 u" j
  31. #define EVAL_COM1_RTS_GPIO_PORT          GPIOD
    6 ?! b3 }" S) x& G0 N1 `: P
  32. #define EVAL_COM1_RTS_GPIO_CLK           RCC_AHBPeriph_GPIOD
    , R) `) @! C# I& @8 N# o' f4 V$ ^
  33. #define EVAL_COM1_RTS_SOURCE             GPIO_PinSource4
    5 ?# t( ^! K. T' r  Z
  34. #define EVAL_COM1_RTS_AF                 GPIO_AF_7# l- g7 v# y  x: R$ ?% E
  35. ; b" J! g; a8 X& D
  36. #define EVAL_COM1_DRE_PIN                GPIO_Pin_8
    ; x" V5 d% q& H0 S
  37. #define EVAL_COM1_DRE_GPIO_PORT          GPIOB+ f3 z9 Y. W! V6 k+ f/ H2 a
  38. #define EVAL_COM1_DRE_GPIO_CLK           RCC_AHBPeriph_GPIOB
    & y* n* m! F0 D( N
  39. #define EVAL_COM1_DRE_SOURCE             GPIO_PinSource8
    , j, w) H) c5 m  w  K7 j, d
  40. #define EVAL_COM1_DRE_AF                 GPIO_AF_8
    - T0 {9 ?$ f! T& g1 T" |0 i

  41. $ a/ {1 D- E9 e  W# Z/ W
  42. 0 D; V3 N# `% R
  43. #define EVAL_COM1_IRQn                   USART1_IRQn
复制代码
! _! T1 `7 {/ J0 X, {+ h  o- h
再根据自己的板子,修改对应的串口,我这里使用的是USART1,注意其他包括时钟和RX TX端口也要一起修改
( J' D9 P3 m3 t/ h( r5 X+ P( ~
& W2 F& H$ P! d9 O
  1. /* Exported types ------------------------------------------------------------*/
    . W: e: @1 m7 T" _: ~
  2. /* Exported constants --------------------------------------------------------*/3 c9 d& j- x8 [9 }: T. o
  3. /* Exported macro ------------------------------------------------------------*/
    4 [, E( c# N5 K, s* N& O8 X5 F$ C
  4.   #define USER_FLASH_LAST_PAGE_ADDRESS  0x0800F000
    # R% K& C* @: A$ h: e
  5.   #define USER_FLASH_END_ADDRESS        0x0800F7FF /* 64 KBytes */% [. ?  \8 E" f
  6.   #define FLASH_PAGE_SIZE               0x800      /* 2 Kbytes */
    0 Z' G5 P& P- m* ?
  7. * H: V/ T) T$ g4 _6 G" ?( b3 g
  8. /* define the address from where user application will be loaded,
      K1 \: r2 Z2 H* w/ n' @
  9.    the application address should be a start sector address */
    * V9 V( |6 q+ m, S* I: Q/ D
  10. #define APPLICATION_ADDRESS     (uint32_t)0x08002000( a/ v; T0 c+ B9 L( c9 g; w
复制代码
5 @* ^: i3 K) A& W
修改存储器的宏定义,我使用的是STM32F3C8,Flash大小为64K,其地址范围是0x08000000~0x0800FFFF5 @8 L# [8 `3 K! d6 _
2 U# I" a9 j. H; t. Q* N4 |0 v
每个扇区为2K,对应十六进制为0x800,我将其最后一个扇区留作存储用户数据,这样BootLoader程序和用户应用程序都可以读写这个扇区,而将0x08000000~0x08001FFF用作BootLoader程序的存储空间,将0x08002000~0x0800F7FF用作BootLoader程序的存储空间,将0x0800F7FF~0x0800FFFF用作BootLoader程序的存储空间(最后一个扇区)作为用户数据存储空间,因此可知,BootLoader程序编译后生成二进制文件不可以超过8K,用户应用程序二进制代码量不可以超过54K
# t! {4 \: D6 P0 Z4 m( ~5 B; f- i* S2 r! L$ ]; d8 Q
  1. /**
    2 ~5 |) c9 G, c/ Z
  2.   * @brief  Print a character on the HyperTerminal
    ( |6 h& T; G2 ~$ H/ Y. z( p# W
  3.   * @param  c: The character to be printed
    9 ~+ H+ ]: `: e: x1 q
  4.   * @retval None9 J. R5 b3 ~9 [+ y) ]  }) V
  5.   */9 `  p9 q7 l2 m6 W
  6. void SerialPutChar(uint8_t c)
    : ?( H4 z0 t9 S9 `
  7. {) f  p; z/ r$ A% }$ O
  8.   GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_SET);+ ?' `7 k" S+ L* B" v* S* q
  9.   USART_SendData(EVAL_COM1, c);
    5 O! Z% `5 k% ]
  10.   while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {}& w& X7 M, s- L* ^5 s

  11. ( E8 e0 m$ G" W- O6 p
  12.    GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_RESET);
    5 X4 y  m+ `% X
  13. 8 A1 L1 k3 W1 L7 U5 K
  14. }
复制代码

. U- Q+ X& |8 u
* ^! A" M# i$ W9 d0 K! l修改SerialPutChar函数,在函数的开头添加GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_SET), F. a, D- u2 U: {( b

. }" [2 [+ a8 A) Q设备RS-485  驱动芯片为发送模式(笔者的RS-485芯片为SN75176,硬件上睑其Pin2和Pin3的收发控制脚连接在一起)6 n; r9 v! N! B# T! o! V& M

( ^/ H6 w( x/ `' D在函数的最后添加GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_RESET),设置为接收模式,
; l. P* z% H; z/ h% g! ?+ R& y6 t
6 A( g6 g, J5 S注意while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {},这里要是USART_FLAG_TC,表示一直等到发送完成后,不可以是USART_FLAG_TXE(代表发送缓存空),后者会带来有些数据无法发送的问题% G! W! I6 A  N4 T" L7 s
0 l# J# ~* d5 R
对了不要忘记在初始化中添加EVAL_COM1_DRE_PIN的初始化代码,设置为输出模式,Pull-push,初始设置输出低电平。2 k2 L" @0 T" K% F5 y( U

% P; F+ z' `- [其他的不用改,将代码下载到MCU里,截止目前STM32F3的Bootloader功课已经OK。
+ f# H6 P( p& I" k( e; }5 e, t
2 @) Z3 ?- d4 i8 E! c二、设置用户应用软件4 x& @7 `/ G3 h
: o$ |1 A3 O+ w
20180519102109779.png

6 ~, G& B9 B8 Z6 w' |6 Y7 G; f9 Q
. ^0 {: L9 J& s' E使用IAR 打开预先编写好的用户应用软件,设置其工程,找到Linker标签
2 a) B$ d  K# S6 q( X% ]- e) l5 T" n! A8 e8 J& o; r
/*###ICF### Section handled by ICF editor, don't touch! ****/* c6 z% e8 l4 F3 F6 k# \: \7 |% Q
/*-Editor annotation file-*/
$ A% s% w$ G0 z" k/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */" t2 U9 q# A) @8 v
/*-Specials-*/
$ n* b; V' D$ ~& A- z! F6 A! wdefine symbol __ICFEDIT_intvec_start__ = 0x08002000;
, I. r3 ^8 n! r* c6 L/*-Memory Regions-*/+ g/ K7 _6 G* M) z3 S6 p, G9 R% U4 `
define symbol __ICFEDIT_region_ROM_start__ = 0x08002000;  w5 A: f) q- e7 F& ], J
define symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FF;
& [5 d! t1 z4 U9 pdefine symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
/ z# A5 }6 X  wdefine symbol __ICFEDIT_region_RAM_end__   = 0x20003FFF;, b1 J- W( m* T. C
/*-Sizes-*/1 E  `- u5 I/ P% o7 ^% `' x* m
define symbol __ICFEDIT_size_cstack__ = 0x400;
+ ]: I7 d! e/ b& T) E2 ~define symbol __ICFEDIT_size_heap__   = 0x200;
2 {' f/ |3 d6 {- q. j0 M8 V  q' }1 g4 H6 _
/**** End of ICF editor section. ###ICF###*/
: B  G( T/ v' w, R. L5 i* Z# z, G; \; V1 I- h9 a# @
打开内部的*.icf文件,修改4 l4 ?8 q8 E9 ^

6 M  x) P2 B$ Pdefine symbol __ICFEDIT_intvec_start__ = 0x08002000;
8 n1 o( W! ~" m9 v6 \) `/ I
5 u4 V7 C; Z; K$ y; c* L+ Udefine symbol __ICFEDIT_region_ROM_start__ = 0x08002000;, }) j+ L( p6 E0 |3 e
: y, j2 F$ Q5 |" o
define symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FF;$ d* U' {0 e- S2 C2 ~, ]$ h
+ {0 t. R. ~9 K5 w$ V! ~3 z
20180519103921414.png
: o) ~4 }) `1 V  K& n; J  n

" s& O5 W: d0 X6 B+ [/ N1 @设置Output Converter,输出二进制文件
5 B9 [  _/ [" k+ W3 W* A# O% [  t  u& x" A
三、使用SecureCRT下载用户应用软件3 H# `+ a9 J% Z7 i  b7 ?$ U7 B
* |7 R& X3 e5 r8 q
2018051910440932.png
: W  R& q3 \. q' i5 k* b, V

- ]3 j0 l% q% N/ h设置波特率等参数,* m! A) _' M" o: ~5 S7 R! v" B

/ ]  Y7 Q8 F( }2 d9 w0 j0 l  S
20180519104510121.png
$ B; K5 w" m* e6 R4 H- D( u5 W& \7 H
& _6 c# q) b% t+ G- v
设置包字节为128,我使用FT232作为USB转RS485的适配器,FT232的内部缓存为128字节,因此我选择Ymodem包的大小为128,不过1024我没测试! M1 R% K6 {6 R: i0 V& z1 B
0 a! t- H5 I1 g7 D7 C2 E" X8 f
串口打开后,按1进入升级模式,( ]  t! |6 k) m+ G" g
8 r0 Y7 {8 R% g. j( l! [
20180519104802928.png

6 ^! t, w1 n8 q: T; w; K7 b' A4 x, m8 d* X4 ?
选择要升级的文件,Add即可!
0 a( C! G& Z, F
  H2 }  q7 r3 i& ^# T  e
  I5 r$ s3 p) W& k2 {
! \+ a2 \9 R* f) e( x8 L" z
收藏 评论0 发布时间:2021-12-6 10:09

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版