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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 10:09
环境说明:
% G! b; v  w! D" b3 v0 ~; Q7 J% m
0 K* W- a  I7 C- V电脑系统:win7 64bit5 I/ j: j9 k4 C/ `  y- M# r
+ j4 n  d* I( M- W8 }) Z' @7 |
ST官方软件库:STSW-STM32111
; Z& H" k% t; v0 q' K( u; g+ {; L( C& m. L7 p( P% c; V
软件IDE开发平台:IAR for arm V7.20
- Q- y: e8 g& J8 E7 v' K0 m2 T+ [; B( |/ V/ |! `2 [5 x! j
上位机通信软件:SecureCRT
! j6 B3 C* l2 y+ s( _5 u3 @/ S# l0 D# T5 N, R9 L& }) z

- n$ Z' ]: N% C8 J2 e) z实现方法:6 i3 h! p! \. J$ z" p
* P# m# D# s" H6 h
一、修改官方软件
' ~' L9 h  r1 B5 P0 Z" D6 y8 N
: a+ ]: s- Z5 A选定我所使用的处理器型号
/ e' u: X) |( c& l2 |" U
: B& R" M- \7 H# A" Y8 a
2018051910012216.png
3 R. ^/ y5 P1 k
  s5 K+ \% N# w
修改处理器资源和硬件端口配置1 W0 X1 `; p: @

9 P7 ?0 @' z$ g2 o9 S/ Z1 L
  1. /**
    " O' c5 T5 W  x2 @$ H: |
  2. * @brief Key push-button         //PB9- r; n8 X" O) T8 x
  3. */* t! m, p3 x1 B
  4. #define KEY_BUTTON_PIN                         GPIO_Pin_99 G* s' n+ V6 U9 H
  5. #define KEY_BUTTON_GPIO_PORT             GPIOB
    & x9 ~+ v6 r% w2 s3 V$ f
  6. #define KEY_BUTTON_GPIO_CLK                RCC_AHBPeriph_GPIOB
    ! O0 W. x+ M5 R0 r& h& O( U7 \
  7. #define KEY_BUTTON_EXTI_LINE                EXTI_Line9. Q' O+ A2 {- f
  8. #define KEY_BUTTON_EXTI_PORT_SOURCE      EXTI_PortSourceGPIOB
    # \' H) G. \: N4 j4 A! C
  9. #define KEY_BUTTON_EXTI_PIN_SOURCE         EXTI_PinSource9
    % w; ^. `3 B% |
  10. / _3 z: R# O- p  u5 O; L. U" N
  11. #define KEY_BUTTON_EXTI_IRQn                      EXTI9_5_IRQn
复制代码
/ Y) B1 b& H9 }
修改IAP功能触发按键端口(上电时,MCU检测到KEY_BUTTON一直为低电平,则进入IAP升级模式,否则执行用户程序)
  q$ {" S( h  c
! e, B& L& c+ f
  1. /** @addtogroup STM32373C_EVAL_LOW_LEVEL_COM
    8 E, F" ~# O; A7 E
  2.   * @{
    " ]; w* N3 o; x! J
  3.   */
    " R; o9 Q. r' E
  4. #define COMn                             1
    / e( D9 [- E$ z/ ]7 T$ S
  5. & [! s" [: z; M8 Z* I3 ]- y
  6. /**' I! U5 P2 Z. s" t) t9 u
  7. * @brief Definition for COM port1, connected to USART1) N8 e: ~' x) F* }# h3 a
  8. */* p- U3 I( t% v, s1 S" D. j( z: k2 u
  9. #define EVAL_COM1                        USART1
    ( i! L9 W2 A$ o# @0 G
  10. #define EVAL_COM1_CLK                    RCC_APB2Periph_USART1
    & F. f5 `" E" l7 b; r
  11.   W8 m( k$ ^7 ], ?, U/ [6 Z6 L
  12. #define EVAL_COM1_TX_PIN                 GPIO_Pin_6: s# q  V' A, }9 M" Y
  13. #define EVAL_COM1_TX_GPIO_PORT           GPIOB4 f6 j9 b3 x* K# A4 f" U
  14. #define EVAL_COM1_TX_GPIO_CLK            RCC_AHBPeriph_GPIOB/ I2 Z! L. \$ }; _' Z) y4 H
  15. #define EVAL_COM1_TX_SOURCE              GPIO_PinSource6
    & A& h8 D: {7 T: _, l
  16. #define EVAL_COM1_TX_AF                  GPIO_AF_7
    , R* c: G; u3 |% w& ]
  17. + x$ N  C6 {7 i8 K2 ~+ {7 I
  18. #define EVAL_COM1_RX_PIN                 GPIO_Pin_7
    2 Q/ w% }* |, [: i; F4 Z
  19. #define EVAL_COM1_RX_GPIO_PORT           GPIOB! S  W, g' ]* I
  20. #define EVAL_COM1_RX_GPIO_CLK            RCC_AHBPeriph_GPIOB
    ; Z2 M8 o* L6 s6 z  Q- r) }
  21. #define EVAL_COM1_RX_SOURCE              GPIO_PinSource7
    ) }1 P8 T. N2 W
  22. #define EVAL_COM1_RX_AF                  GPIO_AF_7$ g9 C7 @, H9 @: v5 U

  23. + A! n" N3 `, R5 c
  24. #define EVAL_COM1_CTS_PIN                GPIO_Pin_3
    1 o0 J/ C* T& D+ O7 G: ]
  25. #define EVAL_COM1_CTS_GPIO_PORT          GPIOD% W: Q) w6 n1 J, C
  26. #define EVAL_COM1_CTS_GPIO_CLK           RCC_AHBPeriph_GPIOD0 t' e8 p; d6 m* w
  27. #define EVAL_COM1_CTS_SOURCE             GPIO_PinSource3
    6 j, b5 v" W% c8 `
  28. #define EVAL_COM1_CTS_AF                 GPIO_AF_7
    1 o( O$ m0 [+ X
  29. + _4 p! J( P* S, l
  30. #define EVAL_COM1_RTS_PIN                GPIO_Pin_4  ?; p  H+ c' w- n  w- b
  31. #define EVAL_COM1_RTS_GPIO_PORT          GPIOD
    3 {3 E/ a7 W- i5 u
  32. #define EVAL_COM1_RTS_GPIO_CLK           RCC_AHBPeriph_GPIOD$ M, k% W3 L  }' R
  33. #define EVAL_COM1_RTS_SOURCE             GPIO_PinSource4
    * X( {' `* h& v, l0 k* C/ B
  34. #define EVAL_COM1_RTS_AF                 GPIO_AF_7. A( P4 q# p/ x+ S5 r

  35.   k( x* v& M+ z! ~- q$ y
  36. #define EVAL_COM1_DRE_PIN                GPIO_Pin_8
    # u* I- E% m; e) V, s
  37. #define EVAL_COM1_DRE_GPIO_PORT          GPIOB$ N% w' J1 l' ]7 {% M2 c
  38. #define EVAL_COM1_DRE_GPIO_CLK           RCC_AHBPeriph_GPIOB1 T6 r2 r/ G0 r  E
  39. #define EVAL_COM1_DRE_SOURCE             GPIO_PinSource8' P  k2 O/ f0 u: u; M) ]. B
  40. #define EVAL_COM1_DRE_AF                 GPIO_AF_8
    9 Z, I8 e9 P$ t

  41.   e& g" h3 f# ~: o' ?, a% g

  42. 5 m& F8 n  W5 Q* I4 U
  43. #define EVAL_COM1_IRQn                   USART1_IRQn
复制代码

6 E' _$ |' M3 a! i* F再根据自己的板子,修改对应的串口,我这里使用的是USART1,注意其他包括时钟和RX TX端口也要一起修改
* m# K% b# p: P' f/ t/ ^0 e
9 j' E2 l2 N6 W' f* L
  1. /* Exported types ------------------------------------------------------------*/7 T# b- a5 ^* t2 m, B" j6 x. x2 a
  2. /* Exported constants --------------------------------------------------------*/" q1 M' `# X, X# \5 y% c* \
  3. /* Exported macro ------------------------------------------------------------*/
    / Q9 x1 b& N) c! c
  4.   #define USER_FLASH_LAST_PAGE_ADDRESS  0x0800F000
    + w3 @4 c0 W8 I& Z. e
  5.   #define USER_FLASH_END_ADDRESS        0x0800F7FF /* 64 KBytes */
    $ l4 u: ~! p6 y  ?4 i" Y$ \: N2 Y
  6.   #define FLASH_PAGE_SIZE               0x800      /* 2 Kbytes */- U7 R8 V4 k2 S' z7 B% G

  7. 1 m, F' S; _& P* q& K2 d
  8. /* define the address from where user application will be loaded,
    2 X, P1 A2 E* L  i* I8 H4 M; |+ {; q: ?
  9.    the application address should be a start sector address */( ~) E, e+ o3 y( w7 N
  10. #define APPLICATION_ADDRESS     (uint32_t)0x08002000
    ' G$ z7 ^. z# Q; h1 j' B1 E
复制代码
- J) T: Q: L& H, g& }6 D7 d/ P
修改存储器的宏定义,我使用的是STM32F3C8,Flash大小为64K,其地址范围是0x08000000~0x0800FFFF+ W6 u) B8 |* N* y8 y0 O

, z# }) N' F& a' J9 r/ ]每个扇区为2K,对应十六进制为0x800,我将其最后一个扇区留作存储用户数据,这样BootLoader程序和用户应用程序都可以读写这个扇区,而将0x08000000~0x08001FFF用作BootLoader程序的存储空间,将0x08002000~0x0800F7FF用作BootLoader程序的存储空间,将0x0800F7FF~0x0800FFFF用作BootLoader程序的存储空间(最后一个扇区)作为用户数据存储空间,因此可知,BootLoader程序编译后生成二进制文件不可以超过8K,用户应用程序二进制代码量不可以超过54K
1 @" r/ q$ x: b- K9 i9 ]# c
' X( L. u, H2 E/ p0 Y8 f9 G
  1. /**
    2 g) S+ r+ d+ r* }  \- n( e
  2.   * @brief  Print a character on the HyperTerminal! Z# g+ s9 j, S' L8 M( s
  3.   * @param  c: The character to be printed* @# B: G( {& E/ \! Z% |/ C+ {' }
  4.   * @retval None( i% F& y! ]5 C+ p) x
  5.   */1 P6 `1 g6 f0 G: I
  6. void SerialPutChar(uint8_t c)6 m2 B# R' e$ o
  7. {
    3 o2 p0 W  e+ J
  8.   GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_SET);  _5 f/ q; g3 L5 [7 f! v- I
  9.   USART_SendData(EVAL_COM1, c);
      ~1 W! g2 m; ?, h+ i
  10.   while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {}( X# O8 M5 ^1 S

  11. - p% P$ A+ [' E
  12.    GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_RESET);
    ) ^2 ~5 |/ E: ^% H

  13.   A5 G# ?( T/ P4 |0 p" w5 v
  14. }
复制代码
9 u+ f  Z" W+ x' }/ f' R5 F$ n
# r# w' I' ]8 r! m# z7 d$ R
修改SerialPutChar函数,在函数的开头添加GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_SET)
3 S& @. F9 Z$ M5 j3 k; G
$ i: T- d3 {) s7 I/ y. [6 D- n8 e设备RS-485  驱动芯片为发送模式(笔者的RS-485芯片为SN75176,硬件上睑其Pin2和Pin3的收发控制脚连接在一起)
: s# Q+ A0 M) @$ ^6 U; P2 b' v# J  o# o! b0 H! n9 U8 t
在函数的最后添加GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_RESET),设置为接收模式,! N( }5 n# G0 S' A
) }# W* x, w. E) \
注意while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {},这里要是USART_FLAG_TC,表示一直等到发送完成后,不可以是USART_FLAG_TXE(代表发送缓存空),后者会带来有些数据无法发送的问题  d( h$ h$ t4 F; Z
2 R5 D( U; a- N% P  g7 U
对了不要忘记在初始化中添加EVAL_COM1_DRE_PIN的初始化代码,设置为输出模式,Pull-push,初始设置输出低电平。, W: B7 G3 u7 U5 S2 Q9 J

+ w5 s5 R) B, Q$ C/ w4 @0 Z其他的不用改,将代码下载到MCU里,截止目前STM32F3的Bootloader功课已经OK。
' @9 \" v8 {: S7 x5 x/ i# p: I( M/ K- Q. s8 G3 ~. q
二、设置用户应用软件& U4 G9 H) G8 E

- S9 S& s: l, W2 d) [
20180519102109779.png
' d2 _1 N3 B& L6 v9 W1 I1 z+ m

: u- L) A2 b* s. G' a使用IAR 打开预先编写好的用户应用软件,设置其工程,找到Linker标签) k/ G6 M; F( T( r9 l& I
2 H" s2 e3 [/ }$ U4 y# s$ ^3 ^0 P
/*###ICF### Section handled by ICF editor, don't touch! ****/4 e$ M- o: b. T( F4 q1 Z7 J' h: h
/*-Editor annotation file-*/
- o* ]7 @/ K3 n/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
4 v% Q5 p4 p+ t1 G/*-Specials-*/
( O3 z& R( v/ {1 |+ Tdefine symbol __ICFEDIT_intvec_start__ = 0x08002000;: ^/ {$ E+ N  x( e- ]( G
/*-Memory Regions-*/2 o1 i+ |, Q2 H
define symbol __ICFEDIT_region_ROM_start__ = 0x08002000;
5 r; P( G' P. \  ~6 `1 f* tdefine symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FF;
+ r+ c- M' w2 j: T+ N( U- D3 Bdefine symbol __ICFEDIT_region_RAM_start__ = 0x20000000;* R7 R! t. }' B
define symbol __ICFEDIT_region_RAM_end__   = 0x20003FFF;
" C' Q8 w5 m2 ]/*-Sizes-*/
( @7 x$ Q, _: I! O( u2 odefine symbol __ICFEDIT_size_cstack__ = 0x400;
& o* Y& x$ w6 vdefine symbol __ICFEDIT_size_heap__   = 0x200;6 }$ o7 j  \: {! k
% @4 A1 {( f8 P5 L5 w% q9 u3 d  p
/**** End of ICF editor section. ###ICF###*/
6 y5 M- C; R) v; `0 Y; R' ~# [2 v. b8 m
打开内部的*.icf文件,修改6 H: \' }0 ^0 h, C+ V2 c1 z8 f
7 D; ]) a8 [4 `$ V+ M* ?2 ~/ n4 `
define symbol __ICFEDIT_intvec_start__ = 0x08002000;
/ E# {! L7 h. Y$ x
) D# m" X- p. g% Q+ Mdefine symbol __ICFEDIT_region_ROM_start__ = 0x08002000;
# e! P9 k  U2 Z5 R; Q
# M+ `5 v9 g% J: x# v9 Edefine symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FF;
& z. u6 |7 m( T6 p9 v! Z
% H4 w* `: k# k! ~. \) y" ~
20180519103921414.png
  d* \5 S- ]6 n3 A+ Q7 r- |

  a) [  s7 d6 Y4 H设置Output Converter,输出二进制文件& i; R7 |. O: \+ \! e( m
9 M* Y+ z+ t1 T
三、使用SecureCRT下载用户应用软件
7 |0 r$ g; l! @
% t& R5 I3 s. Y4 z: P; L: @( b
2018051910440932.png

. c3 k$ ~, a; k6 ~
' ?4 ~' d- x$ C- k3 Y设置波特率等参数,
8 V2 i0 m5 @0 Z. ]4 e  A# i+ C$ \! {( n' h* W: g- z
20180519104510121.png

6 o; f7 ~! n1 s5 _- {  W( z3 W3 K9 z4 t0 B+ n' r
设置包字节为128,我使用FT232作为USB转RS485的适配器,FT232的内部缓存为128字节,因此我选择Ymodem包的大小为128,不过1024我没测试
  H; v$ \" r$ N2 ?' u- U/ Z/ c' A: \  j% a, |3 T- J, S% a4 e
串口打开后,按1进入升级模式,* q, N7 r! d, V# d- k3 b

! Y6 @/ d, \) T( C4 i- j
20180519104802928.png
& o) o0 ^; p- O" x5 \. g; k
6 c$ q+ }. @$ w$ T! H9 O* U
选择要升级的文件,Add即可!
- B4 q* F; n3 D  h, P( ]2 v6 B. k3 Y5 {% s6 G

6 x! H3 u6 I. I+ T
* ^6 a: }! |# d2 Z1 n! N
收藏 评论0 发布时间:2021-12-6 10:09

举报

0个回答

所属标签

相似分享

官网相关资源

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