
一、BootLoader程序使用说明:) L1 g: ?% |7 C& g2 B) G7 W1 C 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。0 j5 j5 x. T v6 a# _) v+ J 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。/ Q z+ ?/ r% o! D 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用& u" Q* |2 ?4 Y$ C$ A7 r 一边读一边写的方法,不受内存大小限制。0 \$ I2 L1 @; ~ 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控5 _3 e7 z" }( e2 c 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为9 W% l# L" @9 G9 B7 t2 m 230400bps,TTL通讯则可设为921600bps。+ n+ C' e k) g0 m' I 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送, C [# {8 H# ^# [ 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议0 l, W& m5 E( S6 P7 s' b5 W1 b& b& \ 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。 ( B. x( T/ t2 U$ B0 j 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都0 ^% F: z6 m! O: j 开启了看门狗,若有故障,自动复位,红灯一闪而过。 6 Q+ |7 F& v9 M 5 跳转至APP程序前,需要关闭所有用到的中断,切记。 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中,. L% V; e b" \. n 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机), 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。; [+ z; N6 h) x, [ / u! |+ X- n# I, k* { 7 用户程序的中断向量偏移设置如下:% C3 d# c8 u. c) W& Y( q NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);$ P2 ~0 w; z" ~. ?; } % V0 j# d3 B: H7 S5 h ; APP程序分散加载的例子9 U& O9 y5 u' u ; *************************************************************3 {2 R& w c# T4 W- c ; *** Scatter-Loading Description File generated by uVision ***% ]; s$ ~9 n$ U" v ; ************************************************************* ^- f; B4 k) e % B5 R: v @0 Q" u LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address) \2 U6 V" f a- V& e *.o (RESET, +First)# D/ c8 f4 g/ j+ I$ n; e" g *(InRoot$$Sections) .ANY (+RO)8 h4 x3 d3 N8 w4 f% R% F9 i }. g; }% G. Y$ q+ X1 n+ @6 i: V! h# B; b RW_IRAM1 0x20000000 0x00010000 { ; RW data* r) C9 g1 P) l" v: z .ANY (+RW +ZI)9 r: Q7 v; |% r7 M } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data ; main.o (exsram) ; exsram 内存段名称& e4 P y2 U$ v; g# _$ o2 h Q6 X ;} }6 y5 o3 f4 q: k" k S , R6 b: A& m5 I0 l. G2 Z & S& z! R7 q, d. P7 w9 u+ @ V+ z7 y- P5 M4 @ 二、工程说明8 ^9 u; ~0 G1 b8 ` a ' d# m# c0 u* @1 b- E& X. N2 Z 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的) I2 e) V& @/ b' I 应用代码: RS485,CAN,FSMC,SPI,TIM,AD $ ]1 `+ V- `8 q5 ~ Project Targets 设置说明' f4 X! K3 H# X8 u 1.Debug in Ram% F# s( W& S6 ]+ g 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命2 p9 B* T2 G: Z' \. M9 v 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码" p$ w. b1 }( C6 L #ifdef VECT_TAB_RAM 2 W; G3 T! x' U /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */0 i; J' N+ F( w3 Q8 ` /* Set the Vector Table base location at 0x08000000 */ " q$ A2 c- f3 g; F# R# w7 W NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); 1 f! @+ O5 I1 [6 F) l #endif0 n6 b/ V7 X: s: E% ?3 W; ? 这样就把中断向量地址转移到Ram中1 n* r+ |$ T, [% e 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings 在Cortex-M Target Driver Setup对话框, 6 m2 B5 j# X& x2 p 选择Flash Download为Do not Erase,Program,Verify 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后% y7 f& p+ _. k: u$ w% S1 b 3 P X: R: K% ^; t3 a- {' `2 r' ~4 I IRAM_EXSRAM.sct 分散加载文件:* N# T: U2 `, S9 G ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************** N6 f/ _" [- f/ y, X4 M6 ] . q+ w& s5 b: r# ]* d LR_IROM1 0x20000000 0x0000A000 { ; load region size_region ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO)# Q6 ^) f: q% Q }2 a B' L7 @; q7 X- L& a$ f" \ r RW_IRAM1 0x2000A000 0x00010000 { ; RW data+ S! A3 Y" U* s- b8 y- e, v4 | .ANY (+RW +ZI) }4 B: K. @$ {5 a! c' t7 G+ ?# @8 _/ N RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称( K: U, }7 }6 d! P7 g } }" t9 D% h- o8 s' X' @0 `* U RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件: SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter( o, J6 S! ?2 E# I# ]& v _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register , { Q" E( O [# U5 h8 ]/ a# I# P 2.Debug in Flash! E) ~2 a, }$ ~6 _6 ~8 x . G0 ^2 v4 `8 `3 _$ H) O: r4 q 在Flash中运行和调试程序,需要对Flash的反复擦除和写入$ \5 }6 |& a; O* H& k; F FLASH_EXSRAM.sct 分散加载文件:. d6 c) x5 |1 B: d3 u% h3 b# W" a R4 J. \# c0 v4 z0 t$ f ; *************************************************************6 T0 [, ]9 \0 Q0 F- \/ ? ; *** Scatter-Loading Description File generated by uVision ***1 \' k( r; S3 t' K: P& \ ; ************************************************************* x# t. b( s& [) n- d' X/ n' T LR_IROM1 0x08000000 0x00040000 { ; load region size_region0 E- B" l% J+ U( K- I ER_IROM1 0x08000000 0x00040000 { ; load address = execution address2 p1 I% }" A( B0 s *.o (RESET, +First)1 ?5 Z9 ?1 v3 q. G: l/ k0 `) v, y2 ^ *(InRoot$$Sections) .ANY (+RO) }6 \- G( }6 `$ a RW_IRAM1 0x20000000 0x00010000 { ; RW data) U/ M5 h+ H* _# I3 E+ ~ .ANY (+RW +ZI) }& y; L" b4 a1 Q$ t- ? EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称 }3 `9 {& |" k. V2 e/ K0 ` u } 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化; ?' R. L% ~2 c- P1 H' c* j $ S% R9 P! x8 a SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写:, z2 ~- I8 l# f- @+ Q# G8 X 2 }' V& G3 ~+ S! }" ^9 n9 u map 0x68000000,0x68020000 read write exec& r" T6 P; m( e( P, j1 V 三、源代码组织架构 文件夹名称: STM32F10x_BootLoad_IAP 固件库版本: V3.6.18 p; i o7 i* E4 Y& i & `& l6 B, h5 n 文件目录结构:) g& X s- x" B1 c 9 _! H9 [, Z% J. H4 z& p: `" S STM32F10x_BootLoad_IAP9 a/ U1 ]. `8 ]5 R7 A# Z3 C │5 a; e+ @; l' a- O# p2 {5 J ├─Project0 i) b4 {7 p1 s │ │ │ ├─inc │ │ │+ h) Q( Q2 T+ l8 H │ │ │ main.h( s0 b+ e b* i& } │ │ │ hw_config.h │ │ │ fsmc_sram.h │ │ └ stm32f10x_conf.h2 H) X5 [3 l9 M5 B6 u8 ^( i4 Q- T │ │ │ ├─src, |. a, d* W( _- @ │ │ │ │ │ │ iwdg.c( R g2 V0 H# W │ │ │ rcc.c b5 s& u+ } U& \8 j2 D3 J │ │ │ gpio.c │ │ │ nvic.c │ │ │ tim.c │ │ │ adc.c8 p- }: F3 G* l. W8 n& d │ │ │ usart.c │ │ │ can.c4 }9 c2 M0 m! u; E4 C8 a( C, n/ s │ │ │ spi.c │ │ │ dma.c5 S' k9 d- h$ F* G │ │ │ fsmc_sram.c │ │ │ hw_config.c │ │ │ stm32f10x_it.c │ │ │ main.c │ │ │ modbus.c │ │ └ ymodem.c │ │ 0 s; E/ O6 O2 v+ Q" \' ~ │ └─MDK-ARM │ │ │ │ BootLoad_IAP.uvproj │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */ │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ 2 K! P- }! R n! z7 Y7 y │ │ RAM.ini /* IRAM调试初始化文件 */ 8 v% @) ^( R6 U# t5 Z9 ? │ │ SIM_MAP.ini /* 软件仿真初始化文件 */( _& m; a9 F1 A │ │ Q: O- ~" m' d; V( _ │ │ * x9 E* i/ N2 K │ ├─ROM /* Debug in Flash */( r0 E* ^* _$ h: k* G: O* i │ │ │3 X! n9 a0 v0 t- ?+ F0 k │ │ ├─rom_List' e" C- @0 d7 l, R5 V- H, L3 j$ K │ │ │. g* t+ j4 A5 a, K( w │ │ └─rom_out4 v3 x" `( A' `; J6 J# U! o │ │# G$ H' P* {9 ?$ y │ └─RAM /* Debug in Ram */ │ │ │ ├─ram_List4 l% w9 s/ Q5 k7 b0 G( g9 J │ │2 l8 i8 S6 u) U: x7 v$ R │ └─ram_out& K4 g: Y* V0 S V5 p( N │ . o* @. G6 p) s3 J2 }1 O ├─Libraries │ └─STM32F10x% A: \4 j8 `0 ?5 X& y$ I. {4 i │ ├─CMSIS │ │ ├─Device │ │ │ └─ST3 R6 R/ A; l8 t- p │ │ │ └─STM32F10x │ │ │ ├─Include- l' U1 ]! b3 N- R: |% m │ │ │ │ │ stm32f10x.h , j6 N, z& L" O) k( n │ │ │ │ └ system_stm32f10x.h │ │ │ └─Source( z6 `1 @; e- D: r# ]. p │ │ │ └─Templates │ │ │ │ system_stm32f10x.c4 Y( a" I) y3 N# o2 O2 t5 x. B1 h │ │ │ └─arm+ n& K8 S% d- p: _) G8 U H │ │ │ └ startup_stm32f10x_hd.s2 k1 m& |! i9 ~" F7 f5 E │ │ └─Include& ^+ h7 D4 C0 m5 A │ │ └ core_cm3.h V0 x$ q- G! N6 w0 Z: d5 z │ │ │ ├─STM32_USB-FS-Device_Driver! b8 p0 y) M' P: Y, ~( | │ │ │ + y. @( a: X4 I t% E) S │ │ ├─src │ │ │ │ usb_core.c$ T7 x; g5 W5 L# G6 ] │ │ │ │ usb_init.c │ │ │ │ usb_int.c5 T$ N- Q) d+ K a" }9 M5 n │ │ │ │ usb_mem.c( U; n7 ~3 f# p4 w' @3 i" f7 E# X │ │ │ │ usb_regs.c' h' [( z- Q+ X& q │ │ │ └ usb_sil.c │ │ │ 9 Z* D" }" q0 M# P │ │ └─inc: Y1 ~4 }" k: { │ │ │ 4 `& c2 p! a4 D& U% U │ │ │ usb_core.h3 U* ~$ N/ J4 F: T0 y │ │ │ usb_def.h& p% e* h/ L; x │ │ │ usb_init.h' R. c" Q/ U+ {1 z+ t! ?+ c1 m │ │ │ usb_int.h │ │ │ usb_lib.h │ │ │ usb_mem.h │ │ │ usb_regs.h+ V6 K3 p+ k+ w │ │ │ usb_sil.h │ │ └ usb_type.h5 B' j Z+ _) e3 W' C' |% E& V │ │ │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */5 u/ n. l( }. u' W# E │ │ │ ├─src8 h$ }! l, R: M4 I. x4 G1 n │ │ │ misc.c, r# l7 d: d$ ~0 Z │ │ │ stm32f10x_adc.c$ S# c0 A4 w$ q" `2 c& N9 x │ │ │ stm32f10x_bkp.c │ │ │ stm32f10x_can.c │ │ │ stm32f10x_cec.c+ U/ R* g+ C3 l+ [ │ │ │ stm32f10x_crc.c │ │ │ stm32f10x_dac.c │ │ │ stm32f10x_dbgmcu.c: k& ^: Y- u% D" ?' }9 L- Y │ │ │ stm32f10x_dma.c' D1 b) E7 k$ Y* C$ L L7 o │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c │ │ │ stm32f10x_fsmc.c2 v* U# ]3 z: b2 [8 S6 l1 R; D │ │ │ stm32f10x_gpio.c: }. A/ H8 B. |- h1 Z+ R: R │ │ │ stm32f10x_i2c.c │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c# B6 J$ z# u5 t$ } │ │ │ stm32f10x_rtc.c- w7 T: ]( J7 A% ]! x) _ │ │ │ stm32f10x_sdio.c │ │ │ stm32f10x_spi.c │ │ │ stm32f10x_tim.c. q1 p; _( j M% g7 T │ │ │ stm32f10x_usart.c9 b. b: X! C" v. d, A4 i │ │ └ stm32f10x_wwdg.c │ └─inc7 p/ _2 w/ X/ W* r │ │ misc.h, _- o/ v+ e9 I │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h6 V/ \& n+ e1 v7 ~5 G │ │ stm32f10x_can.h │ │ stm32f10x_cec.h │ │ stm32f10x_crc.h4 y9 D1 ^3 N( [2 d7 D │ │ stm32f10x_dac.h9 f8 Y3 s$ h8 H* z' a │ │ stm32f10x_dbgmcu.h │ │ stm32f10x_dma.h │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h& n' i- r+ d* m; ~! ^ │ │ stm32f10x_fsmc.h3 D( W; B9 C9 y( I' a │ │ stm32f10x_gpio.h │ │ stm32f10x_i2c.h8 G" N& t7 v& d9 |! ~) z │ │ stm32f10x_iwdg.h! M+ {! B# z' b8 _! ~- e │ │ stm32f10x_pwr.h │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h │ │ stm32f10x_sdio.h' m& ?# p- z# }6 X │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h& e+ @) r* u2 t7 M. Q │ │ stm32f10x_usart.h │ └ stm32f10x_wwdg.h │ │ └ BootLoad说明.txt % _8 r3 |- @6 H e0 ]' Q7 l bootloader及256Kb的测试例程打包下载: ![]() |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。