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

STM32L152的IAP移植笔记

[复制链接]
aimejia 发布时间:2018-5-25 11:07
文将针对STML152的IAP移植过程作一个笔记。5 S3 D4 O3 V8 U; k' H) d5 F$ T5 T2 I1 }

$ F0 D" |7 r: m$ ^首先得下载AN3310的示例代码,地址为:http://www.st.com/content/st_com ... /stsw-stm32075.html. c0 ]4 A# m: I% Q. N

+ u- H- w  B6 k下载完成后,我们需要做些修改,我们将在NUCLEO-L152RE板子上进行验证测试。( K8 A4 \$ T5 e" Y0 L
3 i: M5 K; P! O( l! x# `# W' P' Z
由于NUCLEO-L152RE板子默认MCU是没有外挂晶振的,但可以通过ByPass方式使用ST-LInk的8M晶振,但这里只是作为IAP,且只需要使用到串口,因此可以只使用HSI,于是,在AN3310的工程中打开system_stm32l1xx.c文件找到SystemInit函数,注释掉//SetSysClock();,让系统使用默认的HSI即可。
9 _3 ~+ {/ P; j% u4 t
  1. [cpp] view plain copy
    8 S  r: y3 X- v* B6 _" u' H* G
  2. void SystemInit (void)  
    2 E- F2 I4 L( A. B) O% a& H  Z" T
  3. {  2 d1 b3 \- o# `& z! f. U
  4.   /*!< Set MSION bit */  # {& h6 R# T4 Q) a& Z
  5.   RCC->CR |= (uint32_t)0x00000100;  
    0 f7 n5 {% Y0 E! m% k
  6.   
    0 x2 N* q' K/ e8 R
  7.   /*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], MCOSEL[2:0] and MCOPRE[2:0] bits */  & {9 L9 f* E7 |7 W
  8.   RCC->CFGR &= (uint32_t)0x88FFC00C;  
    * u2 B. ]* u' _5 z( O
  9.     m! ]; O' N# k2 s4 Y( Z% N
  10.   /*!< Reset HSION, HSEON, CSSON and PLLON bits */  + v3 B8 @6 n: M! k' P) K$ s
  11.   RCC->CR &= (uint32_t)0xEEFEFFFE;  
    ; \, H1 l5 U1 A: [9 ^" S  F
  12.   + n. r6 b+ I+ A" K
  13.   /*!< Reset HSEBYP bit */  
    % u8 p, U7 G# k6 e0 x. w
  14.   RCC->CR &= (uint32_t)0xFFFBFFFF;  # I) Y5 n: d7 x2 C
  15.   
    7 P) X4 T1 s9 G; q! Y
  16.   /*!< Reset PLLSRC, PLLMUL[3:0] and PLLDIV[1:0] bits */  
    / k* H$ t9 `, x6 m& |" N+ t3 x/ L! ], s
  17.   RCC->CFGR &= (uint32_t)0xFF02FFFF;  
    3 M+ A1 \/ S# Q3 ]7 x
  18.   
    2 L! a4 }- ^' J0 u8 s
  19.   /*!< Disable all interrupts */  
    9 L" h4 }' c" @9 R. i! E, j) U! ^
  20.   RCC->CIR = 0x00000000;  6 T5 e) C2 H% R7 C
  21.   2 f; p, M- a' C! T
  22. #ifdef DATA_IN_ExtSRAM  
    * L: I: t( l! l) X# M
  23.   SystemInit_ExtMemCtl();  
    7 w9 Y' B  q2 T) p6 O2 b# R
  24. #endif /* DATA_IN_ExtSRAM */  
    4 b# B1 z6 n6 m% i& _: E1 ^
  25.   , J8 v9 F% B6 K, A5 V7 J
  26.   /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */  ) Z$ J) W, d" a) @" n3 e
  27.   //SetSysClock();  
    * g/ @3 g0 ]5 G" g7 W9 P
  28.   
    7 }! W# G5 C/ K6 _# l- H
  29. #ifdef VECT_TAB_SRAM  
    ( ^& i0 B4 W: @+ c1 e$ I- t
  30.   SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */  ( u6 w1 Z4 v0 b. F$ [  E2 I4 k) r; X
  31. #else  
    9 j/ N0 Q0 p. A& x. F
  32.   SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */  9 u- _4 S* w8 h
  33. #endif  
    , M& Z0 h5 Z% @7 _
  34. }  
复制代码
然后修改man.c文件中的main函数,注释掉一些按键,让程序默认进入到升级模式:% Y* P4 r$ K2 v" Y2 S, T

3 A! z3 ^5 ]0 T; d) a
  1. [cpp] view plain copy
    & v0 d' x2 w, c
  2. int main(void)  
    9 A9 O' N. k9 ]6 w
  3. {  
    . \9 W" J4 {+ f" o: x, q5 `
  4.   /* Unlock the Flash Program Erase controller */  6 b9 }9 q1 A, \6 ^7 A0 H7 @+ s; P
  5.   FLASH_If_Init();  ' F! {, _% R6 x; {* |
  6.   / ^$ M% N3 Q5 b
  7.   /* Initialize Key Button mounted on STM32L15xx-EVAL board */  1 T- b- ?, M$ x
  8.   //STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_GPIO);  
    1 q; l3 v5 @5 P6 t/ f0 [% q
  9.   0 N! Z7 k4 D: G2 b$ e$ `
  10.   /* Test if Key push-button on STM32L15xx-EVAL Board is pressed */  
    $ O( v( |8 Y3 _2 u5 a
  11.   //if (STM_EVAL_PBGetState(BUTTON_KEY) != 0x00)  / Z0 c7 m( H! @: X
  12.   {  
    % u  ]4 K* @% A7 G* f  R
  13.     /* Execute the IAP driver in order to reprogram the Flash */  
    4 z2 t2 a2 k) q* _+ o3 L3 h" f
  14.     IAP_Init();  : k+ f& T! U7 s) w# f% e
  15.     /* Display main menu */  1 a  G4 f0 X5 N( [6 l6 G3 U) l6 ~
  16.     Main_Menu ();  
    & z2 g7 ~, a* ]- G5 B% u
  17.   }  2 o7 i) `0 R9 n9 |9 g+ F9 W! J
  18. #if 0  
    + Q0 \* T2 y0 }' A- E/ n- c+ W! t
  19.   /* Keep the user application running */  0 J3 c) ^1 x% A; b4 d! b8 O
  20.   else  
    , r# @. }8 y; }. ]$ L1 v
  21.   {  0 S7 o" Q( o4 E! o
  22.     /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */  ' ?5 v/ E( k0 b# k. _
  23.     if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)  
    0 C/ b8 \$ f0 C  u" {
  24.     {  : d# c, t8 D* |
  25.       /* Jump to user application */  
    ' v' w+ h: _8 d; w! }
  26.       JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);  & w: [, m, U  S7 J9 `/ @7 ?
  27.       Jump_To_Application = (pFunction) JumpAddress;  " n5 ]4 R! z" `# K
  28.       /* Initialize user application's Stack Pointer */  . S- |9 V# ]/ Z5 X  p( f
  29.       __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);  
    $ L% J- X) Y$ K* P- [
  30.       Jump_To_Application();  * o. g$ i8 ?# N# J6 m# _5 {! s
  31.     }  / F& B: v0 K9 a% L9 N
  32.   }  ( ^! g/ G* x* L0 k- [9 e
  33. #endif  5 {" _- E. ?5 i9 m, i' F
  34.   while (1)  2 H  |/ Q. P% w) [* r  H
  35.   {}  1 M6 `" F  B7 T, H- S, y" V
  36. }  
    5 t+ Q& _, v4 a
复制代码
由于NUCLEO板子默认使用的是USART2,因此需要修改使用的串口:- r1 y& g3 k* g! K% m
  1. [cpp] view plain copy& q$ I# j9 i! Y4 z. w' [! X$ k
  2. void IAP_Init(void)  
    1 h  T1 e3 [' A2 W- @8 W; `* G/ F
  3. {  ( e3 u' T* y( g
  4. USART_InitTypeDef USART_InitStructure;  5 z4 Y" U+ _1 s+ `5 o' B" r
  5.   /* USART resources configuration (Clock, GPIO pins and USART registers) ----*/  0 Z' s5 t% y# S, |3 ~
  6.   /* USART configured as follow:
    6 c. H1 b1 Y( M
  7.         - BaudRate = 115200 baud
    : W& }. ]+ U( }; M8 k6 e0 X; w
  8.         - Word Length = 8 Bits ) ?* E6 M$ Q8 g
  9.         - One Stop Bit
    2 D) C' t) H1 r
  10.         - No parity
    7 E9 a# F% k7 x, W" y; F6 u8 G2 B
  11.         - Hardware flow control disabled (RTS and CTS signals)
    - F. r0 r0 }" s# _9 q
  12.         - Receive and transmit enabled   ^/ K4 J) v# T; ]' R
  13.   */  
    + ~8 T8 n4 Q! G
  14.   USART_InitStructure.USART_BaudRate = 115200;  
    * I+ A3 o0 u: R9 D
  15.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;  
    0 S1 v1 z+ j- G, N! x: u9 f% I" e
  16.   USART_InitStructure.USART_StopBits = USART_StopBits_1;  
    ; A$ _0 S; _/ b# j) }2 F# q& ^
  17.   USART_InitStructure.USART_Parity = USART_Parity_No;  
    ) A; Q3 ~6 y, \7 L" {
  18.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  " N5 j, Y) ^( r+ x: M& s
  19.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  % U6 l0 [5 y4 Q8 Q
  20.   
      B, I& R9 ]; t, O
  21.   //STM_EVAL_COMInit(COM2, &USART_InitStructure);  5 A1 n( S6 o. Z1 s, I; ~
  22.   USART2_Init(&USART_InitStructure);  
    4 N' L6 A' F' f1 {- R, p' p# s  s
  23. }  ; Z' E; @: Z# W

  24. 7 f7 r% D( |5 g: j9 s$ M+ J
  25. USART2_Init()函数为新添加的串口初始化函数,其定义如下:+ |1 K" e8 `# }( q( r: {* m

  26. 9 B/ x0 |: m8 \% D$ h
  27. [cpp] view plain copy
    / j3 i3 H& _# }. _; e+ R
  28. void USART2_Init(USART_InitTypeDef* USART_InitStruct)  : O: ^" U: F( D/ `; L
  29. {  
    + E5 M. S" B. d0 u
  30.   GPIO_InitTypeDef GPIO_InitStructure;  
    4 V3 ^; j/ d8 W  L) X& W
  31.   
    3 r0 `) l/ E% j& m) u& E6 T
  32.   /* Enable GPIO clock */  
    . N+ |, z+ _3 F4 z' l7 P
  33.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  
    0 x3 U% h& b" h9 h- T
  34.   
    * G. M0 n7 ^% Y$ J9 L/ Z3 ?2 r0 u
  35.   /* Enable UART clock */  
    & C6 H2 x+ t4 c, {, ^& n+ ~
  36.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);  
    + z4 q. Q3 E) _- _
  37.   
    " o& g- }! o8 Y% b0 ~4 m5 a- J
  38.   /* Connect PXx to USARTx_Tx */  ! q) Z1 g! m3 P  z
  39.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);  " f$ J* q$ S3 {) G! K7 D. S
  40.   " Q- i! D8 a# B/ D
  41.   /* Connect PXx to USARTx_Rx */  0 k* h* U, Q9 r! @* x4 |1 U+ |& u
  42.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);  
    4 G% x& J1 f5 O* M( O" r+ x
  43.   
    3 V4 X) |4 }9 V
  44.   /* Configure USART Tx as alternate function push-pull */  # O! y5 y; R, D
  45.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;  
    7 u/ C! q$ h4 N& z& O# D7 W
  46.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  4 `. i% N+ P7 |$ C- ?
  47.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;  
    : [# Z& G8 o. b& `5 B+ t' o
  48.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  : [& q) s7 s! ], r1 V1 A: a4 G
  49.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  0 P3 h; o4 h$ E: h8 W2 t4 }; l
  50.   GPIO_Init(GPIOA, &GPIO_InitStructure);  ! b+ y% H  n: B
  51.     N% h; j, P6 E# e. T/ e6 e/ e
  52.   /* Configure USART Rx as alternate function push-pull */    i/ P: K; B, X2 z3 @' D' w( o. B  K
  53.   //GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM];  1 M8 R4 Y; ]) W
  54.   //GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure);  ; t' I6 z& j/ m. y/ |
  55.   1 o1 s" F1 j, _& ]) l
  56.   /* USART configuration */  
    ; C6 ~) ?( x- m4 U) M
  57.   USART_Init(USART2, USART_InitStruct);  ) g/ ^, X) d( m$ b' d
  58.   
    , p' s: i. x, U
  59.   /* Enable USART */  
    + n3 ^8 o" v+ d$ v
  60.   USART_Cmd(USART2, ENABLE);  
    ( G1 n6 T6 `7 T9 D& ]
  61. }  
复制代码
接下来需要修改程序中使用到的打印函数:! t: \. I- I2 F; l: i
  1. [cpp] view plain copy9 F7 |) `$ t; ?/ J/ w" n: S
  2. void SerialPutChar(uint8_t c)  
    ) U/ |$ X5 l; O5 H) T7 G1 [0 K
  3. {  
    4 n5 r# j" R: X( H  @# z& T7 B
  4.   USART_SendData(USART2, c);  
      ~6 }$ i3 Z0 W) W
  5.   while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)  1 y8 [. @9 h& X3 a. M4 n
  6.   {  
    & X: j8 S, t0 C- D" G
  7.   }  3 p+ ]* }) ]% I( c
  8. }  
    0 l- e9 i% k0 W3 j

  9. * c) x2 ]9 I- x7 |1 ^

  10. 3 s: d& d, h( g+ P
  11. [cpp] view plain copy! l; P: I/ N2 ~( Q
  12. uint32_t SerialKeyPressed(uint8_t *key)  ) g3 x& p- }) R
  13. {  : w5 i1 p/ G4 ]
  14.   : F( v, Q4 \$ O/ `8 e. S' S$ v2 c) d
  15.   if ( USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET)  . G: s$ h- j, ]$ s1 e1 a2 l
  16.   {  * a* x1 d' G& a* ]! N$ w
  17.     *key = (uint8_t)USART2->DR;  . F' |! w( s4 S) M) @5 Q
  18.     return 1;  2 n  [) Y9 C0 U2 K
  19.   }  2 F5 ?% o& V  d; r3 h/ r! u: R: J
  20.   else  5 h/ H6 q2 n  T% v, ^' z) d* `
  21.   {  2 v& ?/ O- q  x& c8 J' p. T
  22.     return 0;  
    ' Y+ o5 a. r) m  f( `  u0 }
  23.   }  . ^0 F& O8 z) T+ H9 r
  24. }  ' p' Y% G5 |$ E9 ^; J
