
一、BootLoader程序使用说明:3 h0 V7 P4 [% i" A T 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。& [2 ?0 w2 w8 [ 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。0 T6 r, y2 r9 _- N6 t+ b 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用 一边读一边写的方法,不受内存大小限制。0 |* S, ?$ f( f ~ 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为) b# r$ _) ?2 J% I 230400bps,TTL通讯则可设为921600bps。 X5 Y5 w4 B3 ~; M, F & Z+ u5 V P! H 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议4 N3 W" U" X- }! R$ x+ t 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。' G, x% _5 Y8 z/ E% y/ ] 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都5 K: s# |: r1 T2 } 开启了看门狗,若有故障,自动复位,红灯一闪而过。% l. p& L2 l* v, X0 ]4 m7 [+ u# O # v' ] A' |! l 5 跳转至APP程序前,需要关闭所有用到的中断,切记。 3 |* V( O8 k; y1 N' c2 R 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中, 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机), 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。 7 用户程序的中断向量偏移设置如下:# q8 w8 q7 n2 x! F: x4 _, A2 T( @ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);% c% J3 P! j- o3 {, w ; APP程序分散加载的例子 ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************7 x8 Y. P6 I8 n) p& t LR_IROM1 0x08004000 0x00040000 { ; load region size_region' s$ @2 b$ d f5 g0 s ER_IROM1 0x08010000 0x00040000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections)# b" i6 n" C8 G8 G .ANY (+RO) }; Q I s6 E+ i2 X- ~3 c RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI)+ g" i; B9 h* v5 W+ @# F } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data ; main.o (exsram) ; exsram 内存段名称 ;} } ; u1 i9 g5 s) i1 O6 K# G 7 t) l) x. u7 m \4 z) f9 ] # _) @1 H# k1 c- }+ I$ x: V 二、工程说明$ ^: n+ r4 A% Y$ T% P8 d2 S3 R3 r 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的# o1 w0 K5 L5 n, H/ o 应用代码: RS485,CAN,FSMC,SPI,TIM,AD. [% H5 F- G: K) X/ `0 h5 a : d5 R) y6 w9 N" y 4 ?' A5 z( h7 R0 H- q! W1 k0 V Project Targets 设置说明 1.Debug in Ram 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命/ c& L. H8 E | 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框3 [" E: a5 t4 B! e4 } 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码 ( y6 J# D7 h& N, X! S w1 w #ifdef VECT_TAB_RAM 1 Z1 `( c. ^ g% ^3 s9 s8 T /* Set the Vector Table base location at 0x20000000 */ ( }9 ?' Q L, b. o4 Y% u NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); , F' [+ B6 u) x7 O' o: ~: q8 X #else /* VECT_TAB_FLASH */) }( U5 n9 f5 N /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif; u5 ?3 j0 z7 j l. l 这样就把中断向量地址转移到Ram中0 Z$ w. b t' d 0 h. i& u# e, n 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings 在Cortex-M Target Driver Setup对话框, 选择Flash Download为Do not Erase,Program,Verify 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后( k6 _3 G" W, V4 ]5 ?( G IRAM_EXSRAM.sct 分散加载文件:2 ]4 S* P) | M3 A' y9 L ; *************************************************************: d+ I7 W! a0 |( a ; *** Scatter-Loading Description File generated by uVision ***7 R1 ]& a. v" J ; ************************************************************* LR_IROM1 0x20000000 0x0000A000 { ; load region size_region x$ s9 y+ \+ G ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address4 w" w- j$ N% {1 w( }# O *.o (RESET, +First) *(InRoot$$Sections). B9 w/ J3 K7 X2 }5 g/ u .ANY (+RO) } RW_IRAM1 0x2000A000 0x00010000 { ; RW data .ANY (+RW +ZI)/ _/ |1 ~% ~2 |% @ }( Z, J# ?/ f8 Z RW_RAM1 0x68000000 0x00020000 { ; RW data# \. l4 r7 x; O, j5 V& Q3 } .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称 } }9 f w: g2 d( k4 X3 T" P RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件:; \; }0 a1 f- D! W% _# O! R! F 6 `" Q5 ?' P" ]5 ~ SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter1 o/ v7 g" `& v" b _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register* Y! n1 F, k3 u5 L d6 { 9 Q5 S$ Y# h+ Y; }$ m$ }& Z5 C # X) b6 ^9 q% s9 {2 y; w 2.Debug in Flash3 k9 U6 `9 a/ D. t1 {+ h* ^ W$ u4 m 在Flash中运行和调试程序,需要对Flash的反复擦除和写入 FLASH_EXSRAM.sct 分散加载文件:/ W( l& ^3 T; S V( e) V6 o# X/ F ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***. s8 e4 N% G1 V0 `. | ; ************************************************************* LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; load address = execution address/ L" z; ]) b% |6 ^ *.o (RESET, +First)4 J4 ?# T% E8 |% P6 ^% w *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI)2 I6 ~/ ?; x$ p5 c } EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称 }3 E4 d" @4 }# F5 O7 L, k } 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化 6 p7 p. f# p* t SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写: B- f* ]8 Q5 T6 D" E8 H8 } map 0x68000000,0x68020000 read write exec 1 k( ~! e) r* Y8 m9 Y 7 I g0 Y) |6 z3 u 三、源代码组织架构- _7 S# y& [/ {: M8 @- e+ { 文件夹名称: STM32F10x_BootLoad_IAP. J6 \+ @+ h. s/ k' K; k) F" h 固件库版本: V3.6.15 z4 {+ P2 T* w0 O4 Q6 e . e" z. U) A. H R 文件目录结构: STM32F10x_BootLoad_IAP │ ├─Project │ │ - W; A- f+ _; s+ L" `* w │ ├─inc │ │ │9 _: o: o" L& d) B( M; j │ │ │ main.h+ P. z! k5 ^+ G │ │ │ hw_config.h │ │ │ fsmc_sram.h# W( b; a, K- g) F, z │ │ └ stm32f10x_conf.h( e+ V' O! U$ l1 O. w9 u │ │ 3 A( t9 E" u: \3 i/ Z │ ├─src │ │ │ │ │ │ iwdg.c/ }# e& ?5 o& [( |( Q6 A3 O │ │ │ rcc.c │ │ │ gpio.c │ │ │ nvic.c │ │ │ tim.c+ ^+ j5 \" }/ O9 c │ │ │ adc.c │ │ │ usart.c │ │ │ can.c │ │ │ spi.c9 R" B+ A7 X" M. e │ │ │ dma.c │ │ │ fsmc_sram.c │ │ │ hw_config.c │ │ │ stm32f10x_it.c; X' ?" x: ?" J │ │ │ main.c, H+ ]( F4 O0 `0 v5 H │ │ │ modbus.c. [. Z. t3 o' s7 W. n. L │ │ └ ymodem.c' T6 ?! b% W' Z* T, d* w │ │ │ └─MDK-ARM0 J+ c7 S) I; [/ n A │ │ 5 p; n; m8 u1 u) R+ q; g │ │ BootLoad_IAP.uvproj │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */ │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */2 f5 o" m8 I; @; j8 e7 F K │ │ │ │ │ ├─ROM /* Debug in Flash */2 l# i; g' @9 Z' A3 z; _# q │ │ │ │ │ ├─rom_List8 }0 c% }5 Y _3 D │ │ │4 A9 D, U1 j* u3 d1 i& r* v# [ │ │ └─rom_out1 g$ ]" c {. [6 B │ │ │ └─RAM /* Debug in Ram */ │ │% x+ w) W6 y8 V- r4 Z │ ├─ram_List/ l3 [1 \% q: n, ~0 \7 y. ~7 j/ b │ │, _/ ]: U- \9 u6 r" a │ └─ram_out3 [. N" M6 b$ O2 G x │ ├─Libraries* i3 l% A) A4 ^5 X. @; c' G │ └─STM32F10x2 a4 H, Y6 b/ V4 @6 @7 V% G$ `5 ^+ ^: t │ ├─CMSIS8 ]8 v, l6 ]: J! F- q+ K │ │ ├─Device │ │ │ └─ST0 J. O7 Q" ^6 y" B3 q │ │ │ └─STM32F10x │ │ │ ├─Include2 Z" y0 t; M Y9 k7 W │ │ │ │ │ stm32f10x.h │ │ │ │ └ system_stm32f10x.h │ │ │ └─Source │ │ │ └─Templates" I) Y8 t) ?2 Y0 U/ y4 [" s+ t │ │ │ │ system_stm32f10x.c │ │ │ └─arm2 q# Q, p' Q/ G: }8 a7 H, } s │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include │ │ └ core_cm3.h9 a! G: M2 \8 K │ │ │ ├─STM32_USB-FS-Device_Driver │ │ │ │ │ ├─src │ │ │ │ usb_core.c │ │ │ │ usb_init.c+ P* G+ A% u7 F6 t2 a │ │ │ │ usb_int.c │ │ │ │ usb_mem.c │ │ │ │ usb_regs.c5 b" U4 I' B/ O │ │ │ └ usb_sil.c │ │ │ │ │ └─inc │ │ │ │ │ │ usb_core.h/ ~) z0 R( Y7 V │ │ │ usb_def.h5 V; J* |1 |0 ?& A! z5 B9 C$ m* t │ │ │ usb_init.h; Q3 k; I# I& t/ A8 | R │ │ │ usb_int.h │ │ │ usb_lib.h │ │ │ usb_mem.h │ │ │ usb_regs.h │ │ │ usb_sil.h │ │ └ usb_type.h' E7 \; O4 f0 k │ │/ h7 r# e/ e/ U) Y6 q │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */ │ │ 6 S3 \3 ~ k2 T ^/ N7 {1 ^3 [ │ ├─src$ f! B) ~) Y* w' q6 m( p$ V1 j8 o │ │ │ misc.c │ │ │ stm32f10x_adc.c% {6 C9 ~! O$ Q9 U │ │ │ stm32f10x_bkp.c │ │ │ stm32f10x_can.c M; I; y' ~9 N/ |$ ~ │ │ │ stm32f10x_cec.c# C' G, H4 r4 d6 C, U │ │ │ stm32f10x_crc.c3 [1 \2 I6 h' m/ D; Q. o y │ │ │ stm32f10x_dac.c# c1 J$ ^- Y- H$ ^# q8 q( i │ │ │ stm32f10x_dbgmcu.c+ E: Z W$ i7 u& s+ n+ _ │ │ │ stm32f10x_dma.c │ │ │ stm32f10x_exti.c8 Y) n6 w" H* M" Z$ E' z │ │ │ stm32f10x_flash.c │ │ │ stm32f10x_fsmc.c │ │ │ stm32f10x_gpio.c │ │ │ stm32f10x_i2c.c+ Q3 m" C5 y+ M3 f9 L) p3 N │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c% B& k3 f" o* j7 b n │ │ │ stm32f10x_rtc.c4 ~& g! H8 k) ~) a4 f( H1 Z │ │ │ stm32f10x_sdio.c+ |4 G: m" F( j │ │ │ stm32f10x_spi.c, T. R* e, [ F1 j: V; o1 x0 q │ │ │ stm32f10x_tim.c+ Q; X3 H& j5 Q8 q, w+ d │ │ │ stm32f10x_usart.c$ J2 j9 w$ ^! s% b- W& I) U7 n │ │ └ stm32f10x_wwdg.c. b3 F/ p8 D% L* U* w: n+ l │ └─inc( Q0 o. H7 K; h1 S- t │ │ misc.h │ │ stm32f10x_adc.h. b8 z7 s2 J* w; F% w( g │ │ stm32f10x_bkp.h) x" a# V5 R4 z# i, C │ │ stm32f10x_can.h+ x5 S8 x: J6 ]# d$ Y, b3 n7 x+ k, |% x │ │ stm32f10x_cec.h) U) i. S% p4 j │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h │ │ stm32f10x_dma.h │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h │ │ stm32f10x_fsmc.h* e& y1 E3 G: P1 v( E: ^ │ │ stm32f10x_gpio.h! Y9 @. \4 B6 X+ V │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h │ │ stm32f10x_pwr.h │ │ stm32f10x_rcc.h$ t" s" E$ _5 k! \0 h) q │ │ stm32f10x_rtc.h( b) W3 v6 u1 J+ C# B! p0 O @- P6 T( V │ │ stm32f10x_sdio.h$ u3 V$ Z# a5 ^! I │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h8 n; F3 C8 w5 i+ A8 r2 _ │ │ stm32f10x_usart.h! c% K+ E# p& A7 U; u) ^ │ └ stm32f10x_wwdg.h: u5 T7 p2 F. ? │ │ └ BootLoad说明.txt9 n0 u E6 S: [- j bootloader及256Kb的测试例程打包下载: ![]() |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。