一、BootLoader程序使用说明: 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用 一边读一边写的方法,不受内存大小限制。 ! g8 a x- K" H 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控) Y; x6 \0 C \- ~5 V$ E$ F; q 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为 230400bps,TTL通讯则可设为921600bps。 & N3 ^; Y0 _0 C5 }- b/ ? 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议1 V0 E8 c# ~! J2 u" ~! r 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。2 u& C# y; j! r3 ]) z 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都: p) K5 \8 ?1 U 开启了看门狗,若有故障,自动复位,红灯一闪而过。1 v( H! A7 G( Q3 m; j3 ^ 7 F+ G/ K7 X+ m5 a9 |6 h 5 跳转至APP程序前,需要关闭所有用到的中断,切记。1 q3 f. t6 {- m8 Z * h) l- K3 R/ _; ? 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中, 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机),5 X, n f! }( e0 g. P2 { W 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。/ i+ Y9 i9 U/ E, y7 z( p8 B: K + p E- v: w8 R: e. ~1 L. | 7 用户程序的中断向量偏移设置如下:+ }* G+ D+ j& p5 a NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); ; APP程序分散加载的例子 ; *************************************************************5 d4 u' L- T, s9 G1 N3 I$ P' z ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address7 o3 J/ |# [5 D' u; I *.o (RESET, +First)4 k* `& y6 |/ K a' Y *(InRoot$$Sections) .ANY (+RO)- R, Q. ]% |! m- C/ p/ ~ C8 [ } RW_IRAM1 0x20000000 0x00010000 { ; RW data+ {% `- m& K; Q$ { .ANY (+RW +ZI) } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data ; main.o (exsram) ; exsram 内存段名称3 G8 `/ ?: M' s. e/ I" U ;}7 u( f$ ]' M$ z7 ? } " E# y# Z4 Z0 E* p! @8 w- ^1 J2 d- f, v 二、工程说明 - y: X) [) E; I5 F# O1 u: X 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的0 q9 _# A7 R" O( m 应用代码: RS485,CAN,FSMC,SPI,TIM,AD) A" h. _; T) c+ C + y5 Z+ T- f# t1 o: b Project Targets 设置说明, s. ~+ A/ p! @6 g , z2 T; P/ z1 t& N 1.Debug in Ram, v5 d9 e! {7 S$ Y 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框& a Q7 g7 E) L9 e' h& u. v 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码1 x4 D0 x. s$ C9 C! _% J- B( C7 X ( i' m, k9 b: P" V: |( ^ #ifdef VECT_TAB_RAM ; E& R6 t* r! \ /* Set the Vector Table base location at 0x20000000 */ 6 U; z( L: l" Y- B, _ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ % J5 M z# j, K0 S+ e NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); ! y+ U" O/ k+ J4 v/ c #endif0 ?( |- t8 ?# @! K 这样就把中断向量地址转移到Ram中# j5 i$ _2 D3 p8 g4 _ 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings8 A6 ^+ [. g4 ]' d+ ^, a 在Cortex-M Target Driver Setup对话框, 选择Flash Download为Do not Erase,Program,Verify5 E1 w- Y; z3 L2 E 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后 $ r- J# ^) U/ Y+ i* w3 S IRAM_EXSRAM.sct 分散加载文件: 1 X2 E* E! c' i4 W. I! [2 p ; *************************************************************/ `7 O1 m1 P7 `' \5 }1 k ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************" _9 o X3 x$ N; L; N 6 d! n, ~! Z( F! ]' O$ r% A7 f LR_IROM1 0x20000000 0x0000A000 { ; load region size_region# L% ~5 W+ d' r ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections)+ |1 b: ]* e! r, y6 f .ANY (+RO) }3 t3 P) S: f5 n RW_IRAM1 0x2000A000 0x00010000 { ; RW data .ANY (+RW +ZI) }: s% ^+ n2 D: H* t RW_RAM1 0x68000000 0x00020000 { ; RW data/ o( Q% C( x, N# a z9 m& o- p .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称& G. J. S0 A* ^4 X. N+ D3 q } }& o- V" R) q% }6 T0 o# n7 N8 o RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件: SP = _RDWORD(0x20000000); // Setup Stack Pointer! o+ z2 O7 C+ F5 K# l# I8 |0 x PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register6 t6 u, U9 _$ u4 r% b : a1 E' y: f# V0 p * F7 s4 @- m+ I& } 2.Debug in Flash. }4 j: B* Q/ S! V% y 在Flash中运行和调试程序,需要对Flash的反复擦除和写入 $ [( I( \, a0 [, n FLASH_EXSRAM.sct 分散加载文件:, x: C5 k5 ?5 ^9 h( i6 V: ` ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************! a) a! ^6 H, |; s4 b: h LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) }) B# j J, d! p RW_IRAM1 0x20000000 0x00010000 { ; RW data9 k: I$ c/ o% W( s8 V" {8 P5 c .ANY (+RW +ZI) } EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data- b# W4 Z2 ?; I% c% e main.o (exsram) ; exsram 内存段名称 } } 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化* z2 D1 N% Y& V SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写:3 v0 o* B$ L5 E* O0 Y9 M map 0x68000000,0x68020000 read write exec) W p0 N6 j5 b# n f4 R: [2 u & k f! g2 D4 u+ b: g 8 p& K; {2 p0 I" N# X: i+ P# V( J 三、源代码组织架构 文件夹名称: STM32F10x_BootLoad_IAP8 Q6 G# ]0 B) T( j 固件库版本: V3.6.1% ]$ n/ F$ Z: n( j' T5 T3 W6 J* Q0 T ( j7 M* m6 z5 A! P+ |7 ?3 j x 文件目录结构: . R; c8 w6 \ ^3 ~6 X3 r STM32F10x_BootLoad_IAP │ ├─Project* y( k# l& H, a; c7 e) g │ │ 8 J* ?; h8 X& `8 r' s& b │ ├─inc │ │ │ │ │ │ main.h │ │ │ hw_config.h' R- O& N1 F6 p! e9 c │ │ │ fsmc_sram.h │ │ └ stm32f10x_conf.h- T. k8 ^7 v' W0 W' q. S │ │ ! c: l, l ~& {4 j │ ├─src │ │ │ │ │ │ iwdg.c │ │ │ rcc.c │ │ │ gpio.c │ │ │ nvic.c │ │ │ tim.c │ │ │ adc.c │ │ │ usart.c │ │ │ can.c/ O( q; E9 b: a+ ] │ │ │ spi.c6 n9 x/ _! @$ ?! z& ^7 v7 ^. X │ │ │ dma.c │ │ │ fsmc_sram.c │ │ │ hw_config.c │ │ │ stm32f10x_it.c │ │ │ main.c │ │ │ modbus.c │ │ └ ymodem.c9 o) M; a3 P# k9 H+ }$ w1 y9 Y │ │ │ └─MDK-ARM │ │ 9 {% e, F7 F% C5 T# s" H │ │ BootLoad_IAP.uvproj7 K; I1 c- i% _1 F0 f │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */; t# O: i2 m% ^: A5 b: a │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */ │ │ & q, w1 ]9 l+ v- m │ │ │ ├─ROM /* Debug in Flash */# J1 r0 c9 i6 d+ T$ H9 F: d( u! h │ │ │; F: n( ~6 J9 k( {1 o- O( r │ │ ├─rom_List+ e$ l; M' ?5 m' b2 x │ │ │2 m" h, z: B4 l% X │ │ └─rom_out │ │ │ └─RAM /* Debug in Ram */5 Q" D' C, X+ e. g# X' Y │ │ │ ├─ram_List% u6 O& `5 g8 h │ │ │ └─ram_out │ & y7 U+ w0 r1 s, w$ X" n& O& h ├─Libraries │ └─STM32F10x │ ├─CMSIS; _- L, r* b! I6 o& O │ │ ├─Device; m) c- C, |$ d, i+ }7 K$ k; m: \- X │ │ │ └─ST# Z/ I! i" |0 {9 S5 Q6 ^2 M: d │ │ │ └─STM32F10x. P; c8 P% k5 f! V: G3 M │ │ │ ├─Include │ │ │ │ │ stm32f10x.h │ │ │ │ └ system_stm32f10x.h │ │ │ └─Source │ │ │ └─Templates6 R/ P' `+ x$ n2 ?; H, s. _7 k │ │ │ │ system_stm32f10x.c4 O* `; G; @& P# s5 _ │ │ │ └─arm2 e* z, M* G/ P3 b( [* Z# a. T │ │ │ └ startup_stm32f10x_hd.s3 S4 e) g3 X/ n3 J. X │ │ └─Include │ │ └ core_cm3.h │ │1 i0 L4 r/ x- P. H8 J │ ├─STM32_USB-FS-Device_Driver │ │ │ │ │ ├─src │ │ │ │ usb_core.c$ }" E. M l0 D4 ?: H* B2 J │ │ │ │ usb_init.c; u+ P9 i: O! `% Z% |" }3 N │ │ │ │ usb_int.c' w2 h- h" E# |+ T │ │ │ │ usb_mem.c$ g' L! o* w8 P$ C! r/ w │ │ │ │ usb_regs.c7 l( ~# ~3 |7 N, W) o% B% q │ │ │ └ usb_sil.c │ │ │ │ │ └─inc9 o/ Y% x7 l! H% b$ Q' j, y! |2 q │ │ │ 9 e8 K9 M9 u, _ │ │ │ usb_core.h; ~1 e/ `' a9 G5 ^ L1 n │ │ │ usb_def.h │ │ │ usb_init.h │ │ │ usb_int.h │ │ │ usb_lib.h │ │ │ usb_mem.h │ │ │ usb_regs.h │ │ │ usb_sil.h6 t# R+ a) p6 y" R" @! h6 k │ │ └ usb_type.h* H6 k8 z `2 n6 x1 S6 G │ │8 W+ K" y9 R3 A │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */ │ │ % @( \ K9 M" f+ _ │ ├─src3 [/ O3 _( Z- J0 i │ │ │ misc.c5 w3 e( f, X" m8 U# U │ │ │ stm32f10x_adc.c │ │ │ stm32f10x_bkp.c2 R. m* B) U+ b2 }8 W; c5 Y1 ^ │ │ │ stm32f10x_can.c& D& b0 S. n5 ^1 C8 P4 K p │ │ │ stm32f10x_cec.c7 l! z* [5 Z; T) p } │ │ │ stm32f10x_crc.c6 N) `+ \( J- [$ p3 w% v │ │ │ stm32f10x_dac.c$ J2 C$ s1 @# i" U │ │ │ stm32f10x_dbgmcu.c │ │ │ stm32f10x_dma.c │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c7 q) J* J0 X7 C3 W/ Y │ │ │ stm32f10x_fsmc.c7 V; K% A7 y- c7 D │ │ │ stm32f10x_gpio.c' J: p# H+ f% q' u │ │ │ stm32f10x_i2c.c$ s t* R& D7 R. U( H │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c! j( X% G6 H" c* t3 T │ │ │ stm32f10x_rcc.c9 O# C. r% ] J# ?, C: ]9 p │ │ │ stm32f10x_rtc.c9 y ^* P: V# p4 @5 Z. c9 V& X │ │ │ stm32f10x_sdio.c │ │ │ stm32f10x_spi.c │ │ │ stm32f10x_tim.c c6 Y4 \- g' Q │ │ │ stm32f10x_usart.c │ │ └ stm32f10x_wwdg.c2 L% l1 C. W3 C- f" Z9 \. k; R │ └─inc │ │ misc.h, S1 l$ k7 C( T* \5 D │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h │ │ stm32f10x_can.h │ │ stm32f10x_cec.h- S5 ?9 D1 W( V: d │ │ stm32f10x_crc.h4 @8 q- M" [- K# d6 e │ │ stm32f10x_dac.h0 \. x7 u8 {* z7 ^& m │ │ stm32f10x_dbgmcu.h │ │ stm32f10x_dma.h │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h2 m' s) |( [/ y │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h │ │ stm32f10x_pwr.h* ?& ]: C- V9 {9 { │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h& D8 l9 }" S6 [7 |; [: X K* \ │ │ stm32f10x_sdio.h e) e- N4 z* W- b& } │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h │ └ stm32f10x_wwdg.h │ │ └ BootLoad说明.txt% a1 \. L) X5 O " F5 u# W% N \7 L/ g bootloader及256Kb的测试例程打包下载: |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。