一、BootLoader程序使用说明: 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。" s% ^4 C& `/ E6 |6 s$ O+ D 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用$ @! b) T' ?5 K5 c$ ?9 \8 N1 O' U 一边读一边写的方法,不受内存大小限制。, i" f6 G9 n) j1 }2 P2 x' D 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为 230400bps,TTL通讯则可设为921600bps。 7 k* `* f9 f% v% g! ^7 l 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送3 y; h, j7 q5 P. f ]. @0 x: L! q; P1 ~ 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。$ a8 s: c: N6 n) Q 9 I2 B' O8 [8 e, n% X* V/ x 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都 开启了看门狗,若有故障,自动复位,红灯一闪而过。2 t4 }. \! e& ? 5 跳转至APP程序前,需要关闭所有用到的中断,切记。- w7 l; u) j1 P0 F# M( @) a! R 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中, 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机),! ~ I8 f! d N0 | 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。 * ~) Q+ Q5 c$ d+ ?( U 7 用户程序的中断向量偏移设置如下:5 B" u, t$ y1 k, ] NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);! `) `& Y2 b# F5 h$ \ ; APP程序分散加载的例子 ; *************************************************************/ Q" M+ ?( G5 e( D& W0 F ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************+ s1 k$ h. j% C( Y* u / @# y, Z6 W9 d5 _ LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address5 G# O6 e& ^9 b- T% I. J$ F *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO)/ Q& ^! g$ B# M$ s4 l } RW_IRAM1 0x20000000 0x00010000 { ; RW data5 o# W. ?0 K) E3 ?; Y" D: | .ANY (+RW +ZI)2 j' Z/ X: n, n _; o } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data% _& I. `" A$ M7 r( Q Q6 K$ M ; main.o (exsram) ; exsram 内存段名称2 V* s- [" V' L0 Q ;} } ( I# J } }0 U4 B# [& F 2 g3 e2 E2 M% b6 c j# w" w2 L3 U $ f! }* @4 P# Q, w+ H/ x1 n 二、工程说明" C+ b9 l; l% Y. e- o$ Z 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的 应用代码: RS485,CAN,FSMC,SPI,TIM,AD, o: s' P* c A7 p: M" v1 H 7 D7 e5 F6 o9 h, t, h" o Project Targets 设置说明 1.Debug in Ram# W8 N5 m7 p6 V, c) }' ? 4 ~0 u' i2 C( C) }3 x. I 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命9 M, g1 b; u4 q7 T- r! t: s 5 w" |$ m' i% w- L' B2 q 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框% c! l7 P1 |1 m: ]" D/ g 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码+ H9 {) w' i" o3 T" \% }3 K( g5 o4 C #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 1 c$ Z6 L+ o* z: b# ~/ W/ y* Q0 F #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); J& X1 Y5 @1 X b8 K8 G$ Q #endif 这样就把中断向量地址转移到Ram中8 ?* u# ?& t3 c* U/ ]- t+ P8 J 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings 在Cortex-M Target Driver Setup对话框, % v& |1 j0 ]5 q' t4 h 选择Flash Download为Do not Erase,Program,Verify 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后/ b' M6 a& N. M* Z0 D. o" c 6 C5 t1 P; l8 ~3 W) [2 m/ ? IRAM_EXSRAM.sct 分散加载文件: ; *************************************************************! A! p% H: D& R. n% z ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* . M; k0 W/ a6 v) R* s LR_IROM1 0x20000000 0x0000A000 { ; load region size_region- E! s# ~6 o( j5 C9 X& @" ~( y$ V5 w1 l* u ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address *.o (RESET, +First)7 |, @+ @+ T8 R) K: E9 j *(InRoot$$Sections) .ANY (+RO)0 Z- E! `8 K- U' x, r } RW_IRAM1 0x2000A000 0x00010000 { ; RW data .ANY (+RW +ZI) }6 g# U- f- Y2 P. x. V% y RW_RAM1 0x68000000 0x00020000 { ; RW data2 B1 E6 c( Z8 D .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称0 {+ m7 g1 `, P! w0 Z }' c4 {& ^+ \* \) e W9 A }9 @8 [1 i7 w) U m G! h V4 H RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件:6 `% Q: b! e3 G6 l! c + b) _( `4 j( d; z# ~ SP = _RDWORD(0x20000000); // Setup Stack Pointer" Y* k/ P6 L* y; z9 y9 S PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register5 Q: _* x* l+ X: Y, x( ] 3 \ b7 M: A( U% R; m3 F8 v1 U 2.Debug in Flash9 M/ R# u* Z. I- u, w! c" F8 R J 在Flash中运行和调试程序,需要对Flash的反复擦除和写入 : a& H5 ?5 X V2 O Z4 @* D FLASH_EXSRAM.sct 分散加载文件: ; *************************************************************2 Y; P3 T/ ?, l- H; G" s9 @* c Y4 _ ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; load address = execution address$ x% L! X% |( a$ S5 A *.o (RESET, +First)+ q% i* D0 n; Q# j" `" I% E *(InRoot$$Sections)) A, N+ u( p* f! }: S .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI)& c4 z+ Y6 q. f( R, F }. z8 t# g# ?6 \6 C4 q EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称 }; Q: `2 |* }4 ~$ x G8 f } " r4 x+ R- J! ]3 O 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化/ \4 l+ b2 @/ l: L SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写: map 0x68000000,0x68020000 read write exec " ]$ p5 u1 C" H( V! t$ t 三、源代码组织架构 9 T" j8 h. d! B6 K7 B8 |) i 文件夹名称: STM32F10x_BootLoad_IAP3 C6 l& _. |2 s% ?' O 固件库版本: V3.6.1 z1 E( A! y5 F. n 文件目录结构: " D2 A1 g0 ^5 {" ? STM32F10x_BootLoad_IAP │. q5 ]6 L- N8 n8 @ ├─Project │ │ / U- z3 M- [% f$ {3 A1 m% p │ ├─inc │ │ │ │ │ │ main.h5 T' o- i5 x: P$ j! Y$ } │ │ │ hw_config.h7 O7 `9 R, k; `: f │ │ │ fsmc_sram.h, }5 o; q& K; ^: h, p7 o │ │ └ stm32f10x_conf.h% t. J; @5 a7 K; {6 m _ │ │ │ ├─src0 r/ i8 T' k0 `- E- g │ │ │ │ │ │ iwdg.c8 T3 O' w/ h* O6 `& N" f │ │ │ rcc.c) Z- c; N( m; h8 E, |* O2 h │ │ │ gpio.c │ │ │ nvic.c │ │ │ tim.c │ │ │ adc.c │ │ │ usart.c) y) y% x, N! }/ d) x' y │ │ │ can.c q; L' ~2 C- V$ g8 ]: @# i │ │ │ spi.c& \' ?: t( |& f( Q │ │ │ dma.c; P2 |# I, X! o7 b& x │ │ │ fsmc_sram.c │ │ │ hw_config.c │ │ │ stm32f10x_it.c% `$ h( s% {' e% t, T$ N2 L │ │ │ main.c │ │ │ modbus.c │ │ └ ymodem.c │ │ % K9 \- k+ S* j$ o1 h9 O │ └─MDK-ARM; _1 _2 f$ L% R# x/ q │ │ │ │ BootLoad_IAP.uvproj │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */ │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ % `; I; e4 i: Y5 \$ q" I │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */9 z; T& j: K$ M │ │ " z* } z8 y* a5 R │ │ ; U1 ~; G% T7 T4 p │ ├─ROM /* Debug in Flash */$ d) a2 f. m* `" e2 t │ │ │ │ │ ├─rom_List* E q" T* ]9 j |# c │ │ │5 h' l$ `0 G1 [$ `- S& e4 y │ │ └─rom_out │ │ │ └─RAM /* Debug in Ram */ │ │7 y! {* M4 P# z- f9 ^3 L. s │ ├─ram_List$ }' O8 Z# S4 @7 t z, F) [- ] │ │8 b( B+ R$ m; C │ └─ram_out │ . N. K. `/ P0 M. l+ n ├─Libraries │ └─STM32F10x: W+ t5 M. T" f9 e# [0 O) c; V │ ├─CMSIS; H# g* q6 X: P! _* o( `, x │ │ ├─Device3 o7 F$ x; @# Z, n1 { │ │ │ └─ST │ │ │ └─STM32F10x: F% U' x9 |0 G- e* J$ M! T, [& c6 V │ │ │ ├─Include% M$ q& x. ^: m │ │ │ │ │ stm32f10x.h : ^1 ^ X6 U3 Z" B │ │ │ │ └ system_stm32f10x.h/ c7 r$ ]8 D" L' q │ │ │ └─Source. d: A- d! ?9 K. D; O │ │ │ └─Templates │ │ │ │ system_stm32f10x.c1 ~' M$ c6 j6 ?) C* U2 U │ │ │ └─arm │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include& U* g, A; ?# F7 l1 ]% s8 } │ │ └ core_cm3.h │ │; L/ C: b$ h- ~/ w2 a! Z5 X5 o │ ├─STM32_USB-FS-Device_Driver% t) ]) A7 a0 a1 P │ │ │ │ │ ├─src │ │ │ │ usb_core.c/ M! F5 t/ T9 p2 C │ │ │ │ usb_init.c- y0 L% g# b4 g. z) l$ i │ │ │ │ usb_int.c' E3 K/ Y' C! `- m b% \+ e │ │ │ │ usb_mem.c1 k( e7 l4 a' C; u5 @( _0 Z$ K$ F │ │ │ │ usb_regs.c │ │ │ └ usb_sil.c. ?5 y' s1 P o! @ │ │ │ │ │ └─inc │ │ │ │ │ │ usb_core.h# n( s8 b+ o. X! h; ?/ K1 R │ │ │ usb_def.h │ │ │ usb_init.h │ │ │ usb_int.h │ │ │ usb_lib.h9 \3 e' a2 l, K7 L3 V │ │ │ usb_mem.h. {: ~! c" n/ O( n% C │ │ │ usb_regs.h │ │ │ usb_sil.h3 @7 L- ^# f' w* h' y# k% `0 [: D │ │ └ usb_type.h: y; d& @- |- B5 ~5 N3 Q │ │$ i1 D. u% c' q% w$ j. l; H: c │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */" |$ k; n$ l* k0 D5 P6 L │ │ │ ├─src. P6 m6 }; m' I+ F5 V+ f │ │ │ misc.c V) u# N) f8 P# y; h* a │ │ │ stm32f10x_adc.c+ k& h- }% n* a. Q │ │ │ stm32f10x_bkp.c/ a0 M4 M8 c- r. Y │ │ │ stm32f10x_can.c+ {8 c; F$ Z, h: O │ │ │ stm32f10x_cec.c │ │ │ stm32f10x_crc.c( O6 _0 p W! e: p5 B( R+ R; Z │ │ │ stm32f10x_dac.c" N* P9 @' A! [. E │ │ │ stm32f10x_dbgmcu.c │ │ │ stm32f10x_dma.c/ ?3 y) M# w' B0 Z9 d& p2 F. y │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c │ │ │ stm32f10x_fsmc.c- t4 [% n; W3 I* C+ {7 c7 K. e │ │ │ stm32f10x_gpio.c │ │ │ stm32f10x_i2c.c │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c; F# g/ [& W+ h3 P4 S7 E9 E) X, s │ │ │ stm32f10x_rtc.c7 C* b! o7 b. F │ │ │ stm32f10x_sdio.c │ │ │ stm32f10x_spi.c │ │ │ stm32f10x_tim.c │ │ │ stm32f10x_usart.c │ │ └ stm32f10x_wwdg.c4 t7 V/ V" F' }" \- {2 I; ^ │ └─inc( V' b/ ?" R6 i3 X2 x │ │ misc.h5 z- h5 b+ U; N0 ^. T, A │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h │ │ stm32f10x_can.h( S5 Q# a* b8 m# k R- @ │ │ stm32f10x_cec.h4 P- z2 Q; P. V. r/ _4 A │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h* f4 v1 E8 |; T$ V- p- f │ │ stm32f10x_dma.h │ │ stm32f10x_exti.h! I( ^: m5 H# b! k% o4 q │ │ stm32f10x_flash.h │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h8 }8 D: ]1 b/ B! K │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h │ │ stm32f10x_pwr.h │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h │ │ stm32f10x_sdio.h2 o1 y( p+ V2 _' |8 I6 j. C │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h- }& ^% q6 y$ m. E │ │ stm32f10x_usart.h7 E: ~- {/ Y* U, _6 ~4 D │ └ stm32f10x_wwdg.h, w# ^4 u# b$ t {1 o% D, @8 x0 H5 ?6 C/ q/ ~ │1 c+ B4 N n; [+ s. ] │ └ BootLoad说明.txt0 L; \ h" j1 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程序及测试例程打包上传。