
一、BootLoader程序使用说明:9 w( G( a8 o/ @0 m6 v5 ^ 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。6 ~# N$ o+ m/ w* c+ X# I' R 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用: i' ~) @1 m/ R) P0 \ 一边读一边写的方法,不受内存大小限制。 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为 230400bps,TTL通讯则可设为921600bps。 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。 0 U ]* Y" R3 u$ [ 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都 开启了看门狗,若有故障,自动复位,红灯一闪而过。) g, N( t7 U c. i; a0 d {) T 5 跳转至APP程序前,需要关闭所有用到的中断,切记。; V! K- O" g/ }6 v" d 7 J, M& E. `. R1 R1 Y4 @ 6 LED指示灯相关的IO脚没有初始化。3 W; I4 w/ i% I$ h l _6 t1 B, G4 q 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中,: `* o5 V& ]' z2 C7 I; Y 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机),0 M q' Y1 @$ _- f* m1 J$ i. O 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。 7 用户程序的中断向量偏移设置如下:: O3 ~& {. R& w4 m+ [6 G- O$ z NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); ; APP程序分散加载的例子# a3 i9 _+ K+ x4 G ; *************************************************************& Z+ A5 T0 d6 d/ E ; *** Scatter-Loading Description File generated by uVision ***+ F- \4 {$ V4 _2 Q6 ? ; *************************************************************7 R( N# ~" S# a, `3 V1 o LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address *.o (RESET, +First)& y3 P A6 w2 I" n8 I3 h' g *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI); J5 O) j; R# x# ~- N0 [( [$ _ } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data ; main.o (exsram) ; exsram 内存段名称2 F# `5 V2 c# i3 {4 U ;} }1 W, b) o* \& g1 p 9 `; H# C6 O& \8 I 二、工程说明 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的 应用代码: RS485,CAN,FSMC,SPI,TIM,AD- X$ P$ n6 I8 e4 z) w6 r [ 8 Z( X7 X# o, {6 \ Project Targets 设置说明 & x8 ?7 a% G7 _1 v 1.Debug in Ram 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命 : R+ w$ e \6 R& k' c/ h 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框8 J0 O6 J$ c1 F# `# M1 E1 |; S K 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码( M1 |* }) m" E$ @$ [+ n * ]2 C, E7 V$ K. b- P- X #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ : A I q; m2 r! W# h NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ % l% J! e# f" C6 R9 p8 g NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif/ B2 ?! ~. f! p# O: a1 i 这样就把中断向量地址转移到Ram中. E8 {( n. r8 b 9 q; R6 r( x9 M1 ` 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings. K9 r1 Z$ b7 i) U0 _! w 在Cortex-M Target Driver Setup对话框, 选择Flash Download为Do not Erase,Program,Verify& H3 h: }3 I9 }$ e1 z 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后 {( |! w6 [9 G8 Y$ \ IRAM_EXSRAM.sct 分散加载文件:& }1 p7 `+ B6 I" _ ! B" V& H# i. }) k9 s( E7 D' A ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***- d1 p$ r" O: y& A/ n i; R/ t ; *************************************************************/ t, r A% k- @* S( r3 S - g" u, |% }/ k5 v( i: { LR_IROM1 0x20000000 0x0000A000 { ; load region size_region h4 m3 c# P* Y2 V" c2 O2 G9 j( w) J ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address0 }) H- x, o% k& y *.o (RESET, +First) *(InRoot$$Sections)8 O8 X" W- G0 V8 P' d) s! S .ANY (+RO) } RW_IRAM1 0x2000A000 0x00010000 { ; RW data5 y; T n6 t. N# o; _1 s3 I ] .ANY (+RW +ZI)0 V* d- q: h# q! m* ~6 [# Z( H7 p } RW_RAM1 0x68000000 0x00020000 { ; RW data, |+ j! [. ~% |/ \, | .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称8 p. l$ t# `! k) y: x } }# _" X6 l5 S" z+ m. Y* O& P RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件:$ d% A4 C% `' I: Z" h$ n7 ?$ {3 } 0 D k9 z1 w% K9 E% q; J SP = _RDWORD(0x20000000); // Setup Stack Pointer5 V& r/ E! ~/ G8 M$ K' N: b PC = _RDWORD(0x20000004); // Setup Program Counter% k) j; ^1 B, R2 a/ ^* H _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register% ?. Q, a0 L0 F( w( v8 A' W ) f. ^1 @) {# i+ h* [! M 2.Debug in Flash 0 n. x/ F8 ~) U8 B' ~" f 在Flash中运行和调试程序,需要对Flash的反复擦除和写入 . y8 v8 I+ ~" j% d0 J9 b FLASH_EXSRAM.sct 分散加载文件: ; *************************************************************9 A; j9 b2 e2 }! K4 W5 h! \ ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; load address = execution address1 W. ]7 B1 e$ ?, v3 O% h7 X *.o (RESET, +First)$ w7 j( m6 a/ m1 v5 k& J5 @& @ *(InRoot$$Sections) .ANY (+RO)8 d6 D( H; Z5 n } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI)% @+ c7 X/ j! f- w3 `0 O } EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data e6 W i3 k, F, q! O main.o (exsram) ; exsram 内存段名称/ Q2 n9 r W8 J- N }. ?* G' H9 m5 R p! c } ' F" X, r# R; }+ p: q 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化 : n1 j8 B6 f5 w* ~ SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写: map 0x68000000,0x68020000 read write exec ! G9 N* z( t7 A) n, g7 g( M 7 w* s0 U1 |" o: h+ a" V 三、源代码组织架构. D$ P1 ` f% z( {1 S; x $ ]6 {2 @" e3 k 文件夹名称: STM32F10x_BootLoad_IAP : Y/ v5 O3 O; x0 l/ M# Y0 P7 N1 N: A# ~ 固件库版本: V3.6.16 {. \. `7 R$ N& z9 T9 G # v, ~* B- \% { W 文件目录结构: ; l6 j# J) X$ K& }* A8 v STM32F10x_BootLoad_IAP │ ├─Project2 g% L" ~ w( k1 g │ │ │ ├─inc. b) v8 F0 Z# v8 T9 t: i! l2 q/ \ │ │ │ │ │ │ main.h7 Y- _& Y+ K9 |) r9 V │ │ │ hw_config.h9 e* k9 }1 o, J8 f5 P( t │ │ │ fsmc_sram.h/ f# j8 |( u4 ] │ │ └ stm32f10x_conf.h │ │ │ ├─src │ │ │ │ │ │ iwdg.c │ │ │ rcc.c │ │ │ gpio.c" b- Z( U4 e( q4 M9 j. e │ │ │ nvic.c$ v7 {* b4 o) n) ~/ l │ │ │ tim.c0 B6 [7 N5 K1 l: B2 ?$ C A* v4 l+ M1 U │ │ │ adc.c. }% N, |( |/ N2 H; f │ │ │ usart.c: v) @% X- I/ ~/ U8 _- f │ │ │ can.c9 B/ a% d' _3 p8 } │ │ │ spi.c │ │ │ dma.c- x% _$ Z; y { │ │ │ fsmc_sram.c) k' b5 O/ U# @8 U │ │ │ hw_config.c/ l2 U0 ?' @3 v! W- u$ V1 V+ O! e! a │ │ │ stm32f10x_it.c" E) J- j+ _; O │ │ │ main.c │ │ │ modbus.c) x; L4 x" [2 a8 h# X │ │ └ ymodem.c' ~* {- }# c& b5 v7 M │ │ # S& V- z) [; D% S │ └─MDK-ARM │ │ │ │ BootLoad_IAP.uvproj: z3 |" J6 L2 _; H1 N- f8 ` │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */ │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ ! D V3 ?: [; Y3 ~$ Z │ │ RAM.ini /* IRAM调试初始化文件 */ # H o) a4 X, U% {2 e │ │ SIM_MAP.ini /* 软件仿真初始化文件 */- K! q- w9 }! p) \ w. i- u │ │ │ │ │ ├─ROM /* Debug in Flash */ │ │ │ │ │ ├─rom_List) q) v0 N5 w4 ?- J$ {- X │ │ │ │ │ └─rom_out( e2 x- w4 i/ w5 q │ │ │ └─RAM /* Debug in Ram */) U5 n& U! j! D$ @% `+ o │ │ │ ├─ram_List │ │- N& d5 i5 m$ n$ K │ └─ram_out! r6 k9 a2 i9 a. C1 N │ ├─Libraries8 t3 v" u/ o/ O9 n │ └─STM32F10x │ ├─CMSIS │ │ ├─Device │ │ │ └─ST+ l+ C; n" Z5 f0 m& y2 L- p │ │ │ └─STM32F10x │ │ │ ├─Include! A7 g! Q# O! U4 N$ i. s5 O6 [ │ │ │ │ │ stm32f10x.h │ │ │ │ └ system_stm32f10x.h │ │ │ └─Source │ │ │ └─Templates │ │ │ │ system_stm32f10x.c │ │ │ └─arm4 n& p8 a. l1 C& C: z; K │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include: Y. q0 I! w0 c% A1 H* t │ │ └ core_cm3.h3 C$ z; ?5 f# v/ ]3 q9 Z │ │% T$ G' U2 e" v) C6 `5 ]4 t │ ├─STM32_USB-FS-Device_Driver │ │ │ ' A9 w% ~' t# {( A4 V0 _) Z& Z │ │ ├─src │ │ │ │ usb_core.c2 W$ t( x- P( F! [ I+ w │ │ │ │ usb_init.c │ │ │ │ usb_int.c │ │ │ │ usb_mem.c │ │ │ │ usb_regs.c5 e6 @. ~6 s& ]% |$ I, P/ H" M5 q │ │ │ └ usb_sil.c( R- h& O6 r2 ?. A; M │ │ │ ; i7 S. \$ q" ?$ Y │ │ └─inc │ │ │ 4 d" W- J! i6 {7 E- Q │ │ │ usb_core.h │ │ │ usb_def.h. X- |% [/ t) k0 |4 d │ │ │ usb_init.h0 S2 s3 X3 v1 X3 w" G │ │ │ usb_int.h$ k/ B8 f4 F9 I$ s- y( ^ │ │ │ usb_lib.h8 U5 f/ ?% F' r9 l, j" s( F, o │ │ │ usb_mem.h │ │ │ usb_regs.h# x3 d3 i( H, z! Q2 {% \3 P │ │ │ usb_sil.h │ │ └ usb_type.h │ │. I0 x0 A. q/ M+ G6 E │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */( H/ y( \! [4 j' V │ │ │ ├─src( ?. R9 f0 B1 T( ^ │ │ │ misc.c. P7 s# H2 m! O# ]+ r8 v │ │ │ stm32f10x_adc.c │ │ │ stm32f10x_bkp.c4 ?. H X+ w2 n. J- k │ │ │ stm32f10x_can.c7 @6 _: [. r& ?+ x( C" r; J │ │ │ stm32f10x_cec.c d3 }) R0 a6 I! \; ^9 { │ │ │ stm32f10x_crc.c │ │ │ stm32f10x_dac.c0 A- D! w5 g4 ?; e" [% w │ │ │ stm32f10x_dbgmcu.c) J5 z; H' ]2 H1 Z1 q │ │ │ stm32f10x_dma.c' r* Y0 V9 _& l* e" P │ │ │ stm32f10x_exti.c+ p, k6 t6 p0 [8 X- | │ │ │ stm32f10x_flash.c │ │ │ stm32f10x_fsmc.c1 Y% ?/ f; ]; j4 Q( [" h │ │ │ stm32f10x_gpio.c │ │ │ stm32f10x_i2c.c │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c' `- {* K! a1 d; x( b: Z* {9 e │ │ │ stm32f10x_rcc.c │ │ │ stm32f10x_rtc.c │ │ │ stm32f10x_sdio.c& H9 H* Q; t, c& R6 M │ │ │ stm32f10x_spi.c │ │ │ stm32f10x_tim.c │ │ │ stm32f10x_usart.c. Y2 g# p: |) h! Y* ]2 s R# N$ D │ │ └ stm32f10x_wwdg.c) Q& O# E( P. a9 I) X │ └─inc7 Y9 @- I6 N9 N │ │ misc.h7 k# X3 L& T, d$ `# j# |3 F' l$ C │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h │ │ stm32f10x_can.h │ │ stm32f10x_cec.h │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h) \. |* \! N2 w+ ^ │ │ stm32f10x_dma.h$ L6 ]1 v& X' M0 _7 o4 r+ D │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h! N* V: Y8 W8 {3 } │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h' C K; y9 [7 c1 J( |8 I │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h; G2 ^ ]9 `& G/ n; O │ │ stm32f10x_pwr.h, J5 [/ D- d2 R │ │ stm32f10x_rcc.h7 N. l( f# m, V( a │ │ stm32f10x_rtc.h) l7 y- G/ e% | t2 w │ │ stm32f10x_sdio.h │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h │ └ stm32f10x_wwdg.h │ │6 K& [" j A5 ?. \ └ BootLoad说明.txt) V) B- I8 ~7 }* i 0 }) f4 H% o, K5 P. U3 m3 ^6 H7 Y bootloader及256Kb的测试例程打包下载: ![]() |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。