
一、BootLoader程序使用说明:' F% }4 c' B, h3 }9 M ) k7 J/ E: M }; m8 Y9 { 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。 {0 a g: _: i4 F) z 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用 一边读一边写的方法,不受内存大小限制。 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为4 g9 ^5 \' s/ R) Z* g 230400bps,TTL通讯则可设为921600bps。 4 M' `* F; `0 |2 A 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议! P" r6 {4 Q7 j- R; o4 k 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。( b9 K1 ~8 T3 d' [3 ?- @3 ? # {1 k _! f7 J8 i, Q& T& K 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都' S+ J5 K, O) o! I, n/ k! W5 ^ 开启了看门狗,若有故障,自动复位,红灯一闪而过。 5 跳转至APP程序前,需要关闭所有用到的中断,切记。 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中, 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机), 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。 7 用户程序的中断向量偏移设置如下:8 s! `5 l' Z$ R NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); 0 L9 Q: @2 z/ \ ; APP程序分散加载的例子 ; *************************************************************# z! E9 j- x! r4 j+ a% g ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************- a! A8 X7 r9 X6 k , ]6 V5 J8 v" h. C5 u LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO)5 x( \8 T9 t# f9 M& F } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI)! z$ D" T& K% |+ m" S }. M+ ?( y i- t4 c ^. J ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data5 `2 r0 c) N+ ?# l ; main.o (exsram) ; exsram 内存段名称+ X) Y; A) s8 I2 G% ? b ;} } ! Q+ q8 W$ Y6 j1 b! [; v( [ 二、工程说明 $ I$ _3 b: R$ i+ R- o6 j 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的 应用代码: RS485,CAN,FSMC,SPI,TIM,AD3 c: z! W' ~. G" U , r8 h9 t M$ p X/ K, E/ g 7 U s3 d Q4 b2 @! \ Project Targets 设置说明; C' s, y' N1 ^* b' m6 c 1.Debug in Ram" |, z. b& [7 d% y. _2 `" n8 F1 T 3 {( r4 p, C( }3 x0 S 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命: \1 h' ~0 |. v/ C$ Y1 ?4 C2 H ? + d+ S$ z4 j2 u( w0 W f 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框( y$ K: k, M5 _$ I0 u 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码; `, V4 M" A! [1 d; { z ) w; x& Y/ `# f2 c, q #ifdef VECT_TAB_RAM ) f+ w; p' v$ b A3 T1 h /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 2 d( ~/ Y& c& i9 k9 `( P* P #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); ( I" U: P3 k) Y2 } #endif$ L4 n" m+ `! U2 Y g, e 这样就把中断向量地址转移到Ram中 ! X. ~ S) X9 i' ~$ o# t; [ 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings 在Cortex-M Target Driver Setup对话框, 选择Flash Download为Do not Erase,Program,Verify 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后/ `2 y' x4 ?2 v1 u; Z$ g& h IRAM_EXSRAM.sct 分散加载文件:4 l4 }6 Y/ R; Y( w5 P/ G& i; j/ V ! M! N! A, B# k+ a7 C2 f3 g; f ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x20000000 0x0000A000 { ; load region size_region ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections)* D0 _. C2 B+ J .ANY (+RO) } RW_IRAM1 0x2000A000 0x00010000 { ; RW data/ v; M) H. r- B .ANY (+RW +ZI)% w, ], B& i) Q3 t- @ } RW_RAM1 0x68000000 0x00020000 { ; RW data/ x+ _ u9 N' T4 u U; r .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称 } }1 D$ [' N( o. h; _: h( f+ v; T7 F RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件: % m2 a$ P( J F6 l SP = _RDWORD(0x20000000); // Setup Stack Pointer( U- o' Z4 R4 @* x PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register / v$ B% D9 c* @) A4 Y r9 Q) t% i 2.Debug in Flash 在Flash中运行和调试程序,需要对Flash的反复擦除和写入 ) \( s6 H7 F! B5 m FLASH_EXSRAM.sct 分散加载文件: ; *************************************************************& W9 s5 B/ R: t; X6 O! c9 { ; *** Scatter-Loading Description File generated by uVision ***5 W2 v% A& }) d9 I ; *************************************************************, c- \4 W6 u" z" I , T# q) J" ?$ W# h/ c LR_IROM1 0x08000000 0x00040000 { ; load region size_region4 F! Z F9 a- _ ER_IROM1 0x08000000 0x00040000 { ; load address = execution address) O8 ^# M! w" ]9 t+ j *.o (RESET, +First) *(InRoot$$Sections)& y0 X' }& w" v1 ]: J .ANY (+RO)+ n- B6 L0 p3 z% O9 |0 { } RW_IRAM1 0x20000000 0x00010000 { ; RW data u; ^8 j8 H9 S6 v2 y0 R .ANY (+RW +ZI) } EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data7 ~: o( d: z6 Y1 z: t9 a main.o (exsram) ; exsram 内存段名称 } }) l0 Z: }* ?: z: V- |5 r 1 y7 _. Z$ f3 ?# } 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化 SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写: ( G" g" ~& [! a2 {* G' g* x map 0x68000000,0x68020000 read write exec ' h Q2 Z8 p {( ^3 h 三、源代码组织架构 _- f! ]9 G! ^9 B 文件夹名称: STM32F10x_BootLoad_IAP 固件库版本: V3.6.18 o: l6 W& H; J3 X5 r+ b/ O( J 文件目录结构:& p* Y0 k* T0 z9 P' ` STM32F10x_BootLoad_IAP │ ├─Project d/ N* W2 O3 j1 a! X- |3 F │ │ │ ├─inc% e( k$ S$ _, [' f) }# W3 ] │ │ │ │ │ │ main.h0 e1 {7 ~* Y1 c8 X │ │ │ hw_config.h │ │ │ fsmc_sram.h │ │ └ stm32f10x_conf.h/ o7 x0 C- f( ?3 q# Q* g/ b, X │ │ │ ├─src │ │ │ │ │ │ iwdg.c │ │ │ rcc.c │ │ │ gpio.c │ │ │ nvic.c │ │ │ tim.c │ │ │ adc.c │ │ │ usart.c3 }# j2 Y; y: v. W │ │ │ can.c │ │ │ spi.c- U3 X# d% A- a5 l │ │ │ dma.c │ │ │ fsmc_sram.c │ │ │ hw_config.c │ │ │ stm32f10x_it.c0 }+ [3 [7 U- {: D, H- Z5 { │ │ │ main.c: g2 c# ~% B! [/ {6 k1 b │ │ │ modbus.c │ │ └ ymodem.c │ │ │ └─MDK-ARM! K( t, P, r# {$ h0 [ │ │ 7 r: D6 B# x m1 i, L3 J5 U │ │ BootLoad_IAP.uvproj r$ |" y: v0 p% b) u3 g8 C: B │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */$ D: b D5 e6 _5 H2 O. o) P2 ]# H │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ │ │ RAM.ini /* IRAM调试初始化文件 */ 0 m8 e8 h3 E1 r │ │ SIM_MAP.ini /* 软件仿真初始化文件 */4 c& B P/ Z* R0 x( O │ │ │ │ ) r# ^7 y+ { |& z8 o │ ├─ROM /* Debug in Flash */; v, C$ N& D% B3 j! } │ │ │1 X% n( y0 m8 ]; M% q: w │ │ ├─rom_List │ │ │ │ │ └─rom_out │ │ │ └─RAM /* Debug in Ram */* h. U+ ^5 m7 t/ i3 B │ │ │ ├─ram_List │ │ │ └─ram_out │ $ r% {$ Q4 I* n) C0 F7 M ├─Libraries │ └─STM32F10x │ ├─CMSIS │ │ ├─Device │ │ │ └─ST │ │ │ └─STM32F10x# B- ^& ^& H. |/ h! X9 ^7 {$ L │ │ │ ├─Include │ │ │ │ │ stm32f10x.h │ │ │ │ └ system_stm32f10x.h/ t/ I% f s: x; V7 z- O$ n │ │ │ └─Source │ │ │ └─Templates │ │ │ │ system_stm32f10x.c: { `+ |; o8 H │ │ │ └─arm │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include9 z3 P8 ~$ \5 @. N │ │ └ core_cm3.h │ │2 f! w2 F7 ?1 u7 C$ d3 S" b# Z2 k% O │ ├─STM32_USB-FS-Device_Driver& I* d9 F1 T7 g2 e1 L. j& F+ T+ n │ │ │ │ │ ├─src │ │ │ │ usb_core.c# z8 ?1 t/ ~5 d8 @+ L5 ]/ w │ │ │ │ usb_init.c │ │ │ │ usb_int.c │ │ │ │ usb_mem.c4 w9 S$ ?. O1 U │ │ │ │ usb_regs.c0 m1 T# Q7 v: a+ S3 ~% b% c; M4 P4 T' | │ │ │ └ usb_sil.c+ L/ z3 L+ h3 Q │ │ │ ' D0 Y+ j" ~$ K │ │ └─inc │ │ │ │ │ │ usb_core.h5 X( e) W ^% x │ │ │ usb_def.h- I5 G. D! u7 m5 `( ^$ c0 y │ │ │ usb_init.h# L& H# a9 L% K0 q* O( B J4 r │ │ │ usb_int.h! J ]! k/ r x3 ?5 b! l" F, M │ │ │ usb_lib.h │ │ │ usb_mem.h6 }5 V! S3 `( p9 w9 J/ g6 Q$ A% P │ │ │ usb_regs.h7 a1 C9 i; O8 H0 y' t │ │ │ usb_sil.h │ │ └ usb_type.h │ │ │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */* b' n- I& F6 V4 h0 r) p7 x │ │ │ ├─src. e0 N% j5 e g, @ │ │ │ misc.c │ │ │ stm32f10x_adc.c │ │ │ stm32f10x_bkp.c8 w. c' |. X6 M T7 q6 v │ │ │ stm32f10x_can.c1 ~, r. e( W) e) Q. n) D │ │ │ stm32f10x_cec.c │ │ │ stm32f10x_crc.c │ │ │ stm32f10x_dac.c/ }+ L- m/ m1 a! N( f1 X G5 u │ │ │ stm32f10x_dbgmcu.c3 \5 ^0 S# h5 P6 y9 R, {1 {% n! F4 O │ │ │ stm32f10x_dma.c) v4 F9 I# q' y8 E A │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c. F7 @8 I% V/ S2 v$ O# _ │ │ │ stm32f10x_fsmc.c) }# K, X; R: B │ │ │ stm32f10x_gpio.c │ │ │ stm32f10x_i2c.c │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c │ │ │ stm32f10x_rtc.c; c, \& z& v+ E4 [- |, ] │ │ │ stm32f10x_sdio.c5 u9 }5 @( G/ f" b' Z │ │ │ stm32f10x_spi.c0 T* W: D7 o6 h! `% e1 y │ │ │ stm32f10x_tim.c │ │ │ stm32f10x_usart.c- L; M% k4 F. M, l │ │ └ stm32f10x_wwdg.c$ r; A9 s, e ?; h6 m │ └─inc. D7 Z Z. L; T% ~4 a( Y% P" P │ │ misc.h$ Q$ O% }( J. x+ z │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h: m9 x" f4 A' @. _" r │ │ stm32f10x_can.h. t4 T- n& S) R) U% K$ S. ` │ │ stm32f10x_cec.h │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h' t J8 T$ J7 l% H │ │ stm32f10x_dma.h │ │ stm32f10x_exti.h, F, J" u" A9 ^. g0 c) T4 b. a │ │ stm32f10x_flash.h/ t: t$ Y! ]. j, i- T$ W- l$ s: h5 J │ │ stm32f10x_fsmc.h4 p g% d4 M0 o% @) l9 Y* |. t │ │ stm32f10x_gpio.h2 f$ r( E# ]& M: [1 Z* |+ S │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h │ │ stm32f10x_pwr.h │ │ stm32f10x_rcc.h2 ]6 w* \' T) M' a a) n │ │ stm32f10x_rtc.h" k. X5 }: s* Q( P │ │ stm32f10x_sdio.h4 ^" q9 X1 @7 @+ q* ]6 {+ H8 o │ │ stm32f10x_spi.h4 G. O8 e- J0 k$ d │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h7 O9 h2 _8 w0 S2 T# g! {) N │ └ stm32f10x_wwdg.h, v- }% ~5 Q! g# n) k7 O. L │ │9 M& H* G( h' ?+ K: j/ N( F └ BootLoad说明.txt( { n: F- l3 E% N! O7 U , N, g6 c. Q* F( `' @ bootloader及256Kb的测试例程打包下载: ![]() |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。