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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 10:09
环境说明:
  n5 q% S8 I& {+ k" C7 X  m5 B: z) ~6 u+ g* }) A2 y/ s8 ?. d
电脑系统:win7 64bit
8 T4 J. v% e' |' _6 w  L) t. X2 n6 I2 \0 u8 s. y
ST官方软件库:STSW-STM32111
: P6 p5 m1 \7 Z' H/ e2 |. K# e$ [* C! n7 C, Z! X2 W7 A
软件IDE开发平台:IAR for arm V7.20  W/ y& w# Z9 a$ }

" ]. v" w4 x" [6 e! {8 u上位机通信软件:SecureCRT0 v; ]9 [9 c' F4 z
1 j& L& s0 s3 F% w5 m0 g2 q% E% p" Z! a1 z

$ _- p. E5 k8 E4 E# j( V1 h: q) G实现方法:! u( m4 u* d- S: Y2 f# R
$ p# l: n8 Y% {, q& V1 x
一、修改官方软件' k. J9 O) J8 r# b1 \+ H
; v4 R+ g& p. G! E, z" v# c! ]* L: o
选定我所使用的处理器型号
+ V+ ~+ \- r; h" o; O9 u
, u% y* L% w# J  |
2018051910012216.png

: M; F8 a) C* _
# F8 H2 i/ z0 V2 H( L" h& J3 R+ ~/ H修改处理器资源和硬件端口配置
% \- i' l7 m/ |/ O! C
" R% T; g! _3 G3 X
  1. /**
    * ?0 X2 C; T3 Q1 z& `2 R6 b! ~/ u
  2. * @brief Key push-button         //PB96 G4 i) \5 r; z9 \! l+ q. Y. o
  3. */5 z5 Y0 C# ^  l+ m2 n1 N" }
  4. #define KEY_BUTTON_PIN                         GPIO_Pin_95 e9 J- ?* B7 F2 Y  {: X
  5. #define KEY_BUTTON_GPIO_PORT             GPIOB' s5 s& }0 q# x2 D' g$ |6 n- T
  6. #define KEY_BUTTON_GPIO_CLK                RCC_AHBPeriph_GPIOB  ^* f: H( U0 E" H9 L( _+ N: n
  7. #define KEY_BUTTON_EXTI_LINE                EXTI_Line9, V5 ]9 B% k) p' i; L* \! }
  8. #define KEY_BUTTON_EXTI_PORT_SOURCE      EXTI_PortSourceGPIOB* p9 w& k0 z( i" }: G/ O9 s  J
  9. #define KEY_BUTTON_EXTI_PIN_SOURCE         EXTI_PinSource9. M5 Y1 N5 n  Z  }3 `9 S
  10.   x& b' b! D" Y! D2 ^
  11. #define KEY_BUTTON_EXTI_IRQn                      EXTI9_5_IRQn
复制代码

+ T8 N, f- [3 ]5 R+ Z5 a; X; r8 T修改IAP功能触发按键端口(上电时,MCU检测到KEY_BUTTON一直为低电平,则进入IAP升级模式,否则执行用户程序)1 B$ S. ~9 B) x" }( V+ T$ q" J

