|
一、BootLoader程序使用说明: 5 Z# n% M. b- H f. a 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。3 n, I' S) V3 Y8 J7 n3 V' j, _ 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用 一边读一边写的方法,不受内存大小限制。 * B' |5 X n- ]8 |, n9 T3 E9 X+ Z2 | 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控# q* l/ T }8 v9 b3 V4 _" l 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为 Q5 O. P& \* U% Y+ ^+ D 230400bps,TTL通讯则可设为921600bps。4 t M. B3 ?* @% K* r 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送5 [ i( V& {# x3 v: X 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议$ M: T) T; i! {& e. p 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。. Y! a% m3 c0 T } ( K& }9 q4 Q# _& }, L. z) a 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都 开启了看门狗,若有故障,自动复位,红灯一闪而过。 * }6 C+ N+ Q4 V5 Z1 h4 o# I 5 跳转至APP程序前,需要关闭所有用到的中断,切记。 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中,! d9 j. i- F& U% a 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机), 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。 ' |$ D, ~: q9 U) ]. q) t4 y4 |2 v* [ 7 用户程序的中断向量偏移设置如下:+ M) |! g8 T. ^4 Y4 { NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); 6 F X0 H$ O7 l- K" A1 N' B+ B ; APP程序分散加载的例子: ]3 k4 |7 e7 [: Z8 x8 T0 }3 z) S- { ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08004000 0x00040000 { ; load region size_region! }/ l' |' K) _4 h- b ER_IROM1 0x08010000 0x00040000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections)3 h- m* D$ Y- N4 `- [3 {* ` .ANY (+RO)" u) i# F% n) ?0 S/ n4 L1 P- ?6 { }! ^1 g+ t: g' i' v6 m8 \3 e RW_IRAM1 0x20000000 0x00010000 { ; RW data) a$ Y; `8 T! R1 q# n .ANY (+RW +ZI) } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data ; main.o (exsram) ; exsram 内存段名称# r0 Y3 Q8 G, h ;}5 K8 Y: y9 F9 T+ {' h5 U0 m) L: V } ! Y8 P8 C; e9 e1 m+ J ! N1 k" g4 d/ V/ e: K# n 二、工程说明 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的 应用代码: RS485,CAN,FSMC,SPI,TIM,AD 6 ?$ m7 `* q9 ^. u2 k/ T Project Targets 设置说明: K; ~6 N, Y# U' ?4 @8 N" Y H $ V! g$ t8 S8 @ 1.Debug in Ram8 y E6 I. }( }, \+ e2 R( ^" I& W# Y: u* o 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命; C+ V5 p* y+ Y0 G+ d4 E' N5 \ 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框; W5 O! J$ ~/ o8 }" ^6 ~# O 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码+ ]% o8 l0 I" |" [' Q$ O1 R6 _ % i Y( q/ a, u3 D3 H1 @8 P/ `- ? #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); ; m8 e0 H+ y9 J' | #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ 5 ]$ z0 R% L8 ?9 Y. K, P NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif 这样就把中断向量地址转移到Ram中 5 |. @: ~ _# D1 `# q: T4 H0 P/ V; h 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings 在Cortex-M Target Driver Setup对话框, . X! M4 N0 e+ q* m H. t5 y 选择Flash Download为Do not Erase,Program,Verify 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后; x4 m( q ~. \ : A& l* \7 _- m7 ?( [$ W& p( c IRAM_EXSRAM.sct 分散加载文件: , Z+ B+ `7 B R ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***" F3 }/ ]* o; q; R ; ************************************************************* " ]. A" V- g% Q- U0 g2 z% |; i/ k# m LR_IROM1 0x20000000 0x0000A000 { ; load region size_region j8 L! O; B3 ?+ L$ P ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address- s) |, I/ l& d+ ?+ d5 v *.o (RESET, +First)4 N; E! \3 Q1 y7 |( x+ C *(InRoot$$Sections)% ^5 f% Q' H# Y4 j0 J .ANY (+RO) }& |' e* L' V2 ^" Z RW_IRAM1 0x2000A000 0x00010000 { ; RW data .ANY (+RW +ZI) }, Y3 F( s0 y, |7 G: C RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称 } }/ R; g' ~- Q8 [. Z: u' | RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件: 2 R+ a; d* n6 W' O8 L SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register 8 g2 g7 z- _; I ~; d& |9 | 5 ^! C" z( v$ G6 _2 \# V 2.Debug in Flash# D/ N0 d% X0 a+ k 6 S- n# I c& Y7 u 在Flash中运行和调试程序,需要对Flash的反复擦除和写入7 X, i" X5 W6 V+ c7 ^ 6 l' v/ ?/ D# Z5 _+ Y1 ?+ o FLASH_EXSRAM.sct 分散加载文件: % g7 `* h. r5 c9 O. }* R. @$ t ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***/ A. n+ }) Z, f/ B! m ; *************************************************************6 I' L3 l: S9 @3 e. c 5 E, ]7 C/ L0 y/ O LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; load address = execution address$ N0 s2 P4 e- Z7 [2 r *.o (RESET, +First)3 g2 s6 c' { e+ o k+ A) u- I *(InRoot$$Sections)+ B0 t/ s" H/ \ .ANY (+RO) }0 ]. b' w7 Y [ V4 P0 ^9 T) q* v RW_IRAM1 0x20000000 0x00010000 { ; RW data7 u; [ a1 K; p' I( A' O) R .ANY (+RW +ZI)$ w* g5 v, L4 Z# i! L$ u2 f } EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称1 B$ [, e" P: e9 [+ B: Q- ? }0 i1 i0 Z5 b9 Q- y7 B } 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化- l6 J8 I: K, O SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写:/ x8 v) G% V! A9 u" U7 \* X3 ` map 0x68000000,0x68020000 read write exec& ~$ O% k C R. ~3 f; O+ I- c. U 三、源代码组织架构 文件夹名称: STM32F10x_BootLoad_IAP P$ r( y! l$ C1 K/ z5 r' L 固件库版本: V3.6.12 x% V0 F) k2 X; f7 A1 l1 p) s 文件目录结构: 1 ?( w" R% W* R& H* e. K" e STM32F10x_BootLoad_IAP │ ├─Project1 G x! Q, x" r; M. U" W; d │ │ # O e. Y, W$ p( x; {. Z& Q │ ├─inc) u; c+ [: d9 X$ E, K) }$ Y" `. l │ │ │ │ │ │ main.h" B m+ ~& K% X6 z" J5 s │ │ │ hw_config.h │ │ │ fsmc_sram.h6 m+ F, B* _, Z; K* B0 Z, n │ │ └ stm32f10x_conf.h- @0 u2 f& T7 Z │ │ % @# u3 `" A4 v7 F, E! ^ │ ├─src- s- [$ ^7 \, u- @5 x0 \ │ │ │ │ │ │ iwdg.c │ │ │ rcc.c. r3 V& J9 z R5 o9 C6 r │ │ │ gpio.c" v% f9 ^ M" N4 u# H │ │ │ nvic.c │ │ │ tim.c$ K. F R8 ?: z+ ` │ │ │ adc.c │ │ │ usart.c │ │ │ can.c │ │ │ spi.c3 R: q- e& ~1 h8 U) y: _0 p% x! U │ │ │ dma.c │ │ │ fsmc_sram.c3 r1 U. g+ z5 H; W! |& p5 _: L │ │ │ hw_config.c# q- o3 E# |" [2 v3 S0 V9 O0 i& p │ │ │ stm32f10x_it.c& d: R- E/ I8 R9 G p │ │ │ main.c6 I y0 ^8 x$ K0 R0 y+ ~ Z, r% \2 B │ │ │ modbus.c │ │ └ ymodem.c │ │ │ └─MDK-ARM │ │ 4 [; v( J* k4 a1 ]* u6 ^ │ │ BootLoad_IAP.uvproj │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */$ Q! m6 u/ d. t │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */ │ │ % x3 R# m6 F/ W, Z a% N │ │ │ ├─ROM /* Debug in Flash */! b( f& j) @4 I │ │ │ │ │ ├─rom_List │ │ │ │ │ └─rom_out. I7 d: M) I/ y& f │ │% L6 p2 l( F# g2 I# n. T │ └─RAM /* Debug in Ram */ │ │& K/ e3 P2 C; U9 L │ ├─ram_List+ m* g; l; r* k5 t: ~( w; H │ │( A6 s! Y/ E( L! U, O- D ?, _ │ └─ram_out; F2 n- ~7 W; L; u' l │ 8 U4 N5 B) } ` u ├─Libraries6 |/ e! m( U$ q& K+ d6 M& e │ └─STM32F10x2 f8 q8 L1 F2 i: `9 B5 R2 J& S │ ├─CMSIS │ │ ├─Device# B' \5 T) b# P: K │ │ │ └─ST │ │ │ └─STM32F10x │ │ │ ├─Include │ │ │ │ │ stm32f10x.h / x7 I0 A! y R0 Y │ │ │ │ └ system_stm32f10x.h │ │ │ └─Source# I3 } t$ ?$ K' }* T! e │ │ │ └─Templates │ │ │ │ system_stm32f10x.c │ │ │ └─arm0 ]. Z/ m8 d, {* b# F/ z │ │ │ └ startup_stm32f10x_hd.s# }0 G( ]2 U- e* z% h* K* L; t │ │ └─Include │ │ └ core_cm3.h │ │( J+ a' ^% H- u- i8 k* E7 V) o │ ├─STM32_USB-FS-Device_Driver; y" K8 ]( L& u7 J │ │ │ $ J8 M- t9 M5 W3 B │ │ ├─src2 i. k& q$ r3 T! @ │ │ │ │ usb_core.c │ │ │ │ usb_init.c2 C8 X% t, T& i p │ │ │ │ usb_int.c │ │ │ │ usb_mem.c$ c' Y p; t7 Q │ │ │ │ usb_regs.c │ │ │ └ usb_sil.c9 ^( p- r6 M& t │ │ │ │ │ └─inc: {% ]- q7 e/ v$ [) i/ P. j( | │ │ │ │ │ │ usb_core.h │ │ │ usb_def.h │ │ │ usb_init.h6 F( w5 V" K8 i2 [8 m: h │ │ │ usb_int.h │ │ │ usb_lib.h3 A% ?+ r9 @0 N/ y │ │ │ usb_mem.h3 z+ _4 q6 l! L% ]0 h0 i │ │ │ usb_regs.h$ O, \4 L! U! b8 ~ X2 B │ │ │ usb_sil.h( }" O8 M! { v1 f │ │ └ usb_type.h% i& I0 p2 O! }. u+ }$ c: A4 d │ │ │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */ │ │ │ ├─src' a1 ^" O# |4 C# d% F# [' _' `: z │ │ │ misc.c │ │ │ stm32f10x_adc.c │ │ │ stm32f10x_bkp.c │ │ │ stm32f10x_can.c4 g' l0 C4 h% v: @' e" o. e& s │ │ │ stm32f10x_cec.c& Y8 j% ~8 _2 O3 K+ h │ │ │ stm32f10x_crc.c: R O+ `) Y* t; K$ u7 n* m │ │ │ stm32f10x_dac.c* ]$ u; M0 ?; \3 ?& W" F7 d( c1 K │ │ │ stm32f10x_dbgmcu.c4 i. c, [. l2 f G8 R) a9 i2 m │ │ │ stm32f10x_dma.c │ │ │ stm32f10x_exti.c) C1 \- o6 h& d" J9 z& D7 ` P- T │ │ │ stm32f10x_flash.c5 k7 c) k T/ [% B: x │ │ │ stm32f10x_fsmc.c( p' S2 z0 ?4 G3 M' R( R$ l% |) y+ z │ │ │ stm32f10x_gpio.c9 W2 N2 [2 s; o( c. P+ K( T, m │ │ │ stm32f10x_i2c.c- P$ C8 ?" T" ]: Q8 ~0 I │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c │ │ │ stm32f10x_rtc.c3 n; ^4 V0 Z3 g9 Q7 n │ │ │ stm32f10x_sdio.c! a& t8 O# i! N! } │ │ │ stm32f10x_spi.c. U2 b+ T' R7 t# h( \ │ │ │ stm32f10x_tim.c- v( ^% G$ c; I) @3 I6 u │ │ │ stm32f10x_usart.c: i- @4 V. P6 s. f2 r& o │ │ └ stm32f10x_wwdg.c' ^, e$ N1 f1 G │ └─inc │ │ misc.h0 [) @8 u4 a" R, a( M │ │ stm32f10x_adc.h: U8 J, N) o8 W+ G7 h& \ │ │ stm32f10x_bkp.h6 O" v4 }- u. \* _' J' n │ │ stm32f10x_can.h │ │ stm32f10x_cec.h" C: F- q3 \0 ], }- C │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h# P) v3 d. a8 d1 ~' D w. } │ │ stm32f10x_dma.h6 l7 J- N$ U" v4 b1 |( X; @( I" S │ │ stm32f10x_exti.h3 x/ K! }5 w* O5 F+ T+ g │ │ stm32f10x_flash.h$ d, C+ l, [" m9 T0 k9 s# i* Y │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h: o8 ?4 F; a; s' |1 l │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h; T3 G. T2 y- Q- t/ N- P │ │ stm32f10x_pwr.h │ │ stm32f10x_rcc.h4 I4 j1 v: \7 S' o │ │ stm32f10x_rtc.h3 [) f9 }+ ~/ K6 b% o: } │ │ stm32f10x_sdio.h& P5 Z4 B$ z+ R1 `, D0 p- }( j/ c │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h: Q3 Y+ X5 C: j; e. H │ └ stm32f10x_wwdg.h │; X. g+ i/ o2 y5 U │3 S+ a2 N E2 @) `! } D$ Z' b! z └ BootLoad说明.txt3 W `" c% y1 B4 _" W! ] 5 Q, {; F' D- r0 V1 l3 u+ H: L- _ bootloader及256Kb的测试例程打包下载:
bootloader_OK.rar
(2.18 MB, 下载次数: 1351)
|
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
单片机是控制电子产品的大脑
嵌入式产品的开发过程中的各个阶段
STM32H7新产品线,融性能、集成度和能效于一身,让你的智...
硬核!ST精工打造全新30A高结温单向可控硅(SCR)产品系列
“热门产品”智能表计芯片组,再添无线通信功能
我来告诉你!ST MCU全新产品路线图!
微信公众号
手机版
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。