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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 10:09
环境说明:
. [" S# {( x2 g( C  B( H3 ]% f. T1 K) D" ~& T6 o' ?& L4 M, I
电脑系统:win7 64bit0 {1 I! S; T+ d6 K7 |/ K

) K2 R( S; }$ @" @. o: y% X) o. U' [ST官方软件库:STSW-STM32111: i  m7 B' j- N
) n. ~$ p: R' o
软件IDE开发平台:IAR for arm V7.201 {* |& n9 _$ c5 G) g+ M5 e$ s
. \3 `& m! o2 M1 E2 t
上位机通信软件:SecureCRT
& N" p( c7 t; W7 b+ [, m
) `  `* W, ^# p: M. g9 y
# J9 |& E' q6 s! ~8 o; k& P实现方法:1 w$ h' n& M# R0 `

! ?7 Y. L/ A) ~4 e: c; c一、修改官方软件
  C# ]/ y  B9 Q4 \0 n. {5 Z5 q& k$ F* J, u5 b- p5 X
选定我所使用的处理器型号# K' V0 _/ ~* ~; ?2 |) ]* O
, v; u+ a1 a% t$ V. Y) }
2018051910012216.png

7 R( H1 R! u! i5 y* i" `
6 w/ P/ i- x; x5 L修改处理器资源和硬件端口配置( K4 G8 d. x9 a- A; j

# u  m/ }  {  h! O
  1. /**
    # ~( L( l2 ?6 n; c
  2. * @brief Key push-button         //PB9' O9 L- f0 w- j/ T
  3. */( |0 [2 S$ P( U: m/ D6 a
  4. #define KEY_BUTTON_PIN                         GPIO_Pin_9
    - P2 D, B8 R7 Q) I2 i8 e5 U
  5. #define KEY_BUTTON_GPIO_PORT             GPIOB
      R5 ]: p; K: K0 ?4 B
  6. #define KEY_BUTTON_GPIO_CLK                RCC_AHBPeriph_GPIOB# h& y& G/ q1 e/ S9 m
  7. #define KEY_BUTTON_EXTI_LINE                EXTI_Line9" e' m/ }$ c. B" C$ ?( ]
  8. #define KEY_BUTTON_EXTI_PORT_SOURCE      EXTI_PortSourceGPIOB
    1 ~5 o0 o1 v2 `5 R9 h6 @8 ]0 Q5 b# ~) [
  9. #define KEY_BUTTON_EXTI_PIN_SOURCE         EXTI_PinSource9" g3 v5 e" _1 d; V& z3 D

  10. # l+ y* [9 c7 U5 c
  11. #define KEY_BUTTON_EXTI_IRQn                      EXTI9_5_IRQn
复制代码
1 S, n5 c  r: [" }
修改IAP功能触发按键端口(上电时,MCU检测到KEY_BUTTON一直为低电平,则进入IAP升级模式,否则执行用户程序). k. V  G- x9 L2 X$ R7 ^  h

( w/ z. g$ Y8 ]: {2 Z
  1. /** @addtogroup STM32373C_EVAL_LOW_LEVEL_COM" q" b( |* w8 w( @
  2.   * @{; O0 Z$ b, `. l
  3.   */
    1 K/ R0 V% ?1 }" }
  4. #define COMn                             1- l4 J2 z9 P% i4 c

  5. ' f' o( j3 ^; i: Q
  6. /**0 z8 }! ~$ w4 e) i# |
  7. * @brief Definition for COM port1, connected to USART15 K* |) c; i4 O; s" N0 ~
  8. */  m! V. l) E; j( p# w* V. G. ^
  9. #define EVAL_COM1                        USART13 {3 T  H, c% \0 t' S$ ?4 _6 C
  10. #define EVAL_COM1_CLK                    RCC_APB2Periph_USART1; `; ?$ R/ l8 F) r7 Z/ r; U( z
  11. ( r: C6 T# W+ n5 w4 W) z  `
  12. #define EVAL_COM1_TX_PIN                 GPIO_Pin_6. x, i5 `$ _' D' F
  13. #define EVAL_COM1_TX_GPIO_PORT           GPIOB! l) Y+ P7 a* N  X0 g  P
  14. #define EVAL_COM1_TX_GPIO_CLK            RCC_AHBPeriph_GPIOB
    / ]0 e! }. ~" x* o5 A2 s, {3 P2 Y
  15. #define EVAL_COM1_TX_SOURCE              GPIO_PinSource6; B0 R- I$ [' q6 V# E3 M
  16. #define EVAL_COM1_TX_AF                  GPIO_AF_7
    : }2 I# S1 I' _& I5 Q+ s

  17. 8 X/ O8 s: A) ]' w$ `9 Z
  18. #define EVAL_COM1_RX_PIN                 GPIO_Pin_7- ?. v9 R5 d& ?: j* e
  19. #define EVAL_COM1_RX_GPIO_PORT           GPIOB$ a- D, s: `  `4 |
  20. #define EVAL_COM1_RX_GPIO_CLK            RCC_AHBPeriph_GPIOB- C% m/ e1 q; ^9 l
  21. #define EVAL_COM1_RX_SOURCE              GPIO_PinSource7% A; D1 U/ h/ x
  22. #define EVAL_COM1_RX_AF                  GPIO_AF_74 m2 `& z+ `- \0 u( N4 Q& K

  23. 3 ^2 l7 F* e7 X
  24. #define EVAL_COM1_CTS_PIN                GPIO_Pin_3
    0 Y0 Y% L# Q) }1 a8 |! H* F
  25. #define EVAL_COM1_CTS_GPIO_PORT          GPIOD  S# h2 J% B, P# Q4 _( a
  26. #define EVAL_COM1_CTS_GPIO_CLK           RCC_AHBPeriph_GPIOD7 r$ b  Y/ C' _
  27. #define EVAL_COM1_CTS_SOURCE             GPIO_PinSource3. [% A- }; l, I7 S: `) N& q' J
  28. #define EVAL_COM1_CTS_AF                 GPIO_AF_7
    # Q. ^) b" F, V# C* I
  29. 4 @: U5 a6 j0 i1 N. z/ Z( s/ H
  30. #define EVAL_COM1_RTS_PIN                GPIO_Pin_4
    3 r5 v* f, o' H$ e3 w
  31. #define EVAL_COM1_RTS_GPIO_PORT          GPIOD& Z: H, K% _' f# e1 p% ~/ l& D
  32. #define EVAL_COM1_RTS_GPIO_CLK           RCC_AHBPeriph_GPIOD
    5 L- G$ v- E7 w2 g0 d( V" E0 s
  33. #define EVAL_COM1_RTS_SOURCE             GPIO_PinSource4
    0 y( L* M9 G8 r+ F
  34. #define EVAL_COM1_RTS_AF                 GPIO_AF_7* U* \6 ]1 }2 z
  35. ! }5 l0 T/ J6 S+ F7 y
  36. #define EVAL_COM1_DRE_PIN                GPIO_Pin_8; O% g$ h3 ?4 a% Z! k; h: e* t
  37. #define EVAL_COM1_DRE_GPIO_PORT          GPIOB5 e4 U! X& D6 L4 Z7 u0 E) Y9 _
  38. #define EVAL_COM1_DRE_GPIO_CLK           RCC_AHBPeriph_GPIOB
    ( w+ q; r, X/ d- l4 H
  39. #define EVAL_COM1_DRE_SOURCE             GPIO_PinSource8& y- e! O! V; u* H- K
  40. #define EVAL_COM1_DRE_AF                 GPIO_AF_89 I+ x& p: S- U) _0 Y! g: N; f

  41. 0 a. m- C8 ~) p1 T

  42. . _0 E9 `. S' Q" K* P- ]
  43. #define EVAL_COM1_IRQn                   USART1_IRQn
复制代码

4 W/ t& T) \& I- O再根据自己的板子,修改对应的串口,我这里使用的是USART1,注意其他包括时钟和RX TX端口也要一起修改' N# F& D; r0 p8 Q3 S

; A: T& O3 W; u% P& v$ X8 h* u+ R
  1. /* Exported types ------------------------------------------------------------*/; m2 U( x8 @. x/ _9 W  l0 S
  2. /* Exported constants --------------------------------------------------------*/
    ( [; O1 h& ?, I4 P1 X" N& W, S
  3. /* Exported macro ------------------------------------------------------------*/1 c+ L3 b# L. s% ~
  4.   #define USER_FLASH_LAST_PAGE_ADDRESS  0x0800F000* Y' q+ W) `$ D0 k! |7 f4 o. Q
  5.   #define USER_FLASH_END_ADDRESS        0x0800F7FF /* 64 KBytes */
    & V' }" C1 j0 T& R$ J, g# h
  6.   #define FLASH_PAGE_SIZE               0x800      /* 2 Kbytes */
    3 j8 X: n9 z: [9 U- o; I

  7. / ]3 J8 k& ~: _$ U
  8. /* define the address from where user application will be loaded,
    : q0 I7 m$ z2 J0 ]1 b
  9.    the application address should be a start sector address */) q0 y  [3 a: D* x3 I7 b
  10. #define APPLICATION_ADDRESS     (uint32_t)0x080020001 Q2 D& }* I: X8 U2 w( c6 e
复制代码
6 @% ]# |/ \. M4 J7 D% j. }
修改存储器的宏定义,我使用的是STM32F3C8,Flash大小为64K,其地址范围是0x08000000~0x0800FFFF
4 W: B3 L! Q! m$ ]( j/ l
7 M, a% I( s/ L7 D( k" v8 a每个扇区为2K,对应十六进制为0x800,我将其最后一个扇区留作存储用户数据,这样BootLoader程序和用户应用程序都可以读写这个扇区,而将0x08000000~0x08001FFF用作BootLoader程序的存储空间,将0x08002000~0x0800F7FF用作BootLoader程序的存储空间,将0x0800F7FF~0x0800FFFF用作BootLoader程序的存储空间(最后一个扇区)作为用户数据存储空间,因此可知,BootLoader程序编译后生成二进制文件不可以超过8K,用户应用程序二进制代码量不可以超过54K  v0 k$ _; U5 D
! \( d4 Q7 S2 M  D9 ]& {- {, G8 U9 v
  1. /**
    3 B0 s& u8 w& i, N& P/ E0 H
  2.   * @brief  Print a character on the HyperTerminal
    % ]' s6 c& N- y8 U; {  @
  3.   * @param  c: The character to be printed' S/ `% S% G& d6 u$ f# d
  4.   * @retval None
    ) }$ e$ c  z# B% w
  5.   */- S. I4 W, E& o$ M
  6. void SerialPutChar(uint8_t c)) A- T  I1 F. N, H' v2 D- `! p# p2 r
  7. {
    ( s( i. U5 G: c# \
  8.   GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_SET);0 M1 H! m- e9 `9 g* I1 K
  9.   USART_SendData(EVAL_COM1, c);6 g% X2 e+ a. [, H; @
  10.   while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {}
    ; @, {) I) t* j9 R. N! F
  11. - ]7 |3 o! U# M
  12.    GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_RESET);
    3 t& Z! O5 o2 D, {
  13. & ^" @+ T8 {* x9 @( H
  14. }
复制代码
1 Y" g: e4 R+ P9 T
1 _1 \( f9 M- x+ Y: @& {1 F' T
修改SerialPutChar函数,在函数的开头添加GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_SET)* s) i8 h5 P4 D4 \- h9 @" S' c; N0 Z) \

+ X; o" {, y8 C* x! J& v; Q设备RS-485  驱动芯片为发送模式(笔者的RS-485芯片为SN75176,硬件上睑其Pin2和Pin3的收发控制脚连接在一起)
! ?1 E6 w  ~$ \; |+ P' y" E% X% p" n
" G% A# L4 a# E+ J$ l% U/ l在函数的最后添加GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_RESET),设置为接收模式,
4 m) b9 |+ f! I) [( u# O- j' f/ s" Y5 }$ N) I2 K9 E
注意while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {},这里要是USART_FLAG_TC,表示一直等到发送完成后,不可以是USART_FLAG_TXE(代表发送缓存空),后者会带来有些数据无法发送的问题4 R7 R& P$ C; i- l; Q5 T
& @5 d" P& X+ q7 [  s
对了不要忘记在初始化中添加EVAL_COM1_DRE_PIN的初始化代码,设置为输出模式,Pull-push,初始设置输出低电平。2 g1 \  U* l( X
' H! I; P) w! [
其他的不用改,将代码下载到MCU里,截止目前STM32F3的Bootloader功课已经OK。
7 \4 u! c5 S& _5 w9 P. j" H& Y
& O' w6 f: [: {# r0 h二、设置用户应用软件" m9 y7 K# z1 y

* `; I0 o6 L/ y6 b
20180519102109779.png
5 R; m7 m! ?' m! K( h$ a4 W" F

* W' {/ O' P) @" I! h4 [  F( I! e使用IAR 打开预先编写好的用户应用软件,设置其工程,找到Linker标签
, f2 j* \: S/ E
, P# l, L9 H0 f0 R! a7 H/*###ICF### Section handled by ICF editor, don't touch! ****/
( R0 b, @( f5 T3 S' j3 m/ C( {/*-Editor annotation file-*/
& ]! ~; Q3 O" H8 Y8 U5 {- {3 }  C/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */( `. w) d* I8 V0 {, S2 C
/*-Specials-*/& V9 f9 k' U* u8 l' f, [( m, N" u) U
define symbol __ICFEDIT_intvec_start__ = 0x08002000;, a5 t# b8 K, s+ b' [8 L9 k9 Q
/*-Memory Regions-*/
* r/ @9 n/ x2 w3 u% Z2 Y: F5 xdefine symbol __ICFEDIT_region_ROM_start__ = 0x08002000;0 e& {3 j6 o, h2 k5 h1 W
define symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FF;% a6 `" z2 V" I
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
3 U7 i. Q# s6 a. ]: K0 Pdefine symbol __ICFEDIT_region_RAM_end__   = 0x20003FFF;+ R. @( ]  O/ E4 Y& q$ G$ L9 q: W
/*-Sizes-*/  I& ]1 y. I$ x# ~1 e( _
define symbol __ICFEDIT_size_cstack__ = 0x400;
) b* I7 k" }" y2 q% _define symbol __ICFEDIT_size_heap__   = 0x200;+ W! A6 _# D: ?8 \

' I% Q8 t, l2 W  U/**** End of ICF editor section. ###ICF###*/. _: P( D! ?' p: a! u2 z

0 Q# x& U' N1 D3 _# N- V# l打开内部的*.icf文件,修改
4 n% [) c6 f1 |9 Y3 x
) q- X, K7 y  F- D! g% R% I3 ~; Q- udefine symbol __ICFEDIT_intvec_start__ = 0x08002000;4 U. H2 u9 q2 H" i! n

2 `  B* k: [: pdefine symbol __ICFEDIT_region_ROM_start__ = 0x08002000;
. @' k* x8 e* c& z! ]0 u6 i  Y
. \3 E+ ?. _  K' e  g; ldefine symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FF;
3 s' A' ]) F4 a% |( ~* _' c. L% H( X9 z
20180519103921414.png

0 n/ g1 Q6 M5 X" u  {5 d* D7 s% D9 R: f
设置Output Converter,输出二进制文件7 H8 r1 k  {8 g/ u8 r1 }4 w/ ]

, Z5 J: i" k- V$ H" N三、使用SecureCRT下载用户应用软件
  Z+ E  X% ?+ U5 |, a2 C* x! s7 ?; `6 o
2018051910440932.png

  q9 {( K! j& Z& V7 Z/ @6 x4 T$ h/ Q4 F) X8 w+ P
设置波特率等参数,
0 `. U$ Z2 F5 }' }6 Z7 x) y3 ]# H& T) x4 q
20180519104510121.png

, A2 b* _' G6 ~1 K8 Q* V' ]' ~8 Y
设置包字节为128,我使用FT232作为USB转RS485的适配器,FT232的内部缓存为128字节,因此我选择Ymodem包的大小为128,不过1024我没测试* s2 b$ K  O- i! s

' B- _0 j7 f4 H( @. S5 `% s. J( g串口打开后,按1进入升级模式,4 }' y0 r0 ]! w" h" e, [+ I

* b  P% A- H3 z# [! R
20180519104802928.png

* ]9 G/ }" P( V# ~) ?7 B; |# f7 q9 T' E
选择要升级的文件,Add即可!
1 W& G( m2 ^6 T$ P" p% z1 F3 e$ r' m$ v' D% d
9 V8 d4 T5 @3 K- C+ A

3 X! h# `6 p' z" g, n# ]+ A
收藏 评论0 发布时间:2021-12-6 10:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版