|
一、BootLoader程序使用说明: 5 @9 |" R0 `9 c$ ]4 @4 I 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。8 e2 v4 |/ f ^# p( m( s 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。+ d( P! G) J/ V+ i- c 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用 一边读一边写的方法,不受内存大小限制。1 z" ^+ N$ M5 h# \' Z 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为 230400bps,TTL通讯则可设为921600bps。 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议 f; J6 C) ?0 d/ A" f7 y 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。 ) Q: w2 C l7 |+ Z2 t) L 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都 开启了看门狗,若有故障,自动复位,红灯一闪而过。 5 跳转至APP程序前,需要关闭所有用到的中断,切记。% Q+ S/ |/ ~0 _; e& f; x7 P2 z 9 |5 l, ~9 e: U' K. j6 V 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中, 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机),( ~4 p! U" H1 g1 d 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。, h# F7 w6 F3 x+ q2 p2 p6 X( V' Q 7 用户程序的中断向量偏移设置如下:! C) ]8 k8 @: ?% T$ x NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);, b% W4 A3 ~9 i' d2 H# n ) W1 n+ A& G2 S- p# @: \ ; APP程序分散加载的例子 ; *************************************************************! S, Q3 l' D. z9 F b7 h% e ; *** Scatter-Loading Description File generated by uVision ***, A3 {# c5 f2 W- E N ; *************************************************************: ^7 L3 Z+ _+ s6 m/ s7 L% G , r1 P0 C1 W+ F% J. I# l LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address- B, u* S7 x5 ~8 x *.o (RESET, +First)# n) E, ]" A( ^0 e *(InRoot$$Sections) .ANY (+RO)1 q7 l: S2 O, b8 c. D" u }$ P; o2 H/ _# u6 N% P RW_IRAM1 0x20000000 0x00010000 { ; RW data' ~$ j% J- c* B# h ?( N$ V .ANY (+RW +ZI)& A( Z6 V* c' Z+ s }7 k) M# P( l' F* v- U ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data ; main.o (exsram) ; exsram 内存段名称 ;}) A! G) W" s- ?. h0 Z } , F; b3 f4 z! ~7 Y* l1 x) c 二、工程说明* {9 R' o- M L3 w2 k3 y " H3 \+ p5 s! q& ~# h1 n! ~5 M 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的# P+ [, _' Z6 ]. c; T 应用代码: RS485,CAN,FSMC,SPI,TIM,AD/ m+ D$ Q# l$ c' i; |" b 2 _; M3 m' H" s, c Project Targets 设置说明1 h. g' _4 Q% ^2 E* u2 D 1.Debug in Ram v* Q* W6 u, Y# J( d 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命 # {. _4 h/ p0 l. j' ?: a 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框3 z A9 s" u/ R: h 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码 # o6 E) Q$ `8 o& m #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ ' U3 _2 d- Q& b" S NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); ~+ ]$ t) l7 ]" d7 A #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); , q7 m) F s. o% T' E, N% N6 U #endif 这样就把中断向量地址转移到Ram中 9 l _& T7 P, B/ R' t 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings. g% A5 I" G9 L1 x/ c v 在Cortex-M Target Driver Setup对话框, $ c+ f0 E: a0 W) C 选择Flash Download为Do not Erase,Program,Verify 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后 . I$ ?& p% ^& h) y7 c IRAM_EXSRAM.sct 分散加载文件:2 Q5 [1 s; d3 ~/ k2 y9 Y, r) K6 S ; *************************************************************! Y9 J) i/ {3 e) ~! l0 c4 a0 i ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************0 x5 q9 Q) O8 a ( p: z: h3 Z' T, ]9 i% u3 ~ LR_IROM1 0x20000000 0x0000A000 { ; load region size_region ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address2 f; p) d7 j! O' `% V, ~. Y' c *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO)9 e, H$ {) H& I# V/ N, f: r; a0 e } RW_IRAM1 0x2000A000 0x00010000 { ; RW data .ANY (+RW +ZI) } RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称 }( R2 i5 T; t) l } RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件:8 c3 Y4 }" H) o8 D" q# G( x SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter9 ^+ X/ F, s% s _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register3 p" x) @( {6 b$ B , v1 s, D- k$ }2 S9 e. M2 Z 2.Debug in Flash6 [* v5 E7 C* c. _2 a o5 I 2 F4 X2 D- d" X, c 在Flash中运行和调试程序,需要对Flash的反复擦除和写入 FLASH_EXSRAM.sct 分散加载文件:9 e9 q. _5 n! C" V- i% z: b ( `1 r- @: V2 z+ v9 _1 W1 y ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***5 D# K4 y! A( f! Y6 c8 p+ n ; ************************************************************* / o1 N7 d! F( Q# j& Q LR_IROM1 0x08000000 0x00040000 { ; load region size_region* _7 e% H0 a" w9 y3 k ER_IROM1 0x08000000 0x00040000 { ; load address = execution address *.o (RESET, +First): H" `, ]; q% k; E8 F! @( L *(InRoot$$Sections)% S2 D" t$ U0 c$ }% T2 M2 o .ANY (+RO)+ g; r7 ]% |! ]" [3 L }3 L1 \9 X& @3 } RW_IRAM1 0x20000000 0x00010000 { ; RW data$ [/ U: {3 U% ^4 U .ANY (+RW +ZI)* m. \ K' L' z% r8 p } EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data: y; c; v5 K% S7 B& [ main.o (exsram) ; exsram 内存段名称9 q, @& M4 n% m } } 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化 SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写: 4 R* {. p/ ^; h2 y. P map 0x68000000,0x68020000 read write exec. v9 N6 i6 j H3 c) d 9 E$ m1 K8 i3 E. f8 m# T 3 m2 n; K# Z5 A6 a% J 三、源代码组织架构) _7 H1 o# U( k, V7 F% M 文件夹名称: STM32F10x_BootLoad_IAP: x, v |6 d. G* @1 x 7 |* N( Y; [! b' @ 固件库版本: V3.6.1 6 t m( ^4 V% P! N! z3 U) B 文件目录结构:9 Z) `3 h+ } O3 s STM32F10x_BootLoad_IAP v8 S1 w$ L5 I+ x" a" {, F2 F │ ├─Project │ │ │ ├─inc2 h/ G8 ]/ @# O- C │ │ │ │ │ │ main.h │ │ │ hw_config.h: i9 b4 @; ?) j" z- C │ │ │ fsmc_sram.h7 r- S) r2 s* K) P2 m& ` │ │ └ stm32f10x_conf.h │ │ │ ├─src │ │ │ │ │ │ iwdg.c4 d* a$ ]0 R2 P │ │ │ rcc.c0 ?: k5 p, U1 l9 k4 [8 b3 Q9 x9 n │ │ │ gpio.c* t! ?( ^+ E6 h$ ^0 T8 b; f │ │ │ nvic.c │ │ │ tim.c) l. |- z; H7 y M/ y4 h& m │ │ │ adc.c │ │ │ usart.c1 \% d% z- c! E. L0 p, M │ │ │ can.c S- C* h$ Z. e │ │ │ spi.c │ │ │ dma.c; l8 ]$ B: [' ]- [( i `' j │ │ │ fsmc_sram.c! H7 N- t5 \+ g9 _- ? │ │ │ hw_config.c │ │ │ stm32f10x_it.c │ │ │ main.c │ │ │ modbus.c/ z5 A R. y- K# v b; L) T, Q │ │ └ ymodem.c0 A' L9 B$ x+ _- [) s# ` │ │ │ └─MDK-ARM │ │ │ │ BootLoad_IAP.uvproj │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */ │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ 6 {+ m8 Y" ^8 d, V$ T6 w9 |3 o │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */ │ │ 0 w# }. O' o# o6 o- D2 z │ │ ( q& f2 ?0 d' v- D │ ├─ROM /* Debug in Flash */ │ │ │ │ │ ├─rom_List: j# T1 o5 p# J6 ]% h) p │ │ │" S& `1 A9 l* z" i' N1 d" U! E │ │ └─rom_out │ │ │ └─RAM /* Debug in Ram */0 k) D3 ?$ k2 ]% Y7 z │ │% M; [) f$ Y5 a" Z; o! R( q │ ├─ram_List │ │ │ └─ram_out! n9 l9 ^" N6 ~0 @, Y; d* x' y0 G2 W │ ├─Libraries0 d) Z4 y: c" N6 x& h! b& f$ ] │ └─STM32F10x. ?+ l# Z$ e$ c( F2 I* z5 Z │ ├─CMSIS │ │ ├─Device) h$ k% V) c* K% N │ │ │ └─ST( o% b* X; U, H; B6 X) U │ │ │ └─STM32F10x │ │ │ ├─Include │ │ │ │ │ stm32f10x.h │ │ │ │ └ system_stm32f10x.h │ │ │ └─Source4 A) i4 ]; G' n. e2 ] │ │ │ └─Templates │ │ │ │ system_stm32f10x.c │ │ │ └─arm │ │ │ └ startup_stm32f10x_hd.s, L! Z& p* ~! s: L5 W: s │ │ └─Include/ ?8 y! A% g+ j+ @# w6 p1 Y( S; [' [4 Y$ P, y │ │ └ core_cm3.h/ F; E% f5 I' e5 w: V8 G │ │, x u3 W, k4 R- q v │ ├─STM32_USB-FS-Device_Driver, t; y# u N4 m5 M │ │ │ │ │ ├─src │ │ │ │ usb_core.c$ Q2 o& j2 v$ E, J! V# y │ │ │ │ usb_init.c% A2 R: O m0 v │ │ │ │ usb_int.c │ │ │ │ usb_mem.c- v/ `0 y3 R/ c3 m# Y* r9 m' u │ │ │ │ usb_regs.c │ │ │ └ usb_sil.c │ │ │ ! V) A7 f! }6 x7 ^( |4 y5 g6 } │ │ └─inc │ │ │ │ │ │ usb_core.h9 Y2 @1 q: r9 ?$ _" ~& S7 z │ │ │ usb_def.h9 B a1 ^4 i: t i' v! q │ │ │ usb_init.h# p r, S5 Q& y; `% H │ │ │ usb_int.h" @) t5 _8 Z7 `6 ]4 ? p6 G │ │ │ usb_lib.h' z4 T; ^! l$ E- i │ │ │ usb_mem.h! L+ J+ o- V- _* v& A │ │ │ usb_regs.h8 b2 O8 O! R0 \) ?% v# ] │ │ │ usb_sil.h4 Y! _4 z: J: `5 ]+ Y$ S: E% I5 X" D │ │ └ usb_type.h │ │0 t6 \$ X! \' A4 R8 | y1 F1 `$ u │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */ │ │ │ ├─src │ │ │ misc.c │ │ │ stm32f10x_adc.c7 x5 `8 z% J5 a# ? │ │ │ stm32f10x_bkp.c │ │ │ stm32f10x_can.c8 m9 ]8 I7 l# e& R │ │ │ stm32f10x_cec.c │ │ │ stm32f10x_crc.c │ │ │ stm32f10x_dac.c7 b9 o( f+ m- g `9 V+ ~0 r% g% h │ │ │ stm32f10x_dbgmcu.c: {& O( c0 c; {0 r │ │ │ stm32f10x_dma.c │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c9 }# t d e' x │ │ │ stm32f10x_fsmc.c% K5 {. r5 A7 J2 z4 P, G) A: t/ m │ │ │ stm32f10x_gpio.c │ │ │ stm32f10x_i2c.c; i9 @2 B/ e# i( ^+ K* R1 A0 K$ R │ │ │ stm32f10x_iwdg.c6 i+ o' W1 F j4 |' S/ s4 c" m; j │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c+ R% q$ ?# c; [* H; K- H) s4 T, j │ │ │ stm32f10x_rtc.c1 p5 `& l6 U3 [0 q/ m5 a │ │ │ stm32f10x_sdio.c( N$ j$ Y+ m8 O& V! P+ O( q │ │ │ stm32f10x_spi.c. [, p T& K! X │ │ │ stm32f10x_tim.c6 i+ O# b3 N; | │ │ │ stm32f10x_usart.c │ │ └ stm32f10x_wwdg.c) `/ d9 {" L- K# b: @$ u5 \+ Q3 R: { │ └─inc │ │ misc.h │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h │ │ stm32f10x_can.h │ │ stm32f10x_cec.h B& {7 g* `3 z │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h0 U- T3 O+ B9 J: d │ │ stm32f10x_dma.h │ │ stm32f10x_exti.h a1 C7 e" Q6 h5 n% Z% \' y │ │ stm32f10x_flash.h │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h3 v+ t4 B7 g& W$ i6 e │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h+ a9 P6 h- k5 i) o# b │ │ stm32f10x_pwr.h) b) \3 g8 U: G7 \) T. V) X │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h │ │ stm32f10x_sdio.h5 E: t) l0 K) o$ g2 } │ │ stm32f10x_spi.h1 b( Z8 W1 M7 V% C) A# f │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h; i9 i; Y' Q3 T- P8 @% d, Y │ └ stm32f10x_wwdg.h! Y4 k1 X/ \' B8 I/ K- L │4 T2 V/ d: W! ~9 l0 l+ C │4 _4 H2 K0 k6 `1 Y# o; w5 A └ BootLoad说明.txt5 W5 g) e3 w5 |5 C8 K- L# b bootloader及256Kb的测试例程打包下载:
bootloader_OK.rar
(2.18 MB, 下载次数: 1351)
|
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
单片机是控制电子产品的大脑
嵌入式产品的开发过程中的各个阶段
STM32H7新产品线,融性能、集成度和能效于一身,让你的智...
硬核!ST精工打造全新30A高结温单向可控硅(SCR)产品系列
“热门产品”智能表计芯片组,再添无线通信功能
我来告诉你!ST MCU全新产品路线图!
微信公众号
手机版
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。