复制代码
基本上就移植好了,编译烧录进NUCLEO板中运行。
. V4 T% D' Z7 |' G
) y& g7 Q5 ]; x: u9 K接下来需要找一个PC端软件超级终端。6 P% j0 q- b8 [7 J6 J) b8 \4 [
除了IAP程序,我们还得准备APP程序,由于IAP支持烧录的是BIN文件,因此,我们得生成BIN文件,HEX是不行的。
& P* \9 k. S3 B. w* G9 U
3 S- T) W2 n) E$ x& j8 K在APP工程中我们得注意几项内容,以IAR为例:: b) p7 q8 l. {, I
- v3 O2 T& P0 ]; S, Z6 I) s! o, r
1 在option->Linker下:
- N6 z+ V/ @0 X5 ^/ z) L- [, w7 a" m; E  \; |5 P" a+ S# A
  config->Edit..--->Vector Table 的起始地址改为:0x08003000
  L/ e/ M% G4 N; @9 }
  s7 C" x6 L* J' n) U  ---->Memory Regions->ROM改为:0x08003000
- v9 Z  }9 ]3 y: R0 ^1 t
6 Z5 P7 X. A3 d) e: x2 option->Output Converter->修改生成BIN文件0 o' m' E. u- a% I8 L$ [$ @* s# q, X( }
4 {8 \0 C* b( S
3  sysytem_stm32l1xx.c文件下
' c6 B7 r* Q: g' m1 b$ ?) m$ F) B" k  ?% O* }, O& O
找到宏定义4 y8 O! n% I; b3 g. v
( m& x9 E' I& S8 e2 V/ ~
#define VECT_TAB_OFFSET  0x30005 g9 Z0 z& C+ k) q9 e4 r

7 r" j4 n. {/ X  F5 ] 偏移位置必须改为0x30007 p% y( i3 u, n  T
) ?. v7 a( h* c' r. ^' a5 p
到此基本可以了,APP就这样。
* t# A. y/ |) R& x( S  ^
& K* P% L& z% G6 v  L  [7 b1 m最后就是测试了。( p  J! h' k6 B' p

" P5 }/ N  X( @4 E1 S* _测试:
$ b/ v; ~" s) P( [5 u. s* y) h  C% Z4 u4 B& d9 M) I
首先得将IAP烧录进MCU,然后再通过IAP烧录APP。
& F% M% F2 j, F, A4 f3 V
$ V" ^2 R; X; x; p8 z通过IAP烧录APP过程如下:' h- A2 `0 v1 v6 P" A3 d/ W
2 X2 d/ O2 n( I/ I6 _
打开超级终端,连接上串口,有如下界面:& p5 J% g" O' S( v2 B) p" G
* l9 t* \; v  b+ p$ ~. T6 m1 N" h
波特率:115200 data bis:8 parity:none stop bits:1 Flow control:none
* o0 V! P$ E+ l& l5 v; s" [$ c, m# H
. }' a$ k3 K) z 1.png % u* l0 e$ M* |& F/ _( y

: [! W" O! P8 }3 [- E! H通过键盘输入1:* [. Y5 V+ {5 I. Z! j" r
% L3 B8 M0 o$ d- l# G! P1 g" H
2.png 2 m; P% c/ ~; P. P5 i' q' y" r6 ]

( {9 {+ }" Z  ]$ E- p7 ^5 b' }从菜单transfer->Send file打开如下界面,输入APP的BIN文件路径,并使用Ymodem传输协议,如下图:: j! M7 ?9 A1 N- W

# Y) j0 ]9 X4 C8 \! t 3.png 7 w% k# u: y( N3 z& D; B

. o  l9 s* r& Y/ t* ?点击Send,开始烧录。。。. [0 U! t9 K) S" j/ H. w/ U1 f
& I* N0 h9 E6 X! E: e5 F% t
4.png 2 |# o- B- I5 T/ T/ H" Z% g  c) A

6 T# X7 g( C. i8 F9 H$ N传输结束后,按下3,运行APP程序,至此,整个IAP与APP都可以正常工作了。, z# H$ a( U4 J# p

1 R" [6 j# _1 P3 |  p+ _5 ~; S结束语:# M- N. [6 I% A  p% J. e
  u$ W5 @* S- V2 ]6 Y1 y& M
这个只是个示例,实际IAP是还需要修改的,得判断是进行升级模式还是直接跳过进入APP,这个就需要看设计如何了。
3 {( v9 g7 W% p3 Y
; t- p" O" ^' M+ K7 E3 q( K& A! }3 A) G" _5 Q
+ G# R" `" J0 P% @" A

: `' l2 y; g6 p" |3 H% y! ~9 G. C转载自flydream0( t: M( l# }% H% q. d1 _% {

( Q5 X# a9 A' |/ f: }% D, N& y& U  {
9 M/ }/ ?0 ^- @
赞 收藏 评论0 发布时间:2018-5-25 11:07

举报

0个回答

所属标签

相似技术帖

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