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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 10:09
环境说明:$ k# _( o. Z0 S, M; O
; k' N9 U' M6 f' b
电脑系统:win7 64bit
6 @% i* G# t& [% m
' J" O. g# Y& [9 g/ {4 o4 _, U- qST官方软件库:STSW-STM32111
/ h- J- X4 j' V; z  K: n7 Q5 e1 j' Y! E9 K
软件IDE开发平台:IAR for arm V7.20  H* J/ I. S" U2 X$ J& G3 r
, J* R( w$ k% V* ?$ E. K& g
上位机通信软件:SecureCRT' W! e& j2 k' X2 {% e) X
+ Q; v4 C5 A. e2 A: O

; F# X' Z! U# w7 G: D实现方法:
6 i3 \$ Y$ g% u5 a1 s0 z6 Y! ]. s& `1 t+ ]2 a5 A
一、修改官方软件5 }- u+ x3 j8 v0 m- f, b  B2 }
$ u6 G& @( q6 A, k3 y
选定我所使用的处理器型号$ ^2 N' H1 M, y% w. I
8 L( |( ]% H/ O; ~
2018051910012216.png

$ X* G2 P0 a" E" e" `$ I* c
$ L* z4 ?- Z4 j' a' M修改处理器资源和硬件端口配置- [. H! ~% N8 p

( ~% u8 F" O9 ^5 c
  1. /**  L# S  K. c( g/ _
  2. * @brief Key push-button         //PB9* I& U, e/ l* J+ B! q; F# Y
  3. */4 r( m" d! f, f- c2 N1 z) w6 u% h
  4. #define KEY_BUTTON_PIN                         GPIO_Pin_9( M5 y' y% l  Y7 K; G/ Q
  5. #define KEY_BUTTON_GPIO_PORT             GPIOB
    , O5 t$ f, G/ F: D: w- @' i' t8 p/ q
  6. #define KEY_BUTTON_GPIO_CLK                RCC_AHBPeriph_GPIOB) |2 Y1 m6 u* W" W5 A- f- [
  7. #define KEY_BUTTON_EXTI_LINE                EXTI_Line9& B2 c' E$ B7 K( ^& Y
  8. #define KEY_BUTTON_EXTI_PORT_SOURCE      EXTI_PortSourceGPIOB9 K  e$ y/ S" m( u
  9. #define KEY_BUTTON_EXTI_PIN_SOURCE         EXTI_PinSource9* w3 c* I6 {( K1 N/ k% K4 K3 v1 t

  10. - R0 R# R$ r. O) d# ~
  11. #define KEY_BUTTON_EXTI_IRQn                      EXTI9_5_IRQn
复制代码
. ]* s& q! O+ k: t' Y1 ?5 W5 S) r
修改IAP功能触发按键端口(上电时,MCU检测到KEY_BUTTON一直为低电平,则进入IAP升级模式,否则执行用户程序)
0 a7 z4 h5 {5 F5 g2 l( n# }( N6 l( x" a+ ^4 y& X7 e6 C0 m' p% h& A: }
  1. /** @addtogroup STM32373C_EVAL_LOW_LEVEL_COM) Z& W" G1 H( d% V+ ]
  2.   * @{
    " v1 O/ r- h( D4 w9 V) O( H" `  y' k$ l
  3.   *// w& j/ F. J% l1 s6 q9 A& a6 z
  4. #define COMn                             1  _* q0 `$ _. O8 ^2 O
  5. 8 T7 }0 u# y" Y) [6 P; m4 S7 e6 N
  6. /**7 ]0 B2 t3 b9 p  F, `
  7. * @brief Definition for COM port1, connected to USART1
    # D" h/ F2 G: E$ ?/ @" U
  8. */
    # C) d; z8 T" J7 E
  9. #define EVAL_COM1                        USART1
    * J0 f( q( ~5 D: C4 @6 H
  10. #define EVAL_COM1_CLK                    RCC_APB2Periph_USART1
    ) v! Q/ e  q1 ]& G# p+ b- V) K

  11. " c# l, E& @( W
  12. #define EVAL_COM1_TX_PIN                 GPIO_Pin_6) n! q/ ~: S; V. J3 k4 J, o0 }
  13. #define EVAL_COM1_TX_GPIO_PORT           GPIOB
    9 i% k% i( {5 W
  14. #define EVAL_COM1_TX_GPIO_CLK            RCC_AHBPeriph_GPIOB
    " O5 M+ O6 m/ X% R3 \2 F2 m
  15. #define EVAL_COM1_TX_SOURCE              GPIO_PinSource68 o4 t: p3 h6 D% T7 N/ h
  16. #define EVAL_COM1_TX_AF                  GPIO_AF_7
    4 e5 O, x& r: }1 H
  17. " |" K! v4 ~& L3 y3 ]
  18. #define EVAL_COM1_RX_PIN                 GPIO_Pin_7
    1 j0 l6 |+ w8 M: l$ @" i! f
  19. #define EVAL_COM1_RX_GPIO_PORT           GPIOB
    $ V: n6 h- Y* @$ [1 Q! ~$ Z
  20. #define EVAL_COM1_RX_GPIO_CLK            RCC_AHBPeriph_GPIOB
    * {1 D- i+ F' y+ z
  21. #define EVAL_COM1_RX_SOURCE              GPIO_PinSource7( _' L7 P/ Z$ U8 @4 G$ N0 g5 H
  22. #define EVAL_COM1_RX_AF                  GPIO_AF_7. Q8 o  R2 J3 c4 ^

  23. 4 g! O: J" ~* V
  24. #define EVAL_COM1_CTS_PIN                GPIO_Pin_3
    + R) Z9 A+ g4 |* K
  25. #define EVAL_COM1_CTS_GPIO_PORT          GPIOD
    + h8 i& d" v/ S/ v6 l  p- z' B& d$ P
  26. #define EVAL_COM1_CTS_GPIO_CLK           RCC_AHBPeriph_GPIOD7 O: Y  }3 W! L: _4 F; u& ?9 L
  27. #define EVAL_COM1_CTS_SOURCE             GPIO_PinSource3/ |& E2 h4 S' i5 j
  28. #define EVAL_COM1_CTS_AF                 GPIO_AF_7
    + m6 P+ e5 k; n- k( z' R
  29. 7 O! z# X7 D" q7 C
  30. #define EVAL_COM1_RTS_PIN                GPIO_Pin_4
    " N* Z- @  _& V% n
  31. #define EVAL_COM1_RTS_GPIO_PORT          GPIOD
    " f( y: b( o( B0 y
  32. #define EVAL_COM1_RTS_GPIO_CLK           RCC_AHBPeriph_GPIOD
    ' f! g1 Z8 O( L" U* V
  33. #define EVAL_COM1_RTS_SOURCE             GPIO_PinSource4
    9 h7 Q- g# s: D
  34. #define EVAL_COM1_RTS_AF                 GPIO_AF_7
    - p6 a$ {8 [% _" k. u9 M. E

  35. 5 ^  k/ |( P, e$ D
  36. #define EVAL_COM1_DRE_PIN                GPIO_Pin_8
    : N% a& i, U: f8 m
  37. #define EVAL_COM1_DRE_GPIO_PORT          GPIOB$ ?) `) w: j) `& B: r" j
  38. #define EVAL_COM1_DRE_GPIO_CLK           RCC_AHBPeriph_GPIOB1 `5 H: B( n2 E/ x2 K" x
  39. #define EVAL_COM1_DRE_SOURCE             GPIO_PinSource8! Z4 `# N$ @+ b4 V2 r7 |
  40. #define EVAL_COM1_DRE_AF                 GPIO_AF_8
    ; R; @6 T2 z/ |
  41. 7 G: Z& K' X: X5 W0 c( c
  42. % {- g0 |5 B- q' W% N* Q
  43. #define EVAL_COM1_IRQn                   USART1_IRQn
复制代码
; ]7 Y& A; \5 `' \
再根据自己的板子,修改对应的串口,我这里使用的是USART1,注意其他包括时钟和RX TX端口也要一起修改
' M( ~' Q0 B4 m$ y5 S8 }: M
5 [9 S! G; r4 S- }8 d4 B" p
  1. /* Exported types ------------------------------------------------------------*/
    4 V, R" T3 v2 b/ C# z% y
  2. /* Exported constants --------------------------------------------------------*/# Z0 ~6 N4 k2 p3 y5 e
  3. /* Exported macro ------------------------------------------------------------*/+ |7 r; r5 ?" O: u  X& D
  4.   #define USER_FLASH_LAST_PAGE_ADDRESS  0x0800F000- K" f% ?1 a" H8 \
  5.   #define USER_FLASH_END_ADDRESS        0x0800F7FF /* 64 KBytes */
    . m( Y6 g# f+ q: B
  6.   #define FLASH_PAGE_SIZE               0x800      /* 2 Kbytes */
    9 r1 c4 I7 u2 P3 P$ z0 d; b9 c
  7. 7 n/ M" ]) j  n% y; j
  8. /* define the address from where user application will be loaded,6 [" m0 y% [5 a' C6 x
  9.    the application address should be a start sector address */- E" f# o5 i* m% @  ?
  10. #define APPLICATION_ADDRESS     (uint32_t)0x08002000
    # v" R' N' @0 N; U
复制代码

! @7 U3 I5 f' r8 K修改存储器的宏定义,我使用的是STM32F3C8,Flash大小为64K,其地址范围是0x08000000~0x0800FFFF
" v. N8 A$ X, r  \& i/ U' `6 j
2 }; H& l7 w" c& C$ C每个扇区为2K,对应十六进制为0x800,我将其最后一个扇区留作存储用户数据,这样BootLoader程序和用户应用程序都可以读写这个扇区,而将0x08000000~0x08001FFF用作BootLoader程序的存储空间,将0x08002000~0x0800F7FF用作BootLoader程序的存储空间,将0x0800F7FF~0x0800FFFF用作BootLoader程序的存储空间(最后一个扇区)作为用户数据存储空间,因此可知,BootLoader程序编译后生成二进制文件不可以超过8K,用户应用程序二进制代码量不可以超过54K; S3 o# m' j0 l$ P' ^

  _2 H* @' x6 A1 X
  1. /**8 H" e* r& N& K+ K7 X. d) m% L
  2.   * @brief  Print a character on the HyperTerminal
    $ C0 s+ x3 t$ K- J# n
  3.   * @param  c: The character to be printed+ g/ [: |3 E8 {4 h, b. j
  4.   * @retval None
    1 N  q" ]0 w3 _' h% D) X" ]) i: }
  5.   */
    * p* e( q# N2 f* l! z
  6. void SerialPutChar(uint8_t c)
    ! g8 V" K4 S  P
  7. {* i4 `; z- v5 n
  8.   GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_SET);
    " ~% |- P1 V( N% Q& U$ I+ t+ e
  9.   USART_SendData(EVAL_COM1, c);* L/ r- o4 `! S% ~% R' H
  10.   while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {}
    8 a& u9 m% x) M7 R1 E% c

  11. 3 U3 n3 s8 m5 B2 \
  12.    GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_RESET);% y; J- R. l, }' u

  13. 0 I3 j$ `8 w1 P( E) w
  14. }
复制代码
. P( Q  M( x$ `# c& W/ E4 _0 i! @1 m
, j& U! f7 x0 \
修改SerialPutChar函数,在函数的开头添加GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_SET)
" f5 a+ w- V' p2 @8 C! g# |8 w0 F* `" l2 \
设备RS-485  驱动芯片为发送模式(笔者的RS-485芯片为SN75176,硬件上睑其Pin2和Pin3的收发控制脚连接在一起)5 x" Y9 X2 L; i% I8 V

; t; W6 v9 ?& r在函数的最后添加GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_RESET),设置为接收模式,# u" L3 ~% k: K; Q% W
  r0 C$ M4 K/ S: a
注意while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {},这里要是USART_FLAG_TC,表示一直等到发送完成后,不可以是USART_FLAG_TXE(代表发送缓存空),后者会带来有些数据无法发送的问题
4 ?8 p) s# D" E3 h2 w' C8 W. Y
: v/ u$ \2 C" A3 I: w. o对了不要忘记在初始化中添加EVAL_COM1_DRE_PIN的初始化代码,设置为输出模式,Pull-push,初始设置输出低电平。7 k! f( z* w- Q) E

. V2 y. ~4 a: j5 C# a其他的不用改,将代码下载到MCU里,截止目前STM32F3的Bootloader功课已经OK。
! q1 S$ V% W" l9 L) |$ S% P: o) E5 X0 B8 V) P4 f
二、设置用户应用软件
' l* D% c# L1 U& N' e4 T: N. p2 x3 J/ a: S
20180519102109779.png

* X$ C1 W2 y/ _; J) W- O
. _( k4 F$ w3 n2 d% f使用IAR 打开预先编写好的用户应用软件,设置其工程,找到Linker标签  E. i7 z: z% e+ {2 `% J& \

% q/ W  r( t* b. ^4 ~: v, D/*###ICF### Section handled by ICF editor, don't touch! ****/0 N# y. J' @& Z9 |) y3 X9 F" u
/*-Editor annotation file-*/
. B5 m1 c4 G' u, }+ x/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/ }7 N, l+ Y+ p( w6 u7 K0 m/*-Specials-*/, p5 c% a5 \7 g( A8 ]) x$ }$ J
define symbol __ICFEDIT_intvec_start__ = 0x08002000;, p! ~2 v+ B! k3 V5 g2 T1 X1 T) J  _
/*-Memory Regions-*/
% e/ P, U* |% s7 J8 m2 }' fdefine symbol __ICFEDIT_region_ROM_start__ = 0x08002000;- l! i% H+ l* O5 ]) E
define symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FF;
% H! A* |5 e- n; O  N' Fdefine symbol __ICFEDIT_region_RAM_start__ = 0x20000000;% U; o" D3 j4 W: [/ |$ k
define symbol __ICFEDIT_region_RAM_end__   = 0x20003FFF;, V* m) W5 j; Y5 d, @! {
/*-Sizes-*/- u6 a" `8 T. P& n1 ^1 c& B
define symbol __ICFEDIT_size_cstack__ = 0x400;1 {9 n. N1 D( l% [; }" q4 T. I
define symbol __ICFEDIT_size_heap__   = 0x200;2 `% g1 c. d. a% Z0 O0 g( Z; R1 l
& B; @4 K( V/ [8 ^$ \" V
/**** End of ICF editor section. ###ICF###*/1 Z8 i0 p! i, K6 Z- w
& D" u0 M' d& F: W3 D
打开内部的*.icf文件,修改
) A: B  E2 J+ e$ b! [0 ~4 n# ~8 A4 A& [" u* M
define symbol __ICFEDIT_intvec_start__ = 0x08002000;
/ ~/ _5 V0 `9 g0 b" |' [
7 N3 `( o# U5 m& Z; Mdefine symbol __ICFEDIT_region_ROM_start__ = 0x08002000;
: A" t# q1 |; N6 b* H; S
) [( ]. n( U# I9 E! v# J5 l$ V$ Odefine symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FF;
1 ]: r$ o; O7 |+ ]) J7 v4 [9 t! |% V. F. @. d8 z* @
20180519103921414.png
/ D% I# h+ Q6 {! L* _8 M/ T
% f1 g* D7 z" j. {% T# g
设置Output Converter,输出二进制文件7 N- ~( u* ^) c4 _

$ g# @9 w+ ^/ q, D; |$ R) h3 W三、使用SecureCRT下载用户应用软件
$ M% O9 r! x' s+ d% g( _7 M* j& t  Z# L! A
2018051910440932.png
( X- a$ ?7 }5 e# s1 C3 d

  q: e$ w: d1 m$ U& l$ [, z0 [设置波特率等参数,
) n* @1 |0 j/ G! e/ Q( A+ Z0 {" Z$ ~# b( C, j7 H; ^# b
20180519104510121.png

/ p8 u. f. F! c( `. I" [2 M  W2 f; j$ ?; _) x
设置包字节为128,我使用FT232作为USB转RS485的适配器,FT232的内部缓存为128字节,因此我选择Ymodem包的大小为128,不过1024我没测试7 M1 v1 z6 ~' z) O
. t& N0 W2 c- a. e
串口打开后,按1进入升级模式,
0 n- D4 X4 e8 }$ t9 M! m3 c7 [  n/ t, m# p" v8 F0 b: T4 C
20180519104802928.png

1 u# ]+ K# s- J( V6 ^$ D/ p
; g4 B/ r: k; R选择要升级的文件,Add即可!7 Q' f- Q- B' X; m. K) P9 J9 X
6 f) |  _' q/ s0 `
9 a" b! P0 x0 {  C' u1 d7 F
  F. @% e* S$ u2 a! I
赞 收藏 评论0 发布时间:2021-12-6 10:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版