; b0 \8 e( J3 g# ?2 B6 L  u
  1. /** @addtogroup STM32373C_EVAL_LOW_LEVEL_COM  ^0 [/ G- \' }$ @# n' Q  D
  2.   * @{  H# P; n6 a! ]; U3 x7 H3 J
  3.   */0 D) i6 U; G. A  l' Q
  4. #define COMn                             1: G. o) {: E5 c# t

  5. 4 ^; n* ?# `! ^  l; V& P
  6. /**
    # x( a- G( ~4 h3 l, h
  7. * @brief Definition for COM port1, connected to USART1, E! A7 p' q4 J3 V; f, Q
  8. */
      I6 V! _% X. S5 f
  9. #define EVAL_COM1                        USART1
    ; Y4 `: _. U1 `1 f
  10. #define EVAL_COM1_CLK                    RCC_APB2Periph_USART1
    * L! b1 n' h1 ?# b) r0 n
  11. . a, v+ J0 f& g6 H4 m; j3 D
  12. #define EVAL_COM1_TX_PIN                 GPIO_Pin_6/ U0 [  ^/ ~- e! v
  13. #define EVAL_COM1_TX_GPIO_PORT           GPIOB
    7 B- c9 p$ R8 r- t
  14. #define EVAL_COM1_TX_GPIO_CLK            RCC_AHBPeriph_GPIOB3 C4 i/ E: d7 }
  15. #define EVAL_COM1_TX_SOURCE              GPIO_PinSource6
    - `. E+ \0 N0 q8 y7 W
  16. #define EVAL_COM1_TX_AF                  GPIO_AF_7! Y( Q; g: Y2 f" X( H( `
  17. , J) B9 r" A2 g1 t8 {
  18. #define EVAL_COM1_RX_PIN                 GPIO_Pin_7
    0 P8 F3 R+ z" F' k! `
  19. #define EVAL_COM1_RX_GPIO_PORT           GPIOB
    . z8 I7 ~% w! J1 u
  20. #define EVAL_COM1_RX_GPIO_CLK            RCC_AHBPeriph_GPIOB
    ( I2 ~/ X9 r5 d9 r6 J8 J0 N
  21. #define EVAL_COM1_RX_SOURCE              GPIO_PinSource7
    2 F/ A' @# p3 f% u2 r
  22. #define EVAL_COM1_RX_AF                  GPIO_AF_77 L3 l2 _, B: W+ V4 L* L: O( S  L

  23. # _6 h/ ]$ ^& g; A; ^9 ~  H
  24. #define EVAL_COM1_CTS_PIN                GPIO_Pin_3
    & S( m# N8 n% t$ T* X% k
  25. #define EVAL_COM1_CTS_GPIO_PORT          GPIOD
    8 w, l7 k6 m- C2 x% _
  26. #define EVAL_COM1_CTS_GPIO_CLK           RCC_AHBPeriph_GPIOD& p3 E( J9 E6 m0 h3 a1 ?* Z6 C
  27. #define EVAL_COM1_CTS_SOURCE             GPIO_PinSource3
    4 C' P- e4 }9 L1 `  l
  28. #define EVAL_COM1_CTS_AF                 GPIO_AF_7, f/ q- `% W( y% Z8 N8 z- E

  29. * S. i/ R- Z! q% l; t
  30. #define EVAL_COM1_RTS_PIN                GPIO_Pin_44 s. k- n' P: u& _8 {; l
  31. #define EVAL_COM1_RTS_GPIO_PORT          GPIOD, I4 c: {# v* V) |* ]
  32. #define EVAL_COM1_RTS_GPIO_CLK           RCC_AHBPeriph_GPIOD( b  Y/ o- c8 y: h5 }
  33. #define EVAL_COM1_RTS_SOURCE             GPIO_PinSource4. j2 I9 T! n2 J2 i7 i) S1 i4 X
  34. #define EVAL_COM1_RTS_AF                 GPIO_AF_7: Y4 F' G- `; b+ v9 u
  35. , g5 [3 Q: ?" m5 k5 f& q
  36. #define EVAL_COM1_DRE_PIN                GPIO_Pin_8
    # t& k& D) }& C5 v9 n( c
  37. #define EVAL_COM1_DRE_GPIO_PORT          GPIOB7 V+ ~5 y, r3 \9 a  |, x; m9 R
  38. #define EVAL_COM1_DRE_GPIO_CLK           RCC_AHBPeriph_GPIOB+ g; z4 U! n: B9 h3 n
  39. #define EVAL_COM1_DRE_SOURCE             GPIO_PinSource8) l# G& ~( Q% F3 s
  40. #define EVAL_COM1_DRE_AF                 GPIO_AF_8+ _7 d- {* e2 s' H
  41. . L/ z; w9 A! ^' b$ s% R; [

  42. 1 ?! Z. L  x9 W  `, G. Q
  43. #define EVAL_COM1_IRQn                   USART1_IRQn
复制代码
) O6 M9 k/ ]# C9 @" x
再根据自己的板子,修改对应的串口,我这里使用的是USART1,注意其他包括时钟和RX TX端口也要一起修改5 j8 P5 C7 z# O# N) d
$ \$ K# _& q+ L3 @+ ^" m
  1. /* Exported types ------------------------------------------------------------*/" _7 N8 S6 m, T1 d- H5 N
  2. /* Exported constants --------------------------------------------------------*/$ ^% y6 O7 ~: {8 `5 }9 s
  3. /* Exported macro ------------------------------------------------------------*/
    ; ]( a5 J( e/ k" n
  4.   #define USER_FLASH_LAST_PAGE_ADDRESS  0x0800F000
    ( u* _& O7 |/ H$ x' s# |  G
  5.   #define USER_FLASH_END_ADDRESS        0x0800F7FF /* 64 KBytes */
    7 h, y. T7 h& W) C7 a1 P' `
  6.   #define FLASH_PAGE_SIZE               0x800      /* 2 Kbytes */" F% u$ E5 ?$ q) K0 O

  7. - P5 e3 g! e4 p; O1 b" b8 `3 [
  8. /* define the address from where user application will be loaded,# S, W+ B* p- a0 s' d
  9.    the application address should be a start sector address */
    4 r3 N# g  U" i# q
  10. #define APPLICATION_ADDRESS     (uint32_t)0x08002000
    ( A5 f: {" f+ I9 a" I
复制代码
( C, N% }* I7 T7 b! I( z  c
修改存储器的宏定义,我使用的是STM32F3C8,Flash大小为64K,其地址范围是0x08000000~0x0800FFFF+ h) e" ~( M6 A1 q& C

" m. t8 t1 i3 N3 e# m9 P" e% w8 z) \4 P每个扇区为2K,对应十六进制为0x800,我将其最后一个扇区留作存储用户数据,这样BootLoader程序和用户应用程序都可以读写这个扇区,而将0x08000000~0x08001FFF用作BootLoader程序的存储空间,将0x08002000~0x0800F7FF用作BootLoader程序的存储空间,将0x0800F7FF~0x0800FFFF用作BootLoader程序的存储空间(最后一个扇区)作为用户数据存储空间,因此可知,BootLoader程序编译后生成二进制文件不可以超过8K,用户应用程序二进制代码量不可以超过54K
' _5 g. A' H# }$ @
( Q5 w1 t' P' v5 O; V
  1. /**+ C0 n0 A2 x8 N2 j
  2.   * @brief  Print a character on the HyperTerminal8 s) `0 Q1 s* x0 Y4 A
  3.   * @param  c: The character to be printed: x! ~) p8 L  F( n4 w8 o$ |% i
  4.   * @retval None
    ( @1 K* y: p3 [7 u3 _
  5.   */
    7 Z* K' b- k. \2 b' Y& Y
  6. void SerialPutChar(uint8_t c)
    4 K  _0 B8 O$ i$ o
  7. {  c: D' K/ Y. g# v4 z
  8.   GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_SET);
    7 g) \& H5 |  q% M# V" V
  9.   USART_SendData(EVAL_COM1, c);
    * j, R1 _. x% h! x5 t7 y' Q8 c
  10.   while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {}
    " ^, Q! g) l3 F1 c8 r- c* P" N

  11.   \/ I2 b! G0 n# F4 `% |: \" T
  12.    GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_RESET);3 M+ o4 x6 k" j% M: X& B

  13. 4 N4 K2 L$ h, u8 n9 }: _1 e* J
  14. }
复制代码

- g! O/ P9 V5 w5 B& }
' w$ e9 |  d& u- A# x) d6 ]$ M修改SerialPutChar函数,在函数的开头添加GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_SET)
; \/ w! m9 R5 p# g6 v) J5 n
3 l& T$ h  y7 d, n  v设备RS-485  驱动芯片为发送模式(笔者的RS-485芯片为SN75176,硬件上睑其Pin2和Pin3的收发控制脚连接在一起)% X! U' d* |% l
  N  w! g$ v' z) z3 ?. X# O% c
