一、BootLoader程序使用说明: ) ]6 H5 f4 W1 A0 G( ?% J2 Z$ w 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。8 P, `; m' |, v; b& R 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用4 N9 n( r! i6 V- W5 O* [6 ~ 一边读一边写的方法,不受内存大小限制。 3 ~( Z% |6 b# _4 M+ N2 b9 q 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控! e! r; D4 I0 x: s. a s/ s 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为 230400bps,TTL通讯则可设为921600bps。 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送/ S/ u% R6 C& G8 M" m2 s6 F1 _ 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都; o- X% V0 Q2 D1 L/ n3 |- ~* j% j 开启了看门狗,若有故障,自动复位,红灯一闪而过。 2 T3 ~5 t$ @9 r6 ` 5 跳转至APP程序前,需要关闭所有用到的中断,切记。+ n* k" _& c3 Q 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中,( z: N1 R' @2 z$ m; w 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机),( c) B9 N, o/ v9 o 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。5 T0 q E6 [8 _. I6 @4 h 7 用户程序的中断向量偏移设置如下:2 F0 ^$ \$ B6 L( n; \; [9 k6 e NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);: \, T' ]( ~% {3 X ; APP程序分散加载的例子8 X. }2 z0 D: @ ; *************************************************************) ^0 B0 l2 V/ H) X0 V. H ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************. `- S& D2 b' f9 J 1 M$ r2 Y+ \+ I2 I LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address: V. r i3 N: N *.o (RESET, +First)0 C! c# Y" m. L3 U *(InRoot$$Sections) .ANY (+RO)( \' n+ A0 C& B4 k E$ n } RW_IRAM1 0x20000000 0x00010000 { ; RW data) W+ j, ~% B$ Y/ ~- J' H' d5 B .ANY (+RW +ZI) } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data ; main.o (exsram) ; exsram 内存段名称 ;}1 E2 Z( {3 |; A/ m" Z6 r }4 s$ S* z& P- r6 Z ^ & v) ~- C6 e- H* T6 Q$ M5 r ; |4 H+ Z: ]1 X! s 二、工程说明 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的4 X9 W R M9 o8 @" `- a# Y, V% C( I' w 应用代码: RS485,CAN,FSMC,SPI,TIM,AD 7 W4 m, M" W' D& H4 I& ]; W) r . u, A- b# t$ M7 n/ ]; t Project Targets 设置说明5 w1 ?! B) n6 b3 B* S' k+ O* M: g 1.Debug in Ram 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命 ; g$ H% ~; o3 d+ Q6 a+ Q 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码$ B5 q7 p# Z2 e9 c0 V6 j #ifdef VECT_TAB_RAM 9 C, s0 q @; [( x /* Set the Vector Table base location at 0x20000000 */ 8 D0 Y3 H' s, s- \4 P3 W5 u NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); : w/ n- s: t; o7 D6 ^8 y7 \ #else /* VECT_TAB_FLASH */- W. g$ H* d. o /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); & b. f; \, @2 Z* J# E! [& v) H& u+ g #endif 这样就把中断向量地址转移到Ram中 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings g$ ^. R4 R$ F- ^9 P9 Q! K" b 在Cortex-M Target Driver Setup对话框, 4 l+ s# _" x* h" B1 T7 ~( \& h9 M5 G 选择Flash Download为Do not Erase,Program,Verify 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后 3 l: O5 Q* v7 ? IRAM_EXSRAM.sct 分散加载文件:# F0 c: p* {$ _& ^ `0 n+ n ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***/ J1 e$ M0 v7 ]8 x- b ; ************************************************************* LR_IROM1 0x20000000 0x0000A000 { ; load region size_region ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address. u6 b+ p v! ^4 m& T6 ^0 a *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO)1 n4 O) Z. W, y H } RW_IRAM1 0x2000A000 0x00010000 { ; RW data$ `! x/ a6 y1 v4 v; J8 E0 Q .ANY (+RW +ZI) }, q6 I- {4 d" l$ I0 H( @9 A8 T RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称 } } RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件:" K$ ?/ b! T! r/ X. o- V9 s SP = _RDWORD(0x20000000); // Setup Stack Pointer& ~! e$ f" `( S1 ]% [) r PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register - A" [! d; [, ?5 U* p) u1 r, d" W 2.Debug in Flash 在Flash中运行和调试程序,需要对Flash的反复擦除和写入5 ^2 f/ h1 \4 J7 U( ?7 a# _' F( z, Q FLASH_EXSRAM.sct 分散加载文件: ; *************************************************************7 n" l( \5 t" X& o6 p) {6 b9 w" ^, _3 ` ; *** Scatter-Loading Description File generated by uVision ***2 Z$ t! _# p9 Y: q5 f ; ************************************************************* 3 `1 c7 C! G& ?+ V8 n LR_IROM1 0x08000000 0x00040000 { ; load region size_region1 _! ?2 g3 P" X( v# s ER_IROM1 0x08000000 0x00040000 { ; load address = execution address *.o (RESET, +First)% o) u4 Y5 o" W$ ~+ m9 E9 y( P *(InRoot$$Sections) .ANY (+RO)' x4 g' w; k% P+ G/ g }) E# W' ?: K2 k8 S RW_IRAM1 0x20000000 0x00010000 { ; RW data2 v) n0 y! T' i' F .ANY (+RW +ZI)' N* _5 F( F. O) N! E# S7 d0 u y }' [) k2 G2 i6 y1 E9 [1 g) P EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称 W( k% e5 ^4 M }, {% ]$ z' W7 d' f' L8 n! r2 ^4 Q- x } 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化 - \- o% P& y0 K; L SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写: map 0x68000000,0x68020000 read write exec! i S% W9 `! l. c) H2 Y 三、源代码组织架构: P6 e0 u, f3 |: V& q 文件夹名称: STM32F10x_BootLoad_IAP 固件库版本: V3.6.1( P: O$ v, L) G) l, E/ T8 E 文件目录结构:/ F0 y# Z o: o 1 s7 ^* J; `" z% t7 f3 T: C+ ] STM32F10x_BootLoad_IAP4 c; ] B. l8 P M │ ├─Project6 a; g$ Z. }( Q% h+ _- Q- n │ │ │ ├─inc │ │ │ │ │ │ main.h │ │ │ hw_config.h5 ]" i6 P* U6 x │ │ │ fsmc_sram.h' c, e2 Q6 T- t1 k │ │ └ stm32f10x_conf.h │ │ * U0 g' J! M+ r! I3 r │ ├─src │ │ │+ S7 d# g! b2 Y$ s, l; p3 u+ T │ │ │ iwdg.c │ │ │ rcc.c: E8 H. ^# J1 P1 }' N L9 o+ t │ │ │ gpio.c% m$ e: p2 n) w$ e( h/ n& U │ │ │ nvic.c2 {2 h3 }7 k' d, k0 n- r. m* Q3 @ │ │ │ tim.c │ │ │ adc.c4 X! F8 Z! Z! v( j1 z; | │ │ │ usart.c% }4 O( e1 B' v+ p( ^$ O, f │ │ │ can.c2 G7 J! s \ \9 { │ │ │ spi.c; J% _' ^6 I# S6 T' Y; u2 j9 O │ │ │ dma.c │ │ │ fsmc_sram.c │ │ │ hw_config.c9 `) n9 D: @* [- M: A" L% Y │ │ │ stm32f10x_it.c. ^$ E: ]5 g/ h! L+ K- ]) [+ Z │ │ │ main.c │ │ │ modbus.c; l# i7 l& H* H1 y │ │ └ ymodem.c) t) Z7 ]1 S/ \- Z1 m │ │ . B/ y0 V7 c. _2 r3 z( k │ └─MDK-ARM) Q0 [% x2 B- g) P/ d2 E5 v │ │ - a0 F1 P2 H) k; _. g1 {* z- J │ │ BootLoad_IAP.uvproj │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */ │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */ │ │ - i$ \: `, z2 @2 H" q5 x: R │ │ 9 i% F4 z* D7 N8 D* x) a; ]' Y- q7 j │ ├─ROM /* Debug in Flash */) a; u/ a+ t- u7 m2 x' ?' { │ │ │, H P! _2 Y6 ]2 i/ B- A │ │ ├─rom_List │ │ │& `& E* l9 p) N; Q0 W) a& D │ │ └─rom_out/ [& I) a2 w' Q3 o) W$ F6 x! _- K │ │; s9 c4 A/ v* |- {. ~+ {: p- E │ └─RAM /* Debug in Ram */5 t0 s, S/ B4 Z9 q" O# b; l │ │1 g5 B% C& ^ Q% Z# S' K │ ├─ram_List │ │9 N7 w2 K$ a/ A+ q1 l+ K1 i' _ │ └─ram_out │ ├─Libraries │ └─STM32F10x4 I8 X- H; L, [' j9 Y │ ├─CMSIS9 P# D6 w7 ^+ K$ o5 D( b │ │ ├─Device c) v7 g. c4 c2 q │ │ │ └─ST │ │ │ └─STM32F10x │ │ │ ├─Include │ │ │ │ │ stm32f10x.h │ │ │ │ └ system_stm32f10x.h' ]& K8 [4 p( |/ D8 F │ │ │ └─Source │ │ │ └─Templates3 h+ N0 ~9 A: ^9 T │ │ │ │ system_stm32f10x.c │ │ │ └─arm3 j/ r4 `. K# J0 w/ ~ │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include* y1 s; R5 b6 s, V9 l │ │ └ core_cm3.h I$ m) `1 f$ B1 ], a │ │ │ ├─STM32_USB-FS-Device_Driver │ │ │ │ │ ├─src* l8 O# q4 m5 y │ │ │ │ usb_core.c │ │ │ │ usb_init.c │ │ │ │ usb_int.c │ │ │ │ usb_mem.c │ │ │ │ usb_regs.c │ │ │ └ usb_sil.c8 q1 R1 I# }* W8 X- f/ f5 C │ │ │ │ │ └─inc+ \* E' }& r1 s$ `) X$ T4 V( J │ │ │ │ │ │ usb_core.h │ │ │ usb_def.h │ │ │ usb_init.h │ │ │ usb_int.h │ │ │ usb_lib.h │ │ │ usb_mem.h │ │ │ usb_regs.h6 C$ o K: K) e │ │ │ usb_sil.h. z7 [( W- k- L0 ` │ │ └ usb_type.h# d9 J9 |/ [2 D+ ~# E( r │ │ │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */ │ │ 6 m f P9 e# A- _+ `, b& d' N │ ├─src, }* T/ b4 c! { │ │ │ misc.c │ │ │ stm32f10x_adc.c2 X" V% u: j! n" i4 A& s6 l6 M │ │ │ stm32f10x_bkp.c │ │ │ stm32f10x_can.c5 _$ W* H' ]! I- z5 m) d' v │ │ │ stm32f10x_cec.c │ │ │ stm32f10x_crc.c │ │ │ stm32f10x_dac.c │ │ │ stm32f10x_dbgmcu.c │ │ │ stm32f10x_dma.c │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c │ │ │ stm32f10x_fsmc.c │ │ │ stm32f10x_gpio.c │ │ │ stm32f10x_i2c.c │ │ │ stm32f10x_iwdg.c3 {0 p7 z: p) L# _0 B! ~5 N7 }; v │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c: A- E, Z% D% Z9 I/ _# O! n │ │ │ stm32f10x_rtc.c3 m9 V. l3 k) L │ │ │ stm32f10x_sdio.c9 a2 U) |% S: ~- q7 C2 m( O │ │ │ stm32f10x_spi.c │ │ │ stm32f10x_tim.c │ │ │ stm32f10x_usart.c" x5 i) l2 z$ z+ O# `$ P+ I( p │ │ └ stm32f10x_wwdg.c8 N1 c* f$ R# |) B2 d/ u' P4 T │ └─inc& Q( H# f& h C# h$ n x# x │ │ misc.h │ │ stm32f10x_adc.h6 n, q, {0 ] n% Y1 ~! ? │ │ stm32f10x_bkp.h │ │ stm32f10x_can.h. t7 ]4 ?7 L8 O @* h/ _ │ │ stm32f10x_cec.h4 D# ^; L5 g; u/ ^$ x │ │ stm32f10x_crc.h/ l: n; b# ~, I y3 B6 ~( c7 t2 p │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h" X% p0 i- W6 K5 h: ^ X$ E: i │ │ stm32f10x_dma.h" F! I. }( X. g) q) [ │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h9 W5 [: x2 u' `* S0 `& N7 y │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h: P1 Z5 J, x H2 h: Q │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h6 {( s$ y# _$ M4 x# N& p │ │ stm32f10x_pwr.h │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h │ │ stm32f10x_sdio.h: z# {# K6 j+ s- ~' X │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h3 o, H* q/ h+ v9 o8 }7 { │ └ stm32f10x_wwdg.h0 m! d' s8 _! N5 Q; t │ │$ R4 z2 g8 g! @2 B8 w; H └ BootLoad说明.txt/ C3 P# c$ }" e+ S; R , d0 s4 }9 A( i; D bootloader及256Kb的测试例程打包下载: |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。