
一、BootLoader程序使用说明:+ w* e) s4 M( L" Z7 b* u 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。3 A9 S, V$ N+ }* ~% B 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。% K) Z6 h/ Z8 A4 h 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用 一边读一边写的方法,不受内存大小限制。 4 y6 t; O8 h$ L( o8 m; Z 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为5 J" D8 _, a! |& U, r8 r& ? 230400bps,TTL通讯则可设为921600bps。 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送- v I* L5 n7 L& x 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。% J1 G, j' R0 | 2 u$ ^: z- L% s; A2 {$ l6 q 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都* c- q" U) B6 F/ k8 }% Q; { 开启了看门狗,若有故障,自动复位,红灯一闪而过。9 D, c5 ~9 b' c0 F0 J& Z* W U a4 b: [; L- ~ 5 跳转至APP程序前,需要关闭所有用到的中断,切记。) }9 f3 K0 R( N5 V; A9 { 6 LED指示灯相关的IO脚没有初始化。 M% q1 g, n$ A 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中, 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机),# w0 `5 Z( C9 f+ C 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。4 h f6 X k, v! ^2 s : R# }2 j4 U4 i; t" G' R4 Q 7 用户程序的中断向量偏移设置如下:8 s* k8 @( v2 x6 N$ r& j: y NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); ; APP程序分散加载的例子3 {1 R4 D( @2 J+ P* m ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************; g$ S5 c6 u: e3 L7 q ! _. `( y4 J! z Y( L1 w# i! j LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address9 Q% W# b3 E$ z: G( \0 v( ] *.o (RESET, +First) *(InRoot$$Sections)1 h) Y# A. z. { n% p$ s .ANY (+RO) }4 f( @) t! {7 B. F# x RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI)7 a( z. C; }8 l$ _ } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data' ]( i2 E' a; p2 s3 {( L N ; main.o (exsram) ; exsram 内存段名称- ~: i' c6 P7 q) q ;}% a& s. M( G$ ] }2 O0 J" n( ^3 B3 X; D : C7 I# a! U, S! \+ m, F5 T8 G9 o ) Z3 }, _4 A" c# _+ h$ L 3 N0 Q2 E8 i7 D" O 5 u& C# a3 y& u! d, ^( P8 c# s1 B# ` 二、工程说明1 R0 z7 z6 S: C/ s 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的 应用代码: RS485,CAN,FSMC,SPI,TIM,AD/ E Q* f+ A0 ` & w3 \! h2 C1 j9 Q& w5 y6 b Project Targets 设置说明4 X5 z8 ?# O! e5 [8 Y 1.Debug in Ram $ @3 L+ S% N% o3 y! w 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命% k2 z( j/ x8 E/ x4 x o: } 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码 #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ $ T* q% i0 b5 X9 ]5 E5 A- R NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 3 {- w" |0 P2 E& a1 m5 Z #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif 这样就把中断向量地址转移到Ram中6 ]5 I. h0 n! A" A " R& F# D6 B/ R( r- ?# x 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings 在Cortex-M Target Driver Setup对话框, 选择Flash Download为Do not Erase,Program,Verify 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后 IRAM_EXSRAM.sct 分散加载文件: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***+ s+ S+ R' R% N/ V ; *************************************************************" V& Q* ?" u6 `* T LR_IROM1 0x20000000 0x0000A000 { ; load region size_region2 F8 S0 D0 h0 w& {: P ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) }' G8 Z6 s7 K5 H/ V, Y RW_IRAM1 0x2000A000 0x00010000 { ; RW data- w! B a' m3 M- ]5 H2 ~ .ANY (+RW +ZI)/ t+ T4 g& I8 ~1 Y } RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称: _5 J, G6 B0 ` }; J( B2 W# Z3 r8 { }! ^3 I& P, E/ r( i' K8 q u RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件:* I+ x u6 A2 b6 U$ b- m d- V) V) M ( a) u! R3 T$ V SP = _RDWORD(0x20000000); // Setup Stack Pointer: q. }3 L# z5 L3 Y+ K; F% j PC = _RDWORD(0x20000004); // Setup Program Counter% t; |" ?: B0 j4 J* q" a _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register% O' C' ] Q$ G! s3 P9 I 2.Debug in Flash8 V# f8 G8 {7 w6 x X; ^7 ^ 在Flash中运行和调试程序,需要对Flash的反复擦除和写入 FLASH_EXSRAM.sct 分散加载文件: ; *************************************************************0 p/ t. c& e$ i2 A" n ; *** Scatter-Loading Description File generated by uVision ***1 _% H6 Q; z' F3 S8 _& g! D. S ; ************************************************************* LR_IROM1 0x08000000 0x00040000 { ; load region size_region4 \8 z( X, i) v9 J. Y ER_IROM1 0x08000000 0x00040000 { ; load address = execution address8 C2 Z) u3 [ B" W2 X1 Q" o; E *.o (RESET, +First) *(InRoot$$Sections)3 Y, p# i9 E, E: d' a .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) }! l) U+ Z/ z3 o) m# z: q EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称 } } $ y: @+ z7 q: Q) `9 } 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化+ |$ P! G0 J" N7 I! p SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写:! Q9 U( n' p& U8 j( _! m! P: N map 0x68000000,0x68020000 read write exec 9 q9 k+ \1 B5 Q 三、源代码组织架构2 C3 S1 C) ^# \3 U # f& e: p4 }; u' I2 d 文件夹名称: STM32F10x_BootLoad_IAP 固件库版本: V3.6.1 文件目录结构:( t$ J7 [" O5 V& b R STM32F10x_BootLoad_IAP; r, I$ C9 D! e T │7 c7 i; B. C8 L1 p( V ├─Project W Q% Y% I" j9 i% y: o │ │ 1 n0 W( Z! B' D# _4 [. r │ ├─inc │ │ │7 y7 @& v& Y& X) w │ │ │ main.h │ │ │ hw_config.h! K' F4 N s; T- E2 x7 w0 h │ │ │ fsmc_sram.h2 [8 n) x. H1 E9 ^ │ │ └ stm32f10x_conf.h+ \% y; C8 ^4 _( s2 y: n S, D │ │ 6 G6 f) J4 b% G7 l- K E9 g O \ │ ├─src │ │ │6 n; N4 q1 i1 T │ │ │ iwdg.c │ │ │ rcc.c( R$ \. L1 t0 D0 T. } │ │ │ gpio.c │ │ │ nvic.c+ P! [5 W- [" s, M! E/ O │ │ │ tim.c │ │ │ adc.c: Z# u% ^# f6 D, T" F │ │ │ usart.c │ │ │ can.c │ │ │ spi.c │ │ │ dma.c │ │ │ fsmc_sram.c+ d2 k, I: f8 E │ │ │ hw_config.c# ~# {+ f& b' V" H& B: {6 q │ │ │ stm32f10x_it.c │ │ │ main.c/ V) C& P1 e# R( X7 |' X5 W% J1 s │ │ │ modbus.c │ │ └ ymodem.c │ │ │ └─MDK-ARM │ │ │ │ BootLoad_IAP.uvproj6 ?8 A7 {% q7 @/ x8 w0 k │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */$ [$ n8 o5 ^, T: S6 Z5 b │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ / t8 s8 B% J! W0 N. h │ │ RAM.ini /* IRAM调试初始化文件 */ 1 F8 A4 d# I# |' I. \0 K9 { │ │ SIM_MAP.ini /* 软件仿真初始化文件 */1 s/ }/ x! \$ z$ i/ y a │ │ │ │ │ ├─ROM /* Debug in Flash */ │ │ │ T6 a. r. V+ J │ │ ├─rom_List7 @+ K8 U' b o9 \8 W0 ~ │ │ │ │ │ └─rom_out │ │7 ], Q$ s$ q l- ? │ └─RAM /* Debug in Ram *// G0 w. [3 F! s5 O │ │$ J+ }5 P1 ~$ T5 n │ ├─ram_List1 ^4 a D+ [) p. Z │ │5 e* Y0 N' y4 Z) J! P │ └─ram_out o" W5 K' P/ \ │ ├─Libraries │ └─STM32F10x │ ├─CMSIS │ │ ├─Device │ │ │ └─ST │ │ │ └─STM32F10x │ │ │ ├─Include │ │ │ │ │ stm32f10x.h │ │ │ │ └ system_stm32f10x.h J! R8 _' _/ ?* j( M │ │ │ └─Source6 R7 S% L! l- U │ │ │ └─Templates7 L/ @ B0 T& ~) Z( G │ │ │ │ system_stm32f10x.c. q7 T- m" z4 d │ │ │ └─arm │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include │ │ └ core_cm3.h │ │ │ ├─STM32_USB-FS-Device_Driver │ │ │ ( I+ K6 E/ i) k: q- Q- x ?9 j │ │ ├─src │ │ │ │ usb_core.c │ │ │ │ usb_init.c │ │ │ │ usb_int.c) Z. Z6 y" b# C1 t' O; w6 n U6 T0 ? │ │ │ │ usb_mem.c6 s( F8 M7 b7 l1 Z │ │ │ │ usb_regs.c │ │ │ └ usb_sil.c │ │ │ ! y0 @4 N( P. q& B& J/ H │ │ └─inc │ │ │ 2 q4 ^# z# u) d; k$ O* p7 B3 b0 {2 Q0 d │ │ │ usb_core.h, ?: i2 [0 L6 z7 F- F5 I4 e │ │ │ usb_def.h │ │ │ usb_init.h% P+ i/ N8 {% _# m4 ` │ │ │ usb_int.h/ ^1 Q& E. R4 h/ d) x% o/ A │ │ │ usb_lib.h2 r7 P% Y7 |& _$ n" ` │ │ │ usb_mem.h1 [* I7 t$ T! T# y3 H" v# N │ │ │ usb_regs.h │ │ │ usb_sil.h" a- I% @. F% R% _9 y) |4 w: i7 c4 U │ │ └ usb_type.h │ │+ A3 n" ~% K4 e! U( w# L5 F │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */ │ │ 2 U, \/ R* O0 p( D9 |2 x- } │ ├─src │ │ │ misc.c │ │ │ stm32f10x_adc.c │ │ │ stm32f10x_bkp.c7 c8 p. [- J$ }7 `4 ] │ │ │ stm32f10x_can.c │ │ │ stm32f10x_cec.c │ │ │ stm32f10x_crc.c: o: M$ T }+ G" P6 F) a7 F │ │ │ stm32f10x_dac.c. l4 v8 Y3 l4 ^$ K/ T. c# \1 X8 \ │ │ │ stm32f10x_dbgmcu.c │ │ │ stm32f10x_dma.c* F) L; i$ D% | │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c% Y9 k- y. J* h# U2 {: |6 \ │ │ │ stm32f10x_fsmc.c$ k' x' s+ {0 _7 P# U& i5 d" s │ │ │ stm32f10x_gpio.c6 A% z4 _. B* j5 H4 M | │ │ │ stm32f10x_i2c.c │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c% ]# h- ]" P7 g) R8 w$ ~0 [ │ │ │ stm32f10x_rcc.c │ │ │ stm32f10x_rtc.c U2 _* M# [. f8 u4 o │ │ │ stm32f10x_sdio.c) B( k1 g; A) ?/ F │ │ │ stm32f10x_spi.c │ │ │ stm32f10x_tim.c │ │ │ stm32f10x_usart.c │ │ └ stm32f10x_wwdg.c7 }* A3 g2 N r$ t │ └─inc& n6 `" x1 I6 e: w9 h" A │ │ misc.h │ │ stm32f10x_adc.h0 N) j# @% X/ n6 d │ │ stm32f10x_bkp.h& W6 u# l5 e, q │ │ stm32f10x_can.h │ │ stm32f10x_cec.h3 |4 @5 P( v1 s4 f8 \# n9 d │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h1 p7 \1 v( Q0 r* ], e3 F │ │ stm32f10x_dbgmcu.h" A" ~$ o0 [3 O8 n │ │ stm32f10x_dma.h │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h │ │ stm32f10x_fsmc.h+ ^% v* {! w! @/ d' h1 S │ │ stm32f10x_gpio.h │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h# U6 W' W1 _; t7 n" ^! } │ │ stm32f10x_pwr.h │ │ stm32f10x_rcc.h+ E1 Z# o( |" l │ │ stm32f10x_rtc.h │ │ stm32f10x_sdio.h7 E9 t( @& b+ n7 K4 i: P │ │ stm32f10x_spi.h6 b+ c* m$ l7 K6 Y │ │ stm32f10x_tim.h+ {8 n5 v; K! P% \ │ │ stm32f10x_usart.h │ └ stm32f10x_wwdg.h │ │" m3 _ L" Z$ m" Y └ BootLoad说明.txt; b7 s+ r7 \' a bootloader及256Kb的测试例程打包下载: ![]() |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。