
一、BootLoader程序使用说明: 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。/ N1 g& _# D* d! Y J3 c' C5 W& R5 a 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。3 H# V9 N+ |* }6 `! ] 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用 一边读一边写的方法,不受内存大小限制。 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控( j/ i& t) i9 h4 }, T2 k 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为 230400bps,TTL通讯则可设为921600bps。 " J# c$ Y( o0 i2 {5 \4 w+ w) ^) n/ m 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议4 j$ R. l p M9 h 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。 , U# K! B. B I3 {5 f' y 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都4 M# _0 h. D2 r7 \: d* ~5 w 开启了看门狗,若有故障,自动复位,红灯一闪而过。 5 跳转至APP程序前,需要关闭所有用到的中断,切记。' J* W* e! g0 O 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中,4 \. i+ t) n1 N% ]+ f) J6 D- } 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机),* d) D* V* l; ` 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。% _8 q* J' ?. p8 |0 N5 W' D. }! X a 7 用户程序的中断向量偏移设置如下:4 G. G7 y9 p" m1 c) u NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); & D5 O9 ]5 f3 k! l2 ` ; APP程序分散加载的例子 ; *************************************************************6 ~# o( N2 J: V) Q" {4 o ; *** Scatter-Loading Description File generated by uVision ***# K" ~" Z. g5 F' ~7 m+ O0 ^ ; ************************************************************* LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address *.o (RESET, +First)/ P5 v( e/ j: V$ B% ^3 S *(InRoot$$Sections) .ANY (+RO) }1 G% @" W' u4 G8 a* ^$ b) N7 R2 x RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data ; main.o (exsram) ; exsram 内存段名称 ;} } % B, v0 h3 {0 D% | c* r5 `* c H% O/ B( q& [+ E, i, } 1 m; b+ ^/ f: } 二、工程说明 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的! Z* \- Y9 \" E) B 应用代码: RS485,CAN,FSMC,SPI,TIM,AD , N5 {* g1 y/ O! c4 V2 h& D+ k) F/ ` Project Targets 设置说明7 M% H$ l3 b1 A: T N ) y0 t& Y0 g2 L8 F8 U 1.Debug in Ram 5 \/ e/ v% E" c0 Q, e" o- U7 ` 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命 / z- ?2 x) I5 K1 I 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码 #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); ! e G1 K( K- i- M) ] #else /* VECT_TAB_FLASH *// `! r. B# }3 f! } /* Set the Vector Table base location at 0x08000000 */ ; p8 g! C' f9 {$ `) n* T, W+ S NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); : g4 C# U1 U- N8 v5 a #endif3 Y- P9 u, z8 D" d$ {: ?2 J 这样就把中断向量地址转移到Ram中 8 j3 o7 O& N4 j$ m. Y 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings9 C# {) \6 J0 t( d" l5 ]. P- j 在Cortex-M Target Driver Setup对话框, 选择Flash Download为Do not Erase,Program,Verify 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后% n& r0 N4 N/ R% V IRAM_EXSRAM.sct 分散加载文件: + m) k' ~5 `' b: A" E ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************8 _9 o; S' a H & f, E$ `' r+ g- O LR_IROM1 0x20000000 0x0000A000 { ; load region size_region$ J/ w: v C7 Q. v! u ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address *.o (RESET, +First)1 e% n5 R- \" A3 l+ D/ i+ m *(InRoot$$Sections) .ANY (+RO), `; S4 O3 ]$ M& g5 c2 \$ k4 | }3 j f* r T" ?! N0 ~ RW_IRAM1 0x2000A000 0x00010000 { ; RW data+ Z' z. z1 y" y .ANY (+RW +ZI) } RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称9 H7 m4 e# w/ t/ z; q3 r& d } }% W/ B) l+ W4 ] RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件:4 E/ N7 |, h- q* f SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter) K$ {! c, V9 N: d, R, ]% w$ \ _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register S4 a9 }# S; `! e5 j+ z- p. S3 t 9 X3 F/ L% K1 e; r, A; b, y( T$ \ 2.Debug in Flash3 }2 e) Y0 R/ f6 S$ O$ W" z 在Flash中运行和调试程序,需要对Flash的反复擦除和写入5 I T2 q4 `6 H# F' | FLASH_EXSRAM.sct 分散加载文件:0 W4 ~. J" h8 k O" h5 d. E( I ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************8 }. b1 s8 v! G5 E r& y, X LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; load address = execution address3 ^. j/ ^- M9 Q *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO); b5 o G4 v" {( C }$ l V* P3 O# E% f& a- B) v RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) } EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称) T3 J" `' C+ T J1 b }/ g+ @& e7 p. L8 h6 M: ?- M2 C J }, a/ Z8 @% ^, ~ a$ E/ _ 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化& i3 L5 j* \# [+ C 7 ` p4 n/ g$ x# x SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写:6 l+ c" Q% q& C3 Z2 X 4 i l9 M$ l: r" k/ E$ x4 F map 0x68000000,0x68020000 read write exec ; n$ R! Z6 W7 ?7 H6 V) A& d 三、源代码组织架构 / M7 {/ z s' Y' E1 D% A 文件夹名称: STM32F10x_BootLoad_IAP 固件库版本: V3.6.1 * j/ ~1 w h5 W3 ~7 a/ t 文件目录结构: STM32F10x_BootLoad_IAP' `! ?' U- |1 S" G! Q8 N │ ├─Project │ │ f7 a$ k2 D& T3 ?; G │ ├─inc& v' G& |0 F. i) w) N4 c │ │ │+ x8 z, X( I3 g. ^: }$ [- I' } │ │ │ main.h │ │ │ hw_config.h │ │ │ fsmc_sram.h: u" v/ t# _+ ^" ^1 X7 S9 ~ │ │ └ stm32f10x_conf.h │ │ $ Z( U* {: ?! _9 t2 y$ T │ ├─src │ │ │ │ │ │ iwdg.c │ │ │ rcc.c │ │ │ gpio.c │ │ │ nvic.c │ │ │ tim.c │ │ │ adc.c2 D+ c2 m" y* F4 J& b │ │ │ usart.c' O6 o d" q* ]6 K" d7 {; Y │ │ │ can.c% K: ^3 b2 c' X │ │ │ spi.c! D" [4 J/ `+ v$ Q, p8 c │ │ │ dma.c │ │ │ fsmc_sram.c' C$ H/ `) A6 \! n │ │ │ hw_config.c+ o8 A0 t8 B- F* t! H) ` │ │ │ stm32f10x_it.c' c9 w0 J* G3 Q! S! f$ Z4 D; t │ │ │ main.c: \9 M0 G" W% G; M- |9 s │ │ │ modbus.c, A1 j& ~3 E% I2 x! r' k/ u0 z │ │ └ ymodem.c │ │ │ └─MDK-ARM │ │ ! A% k# e( b" Y" E │ │ BootLoad_IAP.uvproj6 E5 l+ L' P4 n/ \ │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */5 x1 k" o, m; J+ L0 p4 _0 f' y │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ 9 s* M/ k; j2 H3 ^# x │ │ RAM.ini /* IRAM调试初始化文件 */ 3 M* g4 Y; k7 ~4 L' q0 Z; r( x Q │ │ SIM_MAP.ini /* 软件仿真初始化文件 */. O& c' ]5 G, t% i+ A/ F │ │ │ │ │ ├─ROM /* Debug in Flash */2 b1 @1 a. v% a6 [ │ │ │ │ │ ├─rom_List │ │ │( n1 T- P3 {1 [7 x$ y │ │ └─rom_out │ │8 n* A, w* T) U │ └─RAM /* Debug in Ram */ │ │ │ ├─ram_List! V' Y) U! ~/ T# {' {* A/ ^; W" Y2 o │ │# L j. e" p( ^! n+ w) P0 n │ └─ram_out; N8 [6 Q3 s) T │ & l: V D* d2 J1 P) g ├─Libraries8 e7 s, {& H, I │ └─STM32F10x% m' h+ D: B3 n8 ~ │ ├─CMSIS3 @* Q8 z2 Z2 B# x6 U; a {/ r │ │ ├─Device" ^* ?+ h1 z* o │ │ │ └─ST8 U- M4 W. H4 g9 U, w │ │ │ └─STM32F10x │ │ │ ├─Include' s. b7 N5 [- _7 u: t/ A5 B │ │ │ │ │ stm32f10x.h / q; |! k, Q/ o& E' C y3 @ │ │ │ │ └ system_stm32f10x.h b) C. j3 Z, s │ │ │ └─Source │ │ │ └─Templates/ `* }9 t$ L% E/ {3 i" ]7 m8 C │ │ │ │ system_stm32f10x.c; m+ p! F0 Y* n5 J │ │ │ └─arm │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include. c9 }: x, @9 F │ │ └ core_cm3.h │ │3 c7 I4 v; K& D% K │ ├─STM32_USB-FS-Device_Driver S; y6 O" t8 V5 G9 [9 [ │ │ │ │ │ ├─src │ │ │ │ usb_core.c1 ]. |6 x8 g! { │ │ │ │ usb_init.c& ]: B6 M6 d3 Y% _1 I$ t. g │ │ │ │ usb_int.c │ │ │ │ usb_mem.c │ │ │ │ usb_regs.c8 n3 V5 ~3 [* s: b6 `7 H │ │ │ └ usb_sil.c │ │ │ # u# a& S+ q H* {3 G │ │ └─inc │ │ │ │ │ │ usb_core.h │ │ │ usb_def.h │ │ │ usb_init.h │ │ │ usb_int.h │ │ │ usb_lib.h% V6 E9 ~1 @8 }5 X2 |0 z │ │ │ usb_mem.h' s3 S% t3 c. y( p; z0 j& s2 Y0 X+ m │ │ │ usb_regs.h4 A! Q' E' D! ~& p │ │ │ usb_sil.h │ │ └ usb_type.h+ f2 `- w9 R, T6 v! F& k │ │% \& Z; N' ?, m/ c9 J/ z2 |4 ] │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */) _8 F3 p* e3 A4 G4 b │ │ 2 w9 Y2 l3 q6 E │ ├─src$ F6 X! A* P( Q │ │ │ misc.c+ @4 A! `* N& L9 @ │ │ │ stm32f10x_adc.c2 |9 o. [2 ] L0 B │ │ │ stm32f10x_bkp.c │ │ │ stm32f10x_can.c% |+ P2 h; u N, p9 q │ │ │ stm32f10x_cec.c8 q1 D- O8 d' r- C6 j7 S │ │ │ stm32f10x_crc.c o' T5 b( w3 h1 t& A, ?+ T) p! G& G │ │ │ stm32f10x_dac.c& \0 g( p: N0 c7 U2 b7 R) M1 z │ │ │ stm32f10x_dbgmcu.c: m+ h& r8 C6 b' I- Z( ` │ │ │ stm32f10x_dma.c │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c │ │ │ stm32f10x_fsmc.c │ │ │ stm32f10x_gpio.c9 d* L# h5 b) d, j7 P9 Y8 ? │ │ │ stm32f10x_i2c.c9 d2 s0 L, ~0 H4 V _1 z │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c& e( j9 \. z2 _- m4 M+ W: ?; W │ │ │ stm32f10x_rcc.c │ │ │ stm32f10x_rtc.c* T! k$ z# x: s/ ~$ }/ j │ │ │ stm32f10x_sdio.c │ │ │ stm32f10x_spi.c │ │ │ stm32f10x_tim.c6 ?/ u4 Q( Q3 g6 k, w1 W% n1 J4 {2 G │ │ │ stm32f10x_usart.c4 q" ^8 t' ?9 P: H2 e; ? │ │ └ stm32f10x_wwdg.c8 P; b. E* h# N# w) Z │ └─inc │ │ misc.h │ │ stm32f10x_adc.h5 A5 @, H6 @9 s' r& u │ │ stm32f10x_bkp.h6 k6 F; R+ I& @" K │ │ stm32f10x_can.h │ │ stm32f10x_cec.h │ │ stm32f10x_crc.h8 [* o4 h: e! }! U. _1 V* ~7 l6 T4 G │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h. f; n" w) I7 w! U3 G. u1 Z) g │ │ stm32f10x_dma.h3 Q @4 G1 R3 r4 h9 k │ │ stm32f10x_exti.h2 J# R, v1 }6 G! r% ^' m │ │ stm32f10x_flash.h! X' H! V: c8 b; h │ │ stm32f10x_fsmc.h: z/ S& ]1 H4 g8 k* K9 p │ │ stm32f10x_gpio.h │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h5 R: z+ N3 @; R! L: H0 R) o │ │ stm32f10x_pwr.h2 Z; Y+ s3 G; _" D+ C │ │ stm32f10x_rcc.h) |, z$ W! h8 @/ l* S │ │ stm32f10x_rtc.h │ │ stm32f10x_sdio.h4 \* h; n) ?& @" a* {8 e5 F │ │ stm32f10x_spi.h& H- X# ]. ^) k. M │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h │ └ stm32f10x_wwdg.h │ │ └ BootLoad说明.txt C1 ]% W/ G9 e1 x bootloader及256Kb的测试例程打包下载: ![]() |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。