
一、BootLoader程序使用说明:: |0 d8 `% a) w% k ! ]2 @2 \8 q4 o4 ` 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。; A5 j$ M4 M+ i 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用: i$ a! w9 ~' w9 k* b. f' `. u r 一边读一边写的方法,不受内存大小限制。 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控4 ]; v4 t# q" R; y1 K5 `6 ` 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为# e4 f1 ^+ E- F7 B6 S6 E1 V4 ? 230400bps,TTL通讯则可设为921600bps。 ; p. y9 M( F; l 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议8 H) l# u: t8 c% M- t. d; {! |; k 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。8 b4 Y% J) Q( L- w, Z9 | $ M4 m# T/ b' {! J' b 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都2 L( V9 C6 F# \9 H 开启了看门狗,若有故障,自动复位,红灯一闪而过。% Y q& V& b+ t0 s+ c( e 5 跳转至APP程序前,需要关闭所有用到的中断,切记。 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中, 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机), 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。4 S6 i- X' N$ T' N/ g % o0 g& W( A+ W; [: f 7 用户程序的中断向量偏移设置如下: NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); ; APP程序分散加载的例子 ; *************************************************************) K1 t, L$ ]( s( t+ Y) [ ; *** Scatter-Loading Description File generated by uVision ***9 k; D- V2 C1 [% [ ; ************************************************************* LR_IROM1 0x08004000 0x00040000 { ; load region size_region: A4 M1 ^4 w Z% k- h. M7 l ER_IROM1 0x08010000 0x00040000 { ; load address = execution address *.o (RESET, +First)% O) g) Y8 t0 ^) \* P/ G *(InRoot$$Sections), { a0 \' r" z, P6 u" L8 \+ M .ANY (+RO)7 d1 m6 l9 @: ^0 z8 t2 R$ c5 z }+ c9 j8 o5 u7 M- s RW_IRAM1 0x20000000 0x00010000 { ; RW data2 V- G$ c8 ]* I; R- b, D .ANY (+RW +ZI) } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data ; main.o (exsram) ; exsram 内存段名称 ;} } 二、工程说明5 _5 E6 w7 |1 _7 ? + j6 P6 c/ M. @( w" N. i5 @ 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的; g+ v0 g' B5 Z2 {9 p3 [7 e 应用代码: RS485,CAN,FSMC,SPI,TIM,AD; b9 \# F3 K& i# v* `' @6 } 8 u( V3 }! E/ Q7 c" h 7 N1 j- s2 K0 H# u& @# I6 T Project Targets 设置说明 1.Debug in Ram 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命 ' [9 y6 U* n( K 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框7 N% L, ?: p' ^6 J 增加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); # ?0 y$ T8 v2 E9 E6 Z+ U, M" O: S #else /* VECT_TAB_FLASH */. t- w; u2 B6 ~% ?, D# l3 K$ ~, P /* Set the Vector Table base location at 0x08000000 */ + ^4 t- T/ d6 Z8 O1 U NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif 这样就把中断向量地址转移到Ram中$ O7 X: |3 y& L3 @ , }3 t- l- V# C- S% w' O 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings k4 ^( r9 a1 p+ x% r! r2 v 在Cortex-M Target Driver Setup对话框, 选择Flash Download为Do not Erase,Program,Verify 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后 IRAM_EXSRAM.sct 分散加载文件: ; *************************************************************6 m. K! N# @3 d4 b* q, v5 S ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* , E, h. a! e3 a" j LR_IROM1 0x20000000 0x0000A000 { ; load region size_region ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address *.o (RESET, +First)+ p1 T2 x, d4 C% b$ t; D *(InRoot$$Sections)8 r4 n- ^2 X+ O9 s .ANY (+RO) } RW_IRAM1 0x2000A000 0x00010000 { ; RW data. b0 P7 E' o' W% n) m+ R( I [ .ANY (+RW +ZI). N; t5 V8 T/ h- \2 J; Y }+ H7 C' K. @4 k RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称 } }4 R" T7 ]) m! x. \ RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件:4 J% n- F$ K2 z" M' o0 O, o- D SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter* B/ J7 T5 I q( r4 ]) Z1 q: R _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register 2.Debug in Flash h" [1 R( A# H 在Flash中运行和调试程序,需要对Flash的反复擦除和写入7 u. M. z# [: G9 d FLASH_EXSRAM.sct 分散加载文件:3 q6 g% v* E2 g' S ! N4 c' E2 x z+ L+ G1 e' M' I ; *************************************************************' g; V2 I( M& c* V$ x: }, v* w" J! o3 ^ ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; load address = execution address1 `' t4 u7 S6 Z0 C7 _% v" M* s: {3 ~ *.o (RESET, +First) *(InRoot$$Sections), G2 H2 N5 N: _& B8 y( b .ANY (+RO)) h3 n5 S1 e* I5 t }& T6 u, D1 Y" x9 l: V' ~9 x RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) }' z6 h# G9 B( R* s EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data6 z& O! O' U; \1 _- B main.o (exsram) ; exsram 内存段名称 } } 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化& F. O+ v }5 f' P" ~6 W2 w7 r- a( l/ m SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写:6 G5 G) M3 e+ p0 e/ f 8 [% r5 n5 e; v8 I4 V% z map 0x68000000,0x68020000 read write exec 三、源代码组织架构1 X8 _' B. m% `# @/ Y 文件夹名称: STM32F10x_BootLoad_IAP 5 N v$ q O% W: `9 |$ h$ F/ T1 e* O 固件库版本: V3.6.1 g8 G" X$ G" x9 Y6 Z" e 文件目录结构: STM32F10x_BootLoad_IAP │ ├─Project │ │ │ ├─inc: d W$ Z& H3 j( J │ │ │ │ │ │ main.h4 h; \# M, d& X7 b │ │ │ hw_config.h& [0 e+ [( b4 e6 l( p" n │ │ │ fsmc_sram.h4 X- H9 ?+ \) [, B) ?7 e4 Z │ │ └ stm32f10x_conf.h │ │ │ ├─src/ _7 T# u; n5 I │ │ │( `: C4 e$ k* k1 N │ │ │ iwdg.c" l; f+ ]( }, j! o) O% i │ │ │ rcc.c │ │ │ gpio.c │ │ │ nvic.c) Z: o& u% G5 J │ │ │ tim.c │ │ │ adc.c │ │ │ usart.c │ │ │ can.c+ o* q P t% Y# a │ │ │ spi.c │ │ │ dma.c1 |7 a$ @0 c/ ~2 G │ │ │ fsmc_sram.c │ │ │ hw_config.c% }8 ^. Z. M1 X, ~ │ │ │ stm32f10x_it.c6 w% _1 e- P3 w2 l0 ?0 k3 a3 q │ │ │ main.c4 t3 v. m" ]( _0 U │ │ │ modbus.c+ m7 E3 L* `2 p2 W │ │ └ ymodem.c │ │ │ └─MDK-ARM │ │ - f+ P' F8 k7 d │ │ BootLoad_IAP.uvproj, @. `: P+ P* |, q9 A' T │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */4 h/ C4 c* c/ @3 g$ } │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ % V% k Q( w" a │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 *// @4 Y3 b3 l D# r; Q9 Y9 L │ │ 4 E4 p- ~+ ?1 T- Q- E │ │ 0 ]2 ]3 e+ K- s+ B! \% | y9 L! S │ ├─ROM /* Debug in Flash */ │ │ │" f2 y0 [* {% ?* \- b( z+ i; b1 c │ │ ├─rom_List8 F$ G; K: j0 c: c2 W: o3 m │ │ │; u8 E/ J) k+ P% ]- g │ │ └─rom_out o6 \: a: J% h; E0 W │ │ │ └─RAM /* Debug in Ram */ │ │3 Y8 s, k9 z6 ^! F! z" D) H │ ├─ram_List) P! t/ o4 F- ^4 f5 K │ │" w; u* m3 l3 e" y( v3 a5 @ │ └─ram_out1 w" n, A" ]( w* ]$ b │ ├─Libraries │ └─STM32F10x4 j C: C1 r, n │ ├─CMSIS* j0 M" e M- J" K# K P4 l5 ]* N │ │ ├─Device* t" h s/ h- r: I1 X+ R3 u │ │ │ └─ST# b$ q/ v: r# o9 Y, s │ │ │ └─STM32F10x: ]" [5 p4 r- k" `7 I) i& L) U │ │ │ ├─Include- u8 } C' R C* D. n, Y │ │ │ │ │ stm32f10x.h │ │ │ │ └ system_stm32f10x.h* g. A% R: d8 V W │ │ │ └─Source. q. R8 a! l5 x7 \ │ │ │ └─Templates │ │ │ │ system_stm32f10x.c │ │ │ └─arm │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include │ │ └ core_cm3.h7 C' h, B* Y z% Q │ │ │ ├─STM32_USB-FS-Device_Driver │ │ │ 9 v( _0 g, H, i, ? │ │ ├─src1 T* c2 l+ J; I; r │ │ │ │ usb_core.c- K1 p: ^* M" m' Q2 F1 I │ │ │ │ usb_init.c │ │ │ │ usb_int.c │ │ │ │ usb_mem.c4 O5 U+ z N) h9 ] v │ │ │ │ usb_regs.c │ │ │ └ usb_sil.c │ │ │ . ^. Z, H; v% }, l │ │ └─inc9 T& t7 q' Q ^" J# m │ │ │ │ │ │ usb_core.h6 P; @1 V% ]9 P6 H3 Q8 d- }# K │ │ │ usb_def.h │ │ │ usb_init.h │ │ │ usb_int.h │ │ │ usb_lib.h0 g1 @ C1 Y; E; D3 H │ │ │ usb_mem.h3 ?' w) l5 ^) Y Q2 Q6 e │ │ │ usb_regs.h │ │ │ usb_sil.h │ │ └ usb_type.h R& a/ `+ Z* t% _* ] │ │ │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */ │ │ │ ├─src │ │ │ misc.c │ │ │ stm32f10x_adc.c5 F5 G8 w! b* y% ?9 |0 R │ │ │ stm32f10x_bkp.c │ │ │ stm32f10x_can.c │ │ │ stm32f10x_cec.c │ │ │ stm32f10x_crc.c3 r3 N1 f2 `3 A6 C3 Q( ~4 X │ │ │ stm32f10x_dac.c │ │ │ stm32f10x_dbgmcu.c │ │ │ stm32f10x_dma.c │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c9 u& n, \. M/ r" R2 F/ ? │ │ │ stm32f10x_fsmc.c3 M1 l' i$ }! q7 t │ │ │ stm32f10x_gpio.c. p* T9 \7 e* E' e │ │ │ stm32f10x_i2c.c │ │ │ stm32f10x_iwdg.c( ]6 q) |( d% [; l* R* |2 B6 b' ]1 V: r │ │ │ stm32f10x_pwr.c5 u& f7 D; B8 j" Y- W │ │ │ stm32f10x_rcc.c │ │ │ stm32f10x_rtc.c │ │ │ stm32f10x_sdio.c1 C1 N9 t; Z6 l, F5 l │ │ │ stm32f10x_spi.c8 y2 b, f9 C } │ │ │ stm32f10x_tim.c │ │ │ stm32f10x_usart.c │ │ └ stm32f10x_wwdg.c$ J; [5 z# z' `! K, v( H! u* ~ │ └─inc │ │ misc.h │ │ stm32f10x_adc.h! u' k H' J7 e+ t7 e │ │ stm32f10x_bkp.h; w! y4 |4 \- n0 ]/ r( ?- P8 S │ │ stm32f10x_can.h6 o' h1 m2 e$ M: [8 m" U6 C1 j │ │ stm32f10x_cec.h │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h5 n y. A8 y- e" H' }: i. H │ │ stm32f10x_dbgmcu.h │ │ stm32f10x_dma.h3 _; F6 A. D3 @1 j9 Z5 O- H │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h │ │ stm32f10x_fsmc.h' R2 r! _% r; |) T2 Y │ │ stm32f10x_gpio.h │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h9 X: a6 P- ]0 b( \: @/ C1 X │ │ stm32f10x_pwr.h; [3 l5 u8 }. X' R, [' s. E │ │ stm32f10x_rcc.h9 }) x8 e- v+ m$ `( f" _ │ │ stm32f10x_rtc.h5 H$ x3 T# i/ f │ │ stm32f10x_sdio.h, ?. Z) g V# W% w( @+ d │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h( x' H9 |7 }; P5 E' ?7 J1 V& ~+ p │ │ stm32f10x_usart.h. A2 T' S; y3 n │ └ stm32f10x_wwdg.h │' C4 o6 Q+ G& S! ^( U: H' A │ └ BootLoad说明.txt+ G: u: v0 O% B, Y% k+ g3 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程序及测试例程打包上传。