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

STM32L152的IAP移植笔记

[复制链接]
aimejia 发布时间:2018-5-25 11:07
文将针对STML152的IAP移植过程作一个笔记。& @* p. p$ o" I  r: D6 f1 E+ r  Y
& `8 R( R  V2 N. l" I4 H9 s$ d
首先得下载AN3310的示例代码,地址为:http://www.st.com/content/st_com ... /stsw-stm32075.html4 I) C* y* C- Y& m2 B- @3 P; m

- g" N. t1 o( Q下载完成后,我们需要做些修改,我们将在NUCLEO-L152RE板子上进行验证测试。
0 l1 _- f0 X) P. _& a- ]8 n7 @) i9 k, r4 d
由于NUCLEO-L152RE板子默认MCU是没有外挂晶振的,但可以通过ByPass方式使用ST-LInk的8M晶振,但这里只是作为IAP,且只需要使用到串口,因此可以只使用HSI,于是,在AN3310的工程中打开system_stm32l1xx.c文件找到SystemInit函数,注释掉//SetSysClock();,让系统使用默认的HSI即可。
7 n7 o& V/ @5 A+ H# k8 v* O
  1. [cpp] view plain copy
    * C6 q9 Z% E# |6 v; I* C
  2. void SystemInit (void)  
    ' M' t$ Y! W4 I% \, e" ?8 y
  3. {  
      |1 {- r* u7 v( X6 m5 B" p
  4.   /*!< Set MSION bit */  
    . S) ?; e2 ^. E* \7 C1 j  B5 `& P
  5.   RCC->CR |= (uint32_t)0x00000100;  : D# P2 B% m4 g- T, ]+ Y
  6.   1 G, ~9 r5 w: j$ D5 S
  7.   /*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], MCOSEL[2:0] and MCOPRE[2:0] bits */  7 U+ T( L( d: ]5 L" A
  8.   RCC->CFGR &= (uint32_t)0x88FFC00C;  
    4 b7 m  g2 \) ?- M0 c! G
  9.   
    . a& T( j, w; Q
  10.   /*!< Reset HSION, HSEON, CSSON and PLLON bits */  
    : b. P7 n; A, _- {1 L) ?3 a  {
  11.   RCC->CR &= (uint32_t)0xEEFEFFFE;  
    ' t7 h* a1 T2 x8 ^/ a1 A
  12.   
    5 j9 t$ w# n% z/ m% B
  13.   /*!< Reset HSEBYP bit */  
    9 B5 V; }' ^5 B" O2 e
  14.   RCC->CR &= (uint32_t)0xFFFBFFFF;  - I. u. C+ u: F! X' d
  15.   ( N3 P6 ^* i1 d7 H8 Q
  16.   /*!< Reset PLLSRC, PLLMUL[3:0] and PLLDIV[1:0] bits */    `( t3 s4 X: v2 U8 g, B
  17.   RCC->CFGR &= (uint32_t)0xFF02FFFF;  ; |4 E) h. X7 C$ M+ R; ^2 [
  18.   
    ( C/ M% @- U' d4 w
  19.   /*!< Disable all interrupts */  % f* x: B$ `* h8 f) v* |+ z
  20.   RCC->CIR = 0x00000000;  9 V" B$ z3 V2 Y* ?* e
  21.   
    6 C. U  ~" O, Z2 H" q/ v" w+ o
  22. #ifdef DATA_IN_ExtSRAM  
    ' ^7 v; u  x) [6 x* p
  23.   SystemInit_ExtMemCtl();  2 V* V& T# b* M3 g& `, h
  24. #endif /* DATA_IN_ExtSRAM */  
    3 A; @  m9 [% E+ F3 {' b( Z
  25.   & [# N: ]( {, B3 Y% Z8 f
  26.   /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */    J, s% g2 H6 ]( o# z
  27.   //SetSysClock();  ; w) Z' E) i5 P5 a9 w
  28.   
      ]1 |' g1 j9 D$ c' Q; h% f: `( f) h
  29. #ifdef VECT_TAB_SRAM  
    * H5 k- m5 a- @% F
  30.   SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */  * V$ E5 c. V' B! x7 a
  31. #else  9 p) N6 q* Z9 o" n/ M
  32.   SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */  + S8 n1 C$ y* D1 c. E  f- [
  33. #endif  0 A9 d0 c- W& {# H: z
  34. }  
复制代码
然后修改man.c文件中的main函数,注释掉一些按键,让程序默认进入到升级模式:
- R4 F8 N% ~, p: T6 W, Y$ P3 r( Y" \4 _7 t2 `* g" L
  1. [cpp] view plain copy
    , `8 O3 r/ F" _$ B7 @0 P
  2. int main(void)  + V) k; K! r: i' A
  3. {  % d0 i3 ?3 \) I0 E- K; R. [) A
  4.   /* Unlock the Flash Program Erase controller */  " y* v8 }' M; g# G: Y
  5.   FLASH_If_Init();  + l$ u, Z- K/ o6 D0 t9 L
  6.   
    # @  `* C" W1 i3 _9 ^- g2 d' V
  7.   /* Initialize Key Button mounted on STM32L15xx-EVAL board */  
    8 W% q- p* j; i# \; |( h
  8.   //STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_GPIO);  
    : e  o3 ^8 Y0 b7 O5 t6 T8 m
  9.   
    . a* D7 |* z, G5 h- ~2 v& i
  10.   /* Test if Key push-button on STM32L15xx-EVAL Board is pressed */  
    2 R' a. x7 n0 i5 t, b
  11.   //if (STM_EVAL_PBGetState(BUTTON_KEY) != 0x00)  
    ! v2 g) W( R5 k# Y$ m7 q( D9 p
  12.   {  
    : d, {% B) I* c, V
  13.     /* Execute the IAP driver in order to reprogram the Flash */  
    * Y9 v2 {0 M: Y- k  K
  14.     IAP_Init();  $ d9 {- ]! f# N( Q: x; X2 x( P
  15.     /* Display main menu */  / k# T- T& k; e! [' X0 t& ]0 d0 p
  16.     Main_Menu ();  " M/ `6 {$ B7 G& ~
  17.   }  4 o: n0 U6 B6 g( }6 ^2 O( ~) j0 \
  18. #if 0  ! s* t" Q9 s6 Y8 f$ _" a  Y
  19.   /* Keep the user application running */  8 M8 T9 ~- S) e: p
  20.   else  
    ; Z7 z2 K! ^+ s; R1 x* y' U0 @
  21.   {  
    6 e9 R5 B" K$ _! a/ Q7 K
  22.     /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */  : `- m- V7 W+ k7 H6 z
  23.     if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)  9 v% [* o0 c7 k7 d& V' a0 p+ o
  24.     {  0 D: }& D" W, h  B; e+ c
  25.       /* Jump to user application */  % `3 H6 C  }& p
  26.       JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);  . g  m( J1 n4 F. h1 i( [: ~
  27.       Jump_To_Application = (pFunction) JumpAddress;  
    $ X% v* m5 R  K8 @( ]) T8 M
  28.       /* Initialize user application's Stack Pointer */  ; K- F2 N& g: l( s4 K6 y: f  D0 g
  29.       __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);  : ?, G9 s- ?, U" t$ v, E
  30.       Jump_To_Application();  
      t. H" O% `: m
  31.     }  # j9 p% v, P( e) q
  32.   }  
    & H! s4 U. i# q, q! J9 }$ V. [
  33. #endif  4 {  T% I* w, r
  34.   while (1)  
    * c  A' W3 [* R3 G( `5 Q8 M$ _! N; @
  35.   {}  . n6 H& H+ _, E
  36. }  0 u+ i" j4 U2 K# z% w3 f
复制代码
由于NUCLEO板子默认使用的是USART2,因此需要修改使用的串口:
0 O+ }- M+ V! g8 ]+ [1 N
  1. [cpp] view plain copy7 x' |5 V% S8 S, G
  2. void IAP_Init(void)  
    . M% W* |1 q3 I* Z3 ^
  3. {  8 c, C. }- x% C6 v' y
  4. USART_InitTypeDef USART_InitStructure;  
    % U/ I8 d5 L# t- `" J$ f9 _- C3 ^6 D
  5.   /* USART resources configuration (Clock, GPIO pins and USART registers) ----*/  7 R* H8 L+ g) i8 V
  6.   /* USART configured as follow: 2 S+ S/ e6 ~0 r# r% R
  7.         - BaudRate = 115200 baud
    5 P: V6 q1 c0 Q2 a; y
  8.         - Word Length = 8 Bits
    3 e8 o( k% E& X$ `5 T0 E+ f
  9.         - One Stop Bit
    6 j4 ^( C3 w2 \* ^4 I3 V  ~
  10.         - No parity 0 |4 `3 r& v( J8 E7 a* A
  11.         - Hardware flow control disabled (RTS and CTS signals) & N# q, b7 D3 e( r# R' i1 \7 X
  12.         - Receive and transmit enabled 2 [0 f( R. q$ Y( O! D, U8 Q
  13.   */  
    6 |8 Z* K) \9 ^- u9 A% D
  14.   USART_InitStructure.USART_BaudRate = 115200;  ! i( ^4 Y5 w" }5 N2 @9 s/ t
  15.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;  ( v* I3 `( |- y" K
  16.   USART_InitStructure.USART_StopBits = USART_StopBits_1;  0 m% `) E& `/ G( R8 @
  17.   USART_InitStructure.USART_Parity = USART_Parity_No;  1 T: k3 ]+ b/ t0 B6 F! i2 W
  18.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
    & [9 \5 [: H& _7 S8 a
  19.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  
    $ i5 O( \% ^3 d- Y
  20.   0 F3 V$ Z* v9 b# ?- D/ a$ ]
  21.   //STM_EVAL_COMInit(COM2, &USART_InitStructure);  ; b; {" j" q2 c1 a5 K$ d$ j
  22.   USART2_Init(&USART_InitStructure);  3 S( z" \: O. t! h# z* d
  23. }  
    3 \% B( v  {: t7 c5 C5 Y" a6 `' l
  24. 9 [% s4 R2 X6 |% K
  25. USART2_Init()函数为新添加的串口初始化函数,其定义如下:
    8 {3 v, h9 N) |5 z

  26. " s3 Y% m: c$ y2 ?( h
  27. [cpp] view plain copy5 T! S- h$ v% X- W3 k  I  a8 r* i
  28. void USART2_Init(USART_InitTypeDef* USART_InitStruct)  
    % ]& U0 S& A* n3 }( |
  29. {  & C: O9 z+ T* X8 p* C. H+ T: H- m
  30.   GPIO_InitTypeDef GPIO_InitStructure;  
    ; t1 k+ Z( g: O, {8 _# {" W
  31.   : E+ e& [2 R" s( P2 }6 x+ ?
  32.   /* Enable GPIO clock */  - w, u# [9 [  M7 c
  33.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  + X- E1 S: b" X
  34.   
    % Z2 F6 t; N" H: ]' w
  35.   /* Enable UART clock */  8 }3 O: x6 {' a4 n: s( M8 O0 P3 x
  36.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);  ( s. R* R9 n* f0 j2 j! v, X$ d
  37.   
    0 t3 \* M" I1 w) c# i- _: q
  38.   /* Connect PXx to USARTx_Tx */  * G' \) g  J8 s: w1 [: v6 B
  39.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);  
    2 L' k) ~6 D( i, t4 l" k- E5 O* M
  40.   4 O0 q$ C- f) t/ q
  41.   /* Connect PXx to USARTx_Rx */  & Z2 P. X/ _8 B! A: ]
  42.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);  ! j0 r$ y/ o3 c
  43.   # c% h& h, q8 g. m
  44.   /* Configure USART Tx as alternate function push-pull */  5 c  e3 _3 |& F  C/ ]
  45.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;  % G7 l1 g' P4 A5 n
  46.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  5 P* D2 t2 k  i
  47.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;  6 t, I' q& j) S, o
  48.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
    2 u, @1 s# i6 K. B/ f
  49.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  $ l( F; \' J* K9 S6 v7 e
  50.   GPIO_Init(GPIOA, &GPIO_InitStructure);  5 J5 ]. ]# u! z$ F+ s
  51.   
    ! l2 y; V9 Q) @/ y! S' Q  o
  52.   /* Configure USART Rx as alternate function push-pull */  
    % }; X  ?, r8 l, E" G, n
  53.   //GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM];  
      ?' `1 f8 l/ H6 x7 {
  54.   //GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure);  $ R7 y" L3 y6 z/ @5 n6 |- O
  55.   
    2 \& O2 D+ ]1 c$ r) W
  56.   /* USART configuration */  
    # L$ R! K3 b" M; N3 j: V: w3 }
  57.   USART_Init(USART2, USART_InitStruct);  - J! {1 S* @* b7 e
  58.   # i. n/ m+ j9 i; ~5 w
  59.   /* Enable USART */  
    + e, ^8 @. |4 s; t* n- H: r
  60.   USART_Cmd(USART2, ENABLE);  
    2 Y5 B: d2 x3 g; {7 w. |
  61. }  
复制代码
接下来需要修改程序中使用到的打印函数:
" v9 [& c# }/ K1 ?8 C
  1. [cpp] view plain copy
    2 O3 i. ]4 R* N
  2. void SerialPutChar(uint8_t c)  5 w, T% k) w4 L! z0 W$ C
  3. {  ' s$ ?3 P1 |" ], r: ]& z4 \8 Q& B
  4.   USART_SendData(USART2, c);  
    - V; _! J- F% q' O1 C& j/ K, U
  5.   while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)  
    2 e% `3 x3 e1 _- {
  6.   {  # G: |- L# e; i$ L  U& d
  7.   }  
    , l/ p) j) T& c* a& P
  8. }  4 @) d' \/ _4 o1 \  n% S- |

  9. 8 f* P5 x8 V. q0 z; q8 q
  10. $ G# i- p' G$ q3 z& j% Y. w& _
  11. [cpp] view plain copy
    ( G8 ^# i! q* Q. n4 g! ^3 p
  12. uint32_t SerialKeyPressed(uint8_t *key)  
    . g% S4 ~* A6 `# o9 Y
  13. {  . z8 B; A3 _! J8 M  E$ V/ v
  14.   7 ^5 U$ \% y2 M+ M& }5 s" C3 l
  15.   if ( USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET)  * o8 f7 g' Q) Q. T
  16.   {  
    ) p9 E5 K* p9 z5 F. }
  17.     *key = (uint8_t)USART2->DR;  ; v, k( Y3 [& H# N
  18.     return 1;  7 j( p# b% v5 ?+ i5 \
  19.   }  
    & G$ `0 }9 Q7 {0 H# c4 L5 W
  20.   else  / y4 u1 m) e# r8 J% w8 ^
  21.   {  ; W: Z& o0 y/ L; V9 [5 a
  22.     return 0;  1 U4 E6 I! U+ c4 I5 y# t
  23.   }  : {# ^, I! P. }; h  n& C
  24. }  # |& \: i3 q2 ^
复制代码
基本上就移植好了,编译烧录进NUCLEO板中运行。
, V; G* D/ S6 S  l" K! Z  h- z1 G; Y7 R/ z% H% G7 s! L3 |
接下来需要找一个PC端软件超级终端。
4 `4 C- b2 Q5 a: i: y除了IAP程序,我们还得准备APP程序,由于IAP支持烧录的是BIN文件,因此,我们得生成BIN文件,HEX是不行的。& f% O& {' I! m5 l9 o3 K% V
) V: W9 u) Z% S1 r! E) ~$ L
在APP工程中我们得注意几项内容,以IAR为例:% b2 w9 ]' o! M' J0 U( R6 F! O
) P! J+ t' U# s) j% s# E  _
1 在option->Linker下:
6 V4 X' ]$ q, J; ?* T. J
0 |" |1 Q- S  P  config->Edit..--->Vector Table 的起始地址改为:0x08003000
/ j# t0 f7 ~4 L0 Z5 R4 y3 s1 B
/ K3 [& q0 t  Z% R  ---->Memory Regions->ROM改为:0x08003000
; w) {7 Q" q/ R# U3 A% b3 d& [; V& ]6 p: @& O0 |0 d( ?
2 option->Output Converter->修改生成BIN文件
, u- y: O1 q1 |& W, a
0 {/ ^4 t/ z! D8 x, V3  sysytem_stm32l1xx.c文件下" G* k$ C; i  C* w: u

' ]. u/ D4 I! P0 B2 { 找到宏定义
' J1 |/ }- d. U5 n# j- @! \2 c
! Z9 M, t0 F1 {9 M' w1 t#define VECT_TAB_OFFSET  0x3000) C4 ~; f9 a1 E# U7 C

% ]: U* m. i# V( [6 K  f 偏移位置必须改为0x3000
9 P! Y. C( a; Y# L/ t" @: r2 |
  T  [+ r3 c8 X5 g: ^# b到此基本可以了,APP就这样。
$ W! S5 X& G0 l% C& x: Z; d2 R
, J4 m" h+ t( t1 J最后就是测试了。
% F. N& [( Q- T& v3 c3 G
/ x: R  g" b; O8 ^) }7 J1 ^测试:4 ]2 h, A7 k- l5 M1 F6 q

5 Q  P- A% j! B6 d, x1 `0 V( m" V首先得将IAP烧录进MCU,然后再通过IAP烧录APP。
3 z% P* ^& L$ v1 C+ {5 c4 F7 w8 z& c
. x& I4 W5 O0 W+ O0 B+ _' |4 m/ w通过IAP烧录APP过程如下:
% j7 B6 T  L  q
  t( Q) D6 X- p1 x& H: a) l打开超级终端,连接上串口,有如下界面:
8 \7 k6 Q  B2 W, o$ U
4 I# S" A7 U6 }3 G7 c波特率:115200 data bis:8 parity:none stop bits:1 Flow control:none
& x& b+ C3 ?8 c; U, [! i
5 y& ]& G, W2 V$ m( r2 R 1.png - E, C7 Q3 l5 D! u& r

1 Q4 x% ~* E! m7 n通过键盘输入1:# }9 g# `. \0 {) P+ x
/ ^5 x7 Q9 I: q9 o; O
2.png
4 J4 z; p; ]( a- j+ r  a& T
+ S2 v& V- \% ~- J. \从菜单transfer->Send file打开如下界面,输入APP的BIN文件路径,并使用Ymodem传输协议,如下图:5 m9 p9 ~0 w- K- Q' s" Q$ E
1 W/ j. w, F3 G6 M- C! b
3.png " s. p! X: o3 b6 f
9 b: U8 m8 C3 y
点击Send,开始烧录。。。
$ n- T0 [7 r; ~8 x7 M. w0 ~4 q) R5 H! m( B6 _, n) G
4.png 6 I: ]2 F% u) N; F  ?
* U' ?1 p4 O3 t0 \2 o* |( S
传输结束后,按下3,运行APP程序,至此,整个IAP与APP都可以正常工作了。1 A4 d' N6 i& H  ~; t

+ l' Y. ?9 U' |+ `; M8 ]结束语:
# g1 t4 Q8 [- L/ u
" S5 S2 R; [- u9 }5 m( g4 M这个只是个示例,实际IAP是还需要修改的,得判断是进行升级模式还是直接跳过进入APP,这个就需要看设计如何了。  p& l4 T3 p# ^. l9 l3 }
. ?, W1 J# D+ ~2 Z& M: F9 ^$ I

( `, e$ ]1 S. U# Y( M) Y3 {6 w6 U( T8 [1 n5 V2 A1 V" h/ i
6 W( [! h* h5 ?( }1 C! @5 q/ v
转载自flydream0
, _* j- S( Q+ ?' @
4 F, s' @2 e9 J- k; _, D; {5 }: W. w5 ?: r+ L/ ^
/ p0 h( P7 w9 S8 Y+ d
赞 收藏 评论0 发布时间:2018-5-25 11:07

举报

0个回答

所属标签

相似技术帖

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