
一、BootLoader程序使用说明:/ N2 {( e- A$ n! B1 D! c % W3 B' [$ f8 g# x' i9 E 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用 一边读一边写的方法,不受内存大小限制。 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为 230400bps,TTL通讯则可设为921600bps。5 f* J) t8 X" A- R1 e ' R( ^# r, c- z" C% u6 R. w! _ 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送3 O, Z0 N# j) { 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议; I& s! U7 n0 m 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。% I6 `) N& q. t; X 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都5 W& x+ t1 Y' W2 `8 f 开启了看门狗,若有故障,自动复位,红灯一闪而过。( L( ?% _+ ~! @% Z8 J" `8 g8 ] 5 跳转至APP程序前,需要关闭所有用到的中断,切记。 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中, 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机),! _% T' o/ y4 ~8 ?% X' ^ 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。" l8 ^; e( e" _: X! w4 l2 r $ s- |9 r- G0 z9 Y" ? 7 用户程序的中断向量偏移设置如下:+ S, |5 `) n: U4 G* ^ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);4 K$ I1 @. m4 Y 9 n, I/ N* e* e/ G7 x ; APP程序分散加载的例子 i% r: ^% ^8 ^7 ^' y) r ; *************************************************************& @, V# T# c1 a9 D' b& r/ ` ; *** Scatter-Loading Description File generated by uVision ***4 O& Z. W d% y1 e: R$ w7 Z! E ; *************************************************************% K' G0 x# V/ U6 k# Z 5 ?/ g5 i) Q0 p% H7 B/ @6 @; v LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address* W/ |) D/ H0 S x6 c, V! D( [ *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) }" H. G/ ?9 O: U0 S; w [8 S RW_IRAM1 0x20000000 0x00010000 { ; RW data' \, J# N9 e- ]8 ~; Z, B5 E .ANY (+RW +ZI)8 e8 N9 s5 x$ G) T) j4 v; y } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data2 w. N1 k: V% D ; main.o (exsram) ; exsram 内存段名称 ;}( h- C' m4 |3 K+ z3 K7 d: t }5 |# J7 j# W, W& f6 N 5 J1 A, m9 O2 H' L/ c5 F! z+ b p . J/ a5 k$ W2 w0 K 二、工程说明" e, e* x$ C, x. R$ t 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的 应用代码: RS485,CAN,FSMC,SPI,TIM,AD , S6 q8 i6 J, t% K " X' m$ Y( U/ C- c2 x Project Targets 设置说明 1.Debug in Ram 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命7 z: w* I& g/ b3 V/ s& \ 3 y/ ?3 E( ~/ x6 A. Z9 _ 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码 + t" p: |" K D #ifdef VECT_TAB_RAM . |" n1 [* ~: P+ f4 ` /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 2 E! @0 v5 _9 z' U- A& F #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ ; Q1 J5 C8 D7 U2 C7 L9 U NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); * P+ s7 h8 X9 [# H# |4 S; `2 b4 m #endif/ ?8 Z( P6 W* t 这样就把中断向量地址转移到Ram中! k/ s5 V4 O( ]& w4 _ 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings 在Cortex-M Target Driver Setup对话框, 选择Flash Download为Do not Erase,Program,Verify9 ^2 c) h% f: w2 G7 k 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后 / V+ f! [: k' y8 i! ]# s IRAM_EXSRAM.sct 分散加载文件: ; *************************************************************4 `$ x4 u7 Y& a' k2 D ; *** Scatter-Loading Description File generated by uVision ***0 j5 n+ p2 [8 T" ~$ }$ l) r/ C ; ************************************************************* LR_IROM1 0x20000000 0x0000A000 { ; load region size_region ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address5 j# |8 o* g' ~' @/ O K; w0 G *.o (RESET, +First) *(InRoot$$Sections); M# M" Z9 ]6 i& b. z# m, m! f8 z .ANY (+RO)8 R# d" a7 q, p; W- L! N }$ `/ ~4 _ T0 a6 @# R% A& G0 u ] RW_IRAM1 0x2000A000 0x00010000 { ; RW data .ANY (+RW +ZI)- j, D Y. P4 U# n& _( k } RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称. J1 y0 s9 P3 N0 D5 J* y4 Y7 M( L } } RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件:! T- J: D( S9 _* @% z 3 x: {* N Q0 [# N SP = _RDWORD(0x20000000); // Setup Stack Pointer. V0 J9 {. ~0 z1 {% W$ l3 [ PC = _RDWORD(0x20000004); // Setup Program Counter4 L$ z+ t; D u/ F: R, z _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register3 M) K8 l' p6 v; q8 G! M 2.Debug in Flash- Z& z. W: ]# B3 u 1 i# [/ C* w9 W! i+ h 在Flash中运行和调试程序,需要对Flash的反复擦除和写入8 R4 D/ O* S, \" {7 ~; \3 z FLASH_EXSRAM.sct 分散加载文件: ; *************************************************************1 c' M/ Y" V: L4 c- r; c ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************. H8 Q3 s( ]/ G1 _9 M1 V- r2 f LR_IROM1 0x08000000 0x00040000 { ; load region size_region8 P" r R1 t4 d, C ER_IROM1 0x08000000 0x00040000 { ; load address = execution address *.o (RESET, +First)+ H& Z3 |* ?% X( D8 f *(InRoot$$Sections) .ANY (+RO)) @! g% I1 {" I; g, a }" ]1 g* ~1 B5 }' W% c RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) }, B# o: W# ^6 ~: ]. [% ^- _ EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称- S( Z" i: [; c d }& F' u$ }9 k" Z8 W1 k } # ]% f6 ~- N/ g" V" ]1 o8 o 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化 SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写:3 {* Q. q4 C, S/ d map 0x68000000,0x68020000 read write exec! A6 S& `7 r% Y 三、源代码组织架构 ( t; B: D! L. G4 T: G 文件夹名称: STM32F10x_BootLoad_IAP5 M8 p3 ~$ i4 c& _/ E7 J/ I 固件库版本: V3.6.1 文件目录结构: C' n1 w8 `/ v: ]. j( O$ I STM32F10x_BootLoad_IAP │ ├─Project" q# m# a; H8 j- V% ~( s& L │ │ 5 h8 ?8 v c* k, F" a │ ├─inc4 v' W# F8 o% v& R6 z3 Y4 S; K │ │ │) u: f! C0 X. k8 q6 e, E │ │ │ main.h │ │ │ hw_config.h │ │ │ fsmc_sram.h/ B3 q7 A4 K" r# Y# W5 e [ │ │ └ stm32f10x_conf.h │ │ │ ├─src* l4 Y' [ F3 A4 D │ │ │( z; c% X; V& a; A& [ │ │ │ iwdg.c+ w$ [! l) L1 Q- Z6 W │ │ │ rcc.c │ │ │ gpio.c │ │ │ nvic.c* u+ w: R3 S2 C# D) w │ │ │ tim.c │ │ │ adc.c │ │ │ usart.c │ │ │ can.c8 v" [, D- I+ H$ K │ │ │ spi.c! _1 o( ?. j$ @9 c" R) @1 ]. | │ │ │ dma.c4 K$ M; G3 Y+ |( U │ │ │ fsmc_sram.c0 X! _8 f* c9 l* q │ │ │ hw_config.c │ │ │ stm32f10x_it.c+ _3 m% l+ r" i- k, W │ │ │ main.c9 I; \+ h# C4 p, B │ │ │ modbus.c0 x5 e: s3 t+ p& F3 \ │ │ └ ymodem.c │ │ 8 `8 v! w' o5 K) R0 p( T │ └─MDK-ARM │ │ │ │ BootLoad_IAP.uvproj │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 *// C9 S3 ^$ r2 z3 r. ` │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ ) Q) G' X3 j( C# h; Q0 H │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */ │ │ │ │ │ ├─ROM /* Debug in Flash */6 f! H4 Q' h7 _3 u% T( R4 T │ │ │ │ │ ├─rom_List+ v( V1 @; J9 m* ?! t; b │ │ │ │ │ └─rom_out │ │ │ └─RAM /* Debug in Ram */) R. C9 o; B) Z5 I9 A. r. ` │ │# e1 H0 A7 b5 S" R8 w3 C2 S8 F │ ├─ram_List │ │/ d- ~+ {& o8 }* o( `: ^7 @6 t# ~ │ └─ram_out+ C6 `& V& h' t% |4 S5 ] │ # [) T5 ^. q/ F' `. q: S$ F ├─Libraries$ G0 C- n( x8 }( `# o) _ M3 s │ └─STM32F10x0 R% V* ?. Y) T9 s7 w │ ├─CMSIS │ │ ├─Device │ │ │ └─ST │ │ │ └─STM32F10x+ c+ t9 F5 c$ f; w' B% n │ │ │ ├─Include │ │ │ │ │ stm32f10x.h │ │ │ │ └ system_stm32f10x.h5 s3 G& J+ i+ C7 x0 C* _ │ │ │ └─Source │ │ │ └─Templates │ │ │ │ system_stm32f10x.c9 \, A! L! q# J7 ^! h9 f │ │ │ └─arm( I3 e" r" D' K% s$ s- U* a- J │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include2 Q- j8 ^4 V; c) k2 w! Y1 a# G │ │ └ core_cm3.h" t( E1 B$ O& L8 K5 d* b+ l) m; K │ │6 D; T$ N) E& b. E │ ├─STM32_USB-FS-Device_Driver │ │ │ │ │ ├─src+ G* m- O1 O8 r │ │ │ │ usb_core.c │ │ │ │ usb_init.c5 g! w. N- {: k$ f │ │ │ │ usb_int.c │ │ │ │ usb_mem.c │ │ │ │ usb_regs.c │ │ │ └ usb_sil.c% k* Z( b$ \, h3 {. n0 i1 [ │ │ │ & A* v$ G: {7 Z$ X4 p. M+ b │ │ └─inc │ │ │ │ │ │ usb_core.h: p, w6 O# [3 s) f' b8 m │ │ │ usb_def.h! W5 U D4 ~8 v9 C) D! A: Y │ │ │ usb_init.h0 D5 q$ k0 I W, j. S7 P1 T │ │ │ usb_int.h │ │ │ usb_lib.h │ │ │ usb_mem.h7 T) d! l: m( n0 a1 Q6 n │ │ │ usb_regs.h( e3 S; n) i) U# U, u( x/ V │ │ │ usb_sil.h& F5 o! |0 L% x, |7 q$ @ │ │ └ usb_type.h. Y1 k2 W& K/ H) b( p │ │& z7 G* b" ?+ n │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */ │ │ 0 ^* i7 s. p& e% Z │ ├─src │ │ │ misc.c │ │ │ stm32f10x_adc.c; O) d$ s+ }, }5 g0 i8 e: v$ ^ │ │ │ stm32f10x_bkp.c │ │ │ stm32f10x_can.c0 H& K" o8 f- I# W │ │ │ stm32f10x_cec.c Y+ y8 b' P- x, w4 _ │ │ │ stm32f10x_crc.c │ │ │ stm32f10x_dac.c │ │ │ stm32f10x_dbgmcu.c │ │ │ stm32f10x_dma.c! p( W. }3 E& \& E- J │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c: }. O3 A) `9 |5 G │ │ │ stm32f10x_fsmc.c! g0 D6 Z1 e: W6 V0 @' M' U │ │ │ stm32f10x_gpio.c% Y# a! Z6 ~6 X, j0 G │ │ │ stm32f10x_i2c.c+ G1 M3 r5 s& }- ? │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c& L) Z* S) B4 X5 w3 Z" ? │ │ │ stm32f10x_rtc.c │ │ │ stm32f10x_sdio.c( |: i; t. j" n, l7 L; U │ │ │ stm32f10x_spi.c │ │ │ stm32f10x_tim.c │ │ │ stm32f10x_usart.c( Z6 l3 y' w0 R1 o │ │ └ stm32f10x_wwdg.c* W! o m9 E, N& a │ └─inc │ │ misc.h7 K: m* r. S$ U( @ │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h3 w2 t8 z8 a8 a/ ~8 ? │ │ stm32f10x_can.h │ │ stm32f10x_cec.h │ │ stm32f10x_crc.h% w3 q2 Z F% x2 T │ │ stm32f10x_dac.h }& Z6 m* G, m: N. J/ t* i! I# V; X │ │ stm32f10x_dbgmcu.h5 p, t8 d. P% l" i% J4 Z( p │ │ stm32f10x_dma.h9 Q1 b# a" v9 m3 ?" Y+ h │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h( @: g6 L4 V% y │ │ stm32f10x_i2c.h0 j) F) Y. O v- G0 C' s" h │ │ stm32f10x_iwdg.h │ │ stm32f10x_pwr.h- B4 ~# r" a" X; i2 @; s │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h4 a0 k S! ^" G" W4 v% x. w │ │ stm32f10x_sdio.h │ │ stm32f10x_spi.h2 r1 d" b/ u, T% E │ │ stm32f10x_tim.h3 U$ }! }! `2 u │ │ stm32f10x_usart.h │ └ stm32f10x_wwdg.h │% o7 H3 @( m1 W) v3 T3 g8 | │: G w8 N6 d& x. S, P └ BootLoad说明.txt3 ~% X4 S' D! Y. X( a1 X2 N bootloader及256Kb的测试例程打包下载: ![]() |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。