一、BootLoader程序使用说明: 5 h! [6 g3 y4 B, v/ j- X+ p 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。0 T: {: x/ \% a5 C H! Q 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。* L& X2 ?" b m3 i 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用' B, e ]9 }9 g U7 \. o 一边读一边写的方法,不受内存大小限制。 " L7 y4 H8 J# R* f, ~6 r9 ` 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控0 a$ N6 c( @0 ?' r) u" R a/ b; { 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为1 S! e) }6 ]0 h+ G' ? 230400bps,TTL通讯则可设为921600bps。+ Z# b7 A/ _) c8 s; w 7 ^+ T0 l1 t! |/ y) p9 \4 m 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送' j2 J0 j% G/ L0 J9 H1 V 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都 开启了看门狗,若有故障,自动复位,红灯一闪而过。# C+ I5 x; g! R6 d( `% s 5 跳转至APP程序前,需要关闭所有用到的中断,切记。1 [1 u8 A: B C y" R 6 LED指示灯相关的IO脚没有初始化。) y( U0 G( h$ l+ B2 e R 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中,$ d5 J1 x0 Y2 I! J2 R 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机),& t+ r( s/ ^9 g' M9 |, o; B 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。 Y; t% l5 z0 s9 F * l# G" Q/ l2 U$ | 7 用户程序的中断向量偏移设置如下:1 p# k0 ?% B8 l) z" V NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);! ^5 B3 w% _8 B' J! P! {6 W( G( p* K ; APP程序分散加载的例子 K6 R- W4 p) C- c. B ; *************************************************************: M" e& O6 l* @& l7 s: Z' T; @9 Q8 c) e ; *** Scatter-Loading Description File generated by uVision ***, M2 o& G' S5 H; p ; *************************************************************2 |7 P% [: B( D, z! s LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address; W5 I8 V: x" P9 c3 O7 T7 L7 r7 r% U *.o (RESET, +First)$ }6 {; v5 h$ q5 L' T* R *(InRoot$$Sections) .ANY (+RO), Y5 s5 Y1 q, M$ ~- Q( Z } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data ; main.o (exsram) ; exsram 内存段名称/ x$ m) K7 X* G3 O1 I: \ ;}2 i% m; |6 b- a9 M- z( m }# B8 w7 U2 K4 ] ! e$ v0 f, ^" h/ p* C$ ? 二、工程说明 ; Q/ [! H+ c1 A6 d0 I" I( x( q 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的0 _+ D2 V) q7 K* T0 x$ p+ t8 ` 应用代码: RS485,CAN,FSMC,SPI,TIM,AD 2 Q2 d% _- n( Q: a- {* @. l Project Targets 设置说明 1.Debug in Ram ! U5 P) N% Y- c) v& \1 f 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命" J2 ` `1 S3 @" u, j# l 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框# \4 }5 d- D3 ^1 q 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码# N. J5 i/ s5 {1 F$ J' w #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */0 ? B% t6 ]7 Y6 g /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); 1 D+ Z/ j, X- o- s #endif' z! p9 e# L+ X$ t/ k 这样就把中断向量地址转移到Ram中 7 ?8 }. H; b$ E& R5 x, {2 A 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings 在Cortex-M Target Driver Setup对话框, 选择Flash Download为Do not Erase,Program,Verify; _5 V5 ?2 o; Q3 D* b& C 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后 . \# ]4 s+ c7 N8 |. B/ ~0 ]1 F IRAM_EXSRAM.sct 分散加载文件: ; *************************************************************/ W/ O8 [5 i& N0 y: F: n& Y ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* + U8 M* p, F( l: ?( x) e) R v1 L LR_IROM1 0x20000000 0x0000A000 { ; load region size_region ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections)" M# k/ ^3 w2 U .ANY (+RO) }2 l, T$ x) r" e7 z3 O! x RW_IRAM1 0x2000A000 0x00010000 { ; RW data .ANY (+RW +ZI) } RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称- d) l& I, B" {$ b } }0 B* Y$ K" X, L+ F2 V RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件: SP = _RDWORD(0x20000000); // Setup Stack Pointer7 _& e8 J6 `7 c4 R; {$ u8 J: z( I PC = _RDWORD(0x20000004); // Setup Program Counter- u$ f. ]- F) L; M. \& N _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register, K% t# M( [: p/ s" O; ?+ J) o , I+ p. g7 G2 n9 I8 P6 f3 e 2.Debug in Flash " j: G7 h% n$ \3 q( x- V E1 H 在Flash中运行和调试程序,需要对Flash的反复擦除和写入# H' e: l1 A. f; o0 F0 ] FLASH_EXSRAM.sct 分散加载文件: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************( x6 A# K0 p; [% a0 I/ U% K . X& g8 {* x2 A LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; load address = execution address8 v& E% c- L9 F) k8 B *.o (RESET, +First) *(InRoot$$Sections), g# h3 F3 P) }6 {7 Q; k .ANY (+RO)) f& i1 ^9 D3 e9 l. x! ^ }) _8 H2 {0 j- A$ ?& j- Z) _% y RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI)0 `: Q3 _0 w, U } EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称# f; |) Z, a* p4 j }- t' h. W" w3 ^# F8 i5 D" p+ i" U7 D! ~ } ) b. U) I' c5 j; _. t$ D1 h _ 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化+ O1 q% Q8 U8 U0 I SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写:$ A- o5 Z+ g+ d map 0x68000000,0x68020000 read write exec; z5 P$ R- J- w 2 H% @* z3 X- I2 W/ u" c2 I 7 r3 k% b" [9 g y. e, { |0 m8 w 三、源代码组织架构8 e) B2 v2 B( j3 P( j, [ 文件夹名称: STM32F10x_BootLoad_IAP- |& G& j; C$ N3 p/ h # M* P# S c7 g5 q7 q5 `1 R0 p 固件库版本: V3.6.18 x& c$ ~" p4 o" e3 ` 文件目录结构: : l+ S3 A% u, @; v STM32F10x_BootLoad_IAP! s2 r! O) a) C% h) V9 X; R7 I$ L │/ @/ h! ^4 G. }' u- D; C. B: K9 D ├─Project8 B7 E0 b, ` h2 Y) ?9 f │ │ │ ├─inc │ │ │$ \$ `: o! U4 |% U: x, Z │ │ │ main.h$ R1 n. R0 y2 Y$ v I2 N) E# S │ │ │ hw_config.h │ │ │ fsmc_sram.h/ Z9 M, W( y+ n# j2 C* `$ v │ │ └ stm32f10x_conf.h │ │ + g1 N* y* x- a I+ o( X │ ├─src │ │ │ O/ ?' U! v4 ~) S e │ │ │ iwdg.c$ b9 T- Y7 ]7 I! V: v1 B1 a │ │ │ rcc.c │ │ │ gpio.c │ │ │ nvic.c │ │ │ tim.c' A! J* q+ |+ x1 ^& }6 } │ │ │ adc.c, ?- | E: T) C9 n( _* k- E │ │ │ usart.c │ │ │ can.c# f7 v# ~/ P) p+ n( a- ?! W! D │ │ │ spi.c ^0 c, b) F% u+ {8 \" l │ │ │ dma.c$ Z5 E/ D1 J& b! E, N9 D5 ` a │ │ │ fsmc_sram.c. Z- t( {$ Y5 F9 X$ i3 j/ M │ │ │ hw_config.c │ │ │ stm32f10x_it.c │ │ │ main.c │ │ │ modbus.c │ │ └ ymodem.c │ │ t, X$ v1 N" V6 N- `8 Y r+ T8 \: Q$ i │ └─MDK-ARM │ │ 8 G- C8 X# W1 J" K |1 Q: G; ? │ │ BootLoad_IAP.uvproj │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */$ d' n" v# u% E- X │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */5 {3 E: i5 e3 S+ R │ │ │ │ │ ├─ROM /* Debug in Flash */- ~5 W9 C3 p9 w8 z- h) Q( f6 x( e2 a │ │ │ │ │ ├─rom_List │ │ │ │ │ └─rom_out │ │% }( O: J6 v% { } │ └─RAM /* Debug in Ram */ │ │' z/ m' y; `: y( [5 o. x$ F7 s; x, j │ ├─ram_List │ │ │ └─ram_out │ 3 K7 @; r3 D' w% n) h ├─Libraries2 @0 p# K) B$ V0 z. X- k │ └─STM32F10x │ ├─CMSIS$ f% o$ Z2 W/ s │ │ ├─Device4 m6 {: \: ?6 Q' f │ │ │ └─ST │ │ │ └─STM32F10x │ │ │ ├─Include, F# m# g& l9 \2 \" O7 { U# N( T X │ │ │ │ │ stm32f10x.h % h. C" p, r1 s3 j9 A% w6 M4 F │ │ │ │ └ system_stm32f10x.h- s s9 H: x8 E) y4 E8 B9 ^4 v8 p! g │ │ │ └─Source │ │ │ └─Templates q( @$ `# D6 q0 B# X │ │ │ │ system_stm32f10x.c │ │ │ └─arm │ │ │ └ startup_stm32f10x_hd.s7 c; {/ _* b& ~7 B) d$ p │ │ └─Include │ │ └ core_cm3.h/ }7 g$ w9 {" m, ? │ │ │ ├─STM32_USB-FS-Device_Driver │ │ │ 7 d ]" S$ U( f+ A │ │ ├─src │ │ │ │ usb_core.c+ o! \4 P* d+ L4 n │ │ │ │ usb_init.c │ │ │ │ usb_int.c │ │ │ │ usb_mem.c │ │ │ │ usb_regs.c │ │ │ └ usb_sil.c- b# A+ D6 F5 M8 Z! K3 \4 { │ │ │ 5 o9 f6 L5 X4 j' v │ │ └─inc5 k# J& \ l G8 B │ │ │ │ │ │ usb_core.h/ |# D% _! S9 @( w) y. f) g% q0 n" c9 K3 @ │ │ │ usb_def.h7 {9 o: O$ V& [6 U │ │ │ usb_init.h: b0 h! Y2 n4 z6 U! j │ │ │ usb_int.h │ │ │ usb_lib.h │ │ │ usb_mem.h │ │ │ usb_regs.h │ │ │ usb_sil.h │ │ └ usb_type.h │ │% }' Q8 D$ e8 E6 F( H │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */ │ │ │ ├─src. J. J4 r( z4 `9 B │ │ │ misc.c │ │ │ stm32f10x_adc.c │ │ │ stm32f10x_bkp.c8 a. _# Q* x# G+ u" u3 H │ │ │ stm32f10x_can.c │ │ │ stm32f10x_cec.c+ d' N( k, j1 o! v% m │ │ │ stm32f10x_crc.c* y7 Z; b# U& o0 K7 e1 e │ │ │ stm32f10x_dac.c │ │ │ stm32f10x_dbgmcu.c7 c, o5 E- M! o2 z$ S: N) J │ │ │ stm32f10x_dma.c% \; Y, _" y2 Y6 _/ Y+ J │ │ │ stm32f10x_exti.c6 I6 [0 U; M: J- B! P) Z7 {0 B │ │ │ stm32f10x_flash.c │ │ │ stm32f10x_fsmc.c │ │ │ stm32f10x_gpio.c │ │ │ stm32f10x_i2c.c. t. ]# w6 }! C+ {, [4 A8 }4 `: [ │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c# X9 r( Z( v, x& Z- @7 y! J% [" F │ │ │ stm32f10x_rcc.c │ │ │ stm32f10x_rtc.c; i9 c9 {( e2 M3 ]# i │ │ │ stm32f10x_sdio.c │ │ │ stm32f10x_spi.c │ │ │ stm32f10x_tim.c! R( Q0 f* T+ O4 _ │ │ │ stm32f10x_usart.c' Z' S1 O$ {, x3 F │ │ └ stm32f10x_wwdg.c$ S! |2 J. X) U e7 a │ └─inc │ │ misc.h │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h: F6 n! x5 w. Y) I7 V h │ │ stm32f10x_can.h7 k- b6 ~! G& K5 b8 p1 E │ │ stm32f10x_cec.h' C; u& E6 m2 Z6 k │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h │ │ stm32f10x_dma.h/ O% ~+ `! N, V1 o% { │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h, J% F& u1 l8 R# X# t │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h) T9 I9 b6 {5 ^5 s │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h: {1 v- d. _3 A% v) [ │ │ stm32f10x_pwr.h │ │ stm32f10x_rcc.h' ?" O0 r: m p2 b* ^: O% u │ │ stm32f10x_rtc.h │ │ stm32f10x_sdio.h& a* e. I+ o [: W; s" f1 X │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h4 n! |) w. s; D, Z+ }; K+ T/ k │ │ stm32f10x_usart.h │ └ stm32f10x_wwdg.h: o$ A3 |1 |1 r% C$ E5 f" J │. ^ c/ z& w/ E1 u/ ?0 i │ └ BootLoad说明.txt . R6 I* n) ?+ `# ?2 _# R7 C bootloader及256Kb的测试例程打包下载: |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。