在函数的最后添加GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_RESET),设置为接收模式,* n, X; u$ e5 Z' Z

- U( @% v5 L9 I( y+ f/ a注意while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {},这里要是USART_FLAG_TC,表示一直等到发送完成后,不可以是USART_FLAG_TXE(代表发送缓存空),后者会带来有些数据无法发送的问题* N" R; H9 E. a

$ M% y  W+ c6 s# A# K1 g对了不要忘记在初始化中添加EVAL_COM1_DRE_PIN的初始化代码,设置为输出模式,Pull-push,初始设置输出低电平。
+ L1 o8 Y$ R* C7 C2 {" ?: z4 h6 I. n8 p/ R- C* p3 Q
其他的不用改,将代码下载到MCU里,截止目前STM32F3的Bootloader功课已经OK。( s' Y. [+ I% Q- {6 A1 S2 H

! r7 m7 y: z. D' C二、设置用户应用软件5 j3 P" M4 A. p: X$ H

0 D& |0 N1 @/ G* n4 o
20180519102109779.png
; Z% ^* T$ T1 M* ?+ z" ^; R

* W0 q/ h) H4 n使用IAR 打开预先编写好的用户应用软件,设置其工程,找到Linker标签
" F; u. B( f* j& r9 L& B. u# s  A- u; y4 O3 g( j* Y
/*###ICF### Section handled by ICF editor, don't touch! ****/
. Y0 y7 k3 n' A" c; y/*-Editor annotation file-*/# b8 o: J$ z# K& B" q; g$ P$ K
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */5 z. a' Y% `5 Z) q
/*-Specials-*/
5 k; p- g, \, r, {$ `define symbol __ICFEDIT_intvec_start__ = 0x08002000;
, m9 h: Q( O* B+ \& X; R/*-Memory Regions-*/0 U! a6 f4 l1 `
define symbol __ICFEDIT_region_ROM_start__ = 0x08002000;& V. b9 r/ W* e5 X/ Y. g
define symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FF;
+ w$ f6 o9 {7 ddefine symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
$ N+ B5 G8 K0 [+ a! w3 o/ kdefine symbol __ICFEDIT_region_RAM_end__   = 0x20003FFF;
2 w" B# X) Y3 M5 w  Z/*-Sizes-*/% e; Y* S9 ?) T4 N! j5 Y1 c
define symbol __ICFEDIT_size_cstack__ = 0x400;
0 N/ Z4 |2 R5 H% Hdefine symbol __ICFEDIT_size_heap__   = 0x200;. G$ ?2 a( q; Z

0 ^0 m- L* e$ E/**** End of ICF editor section. ###ICF###*/* ?) |! g9 V( }$ n  A$ f' @. x
# f6 k7 R2 H1 X6 Q6 O3 D
打开内部的*.icf文件,修改
# t( h- {1 }! Q; r& A/ D
! m5 I6 o. k& udefine symbol __ICFEDIT_intvec_start__ = 0x08002000;2 A( m3 e! R0 l! [* d3 T

0 h8 K) T* F$ t9 Wdefine symbol __ICFEDIT_region_ROM_start__ = 0x08002000;# V( |# a' D% h. {8 ?* ]$ v. h
* c1 s- b4 `! o9 V
define symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FF;
! V$ s  x2 M+ r  w% X, m9 Q$ a* ~# [2 |/ _  ~0 R4 n5 W' s
20180519103921414.png
, o5 i4 S; E9 ?) n+ U: ^! x

" T$ `  j, h* K' W设置Output Converter,输出二进制文件
: D4 t. v- g, Y, \* O; G3 i1 M" g6 }  j. F$ p/ }" b0 l9 l
三、使用SecureCRT下载用户应用软件: l$ ^" o* L0 d5 v8 e& I

4 A, O& h2 ~# C0 R. ?
2018051910440932.png

/ o: j6 o4 M) y
. T2 D( S$ r- l# d' R% @设置波特率等参数,
9 T, A" F/ w7 n& t3 n! M5 z4 z/ L7 {8 h
20180519104510121.png
' ?) {9 \( j( K1 y: [
7 q! F  N7 W3 Z" R0 j( N) U
设置包字节为128,我使用FT232作为USB转RS485的适配器,FT232的内部缓存为128字节,因此我选择Ymodem包的大小为128,不过1024我没测试: N# q0 n- M0 h" B: z# D5 e1 [
, T" i% K/ l' Z2 @# ]& W4 }
串口打开后,按1进入升级模式,$ `  _0 @( b9 ^) g% _

- D$ d* j6 R' r. |/ W* J' Q
20180519104802928.png

8 u& _* g7 v0 G$ C! z/ [- ^
3 u( K7 Q, x& c# I选择要升级的文件,Add即可!6 M" w* p3 b2 ^/ R$ t$ H, v; r
+ O. e! z+ d) G

" P/ Y: T3 q& U3 ~' s) u6 b/ H
/ ~/ c, C# S: |8 \. {9 i
收藏 评论0 发布时间:2021-12-6 10:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

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