一、BootLoader程序使用说明: 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。/ G. g6 L8 b+ d7 r# w6 K" o 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。! `( s/ s! [7 V1 ]+ S3 H 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用 一边读一边写的方法,不受内存大小限制。* N" U# T* o/ t" s$ P 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控) D, V q% h: `. `( ]4 S7 o 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为$ [6 \% |- L* x( j 230400bps,TTL通讯则可设为921600bps。 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送4 k4 u4 |' m2 r0 ^- {9 A 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。4 l3 I$ g" i- A- H2 w3 ` 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都; J* O7 {- U4 o) l0 J. p 开启了看门狗,若有故障,自动复位,红灯一闪而过。# D5 _0 F6 d4 Q7 Y( p6 W! h/ |# Z 2 q2 f2 p6 e: }, r; ^0 m c5 n" M 5 跳转至APP程序前,需要关闭所有用到的中断,切记。 ~" E6 B7 v# s0 E( F - W$ ? | F7 L( V' O: e) Z1 k6 I 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中, 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机), 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。 3 o* E* S8 B/ \0 s( c 7 用户程序的中断向量偏移设置如下: NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);0 j; t! g2 w2 t' O ; APP程序分散加载的例子 ; *************************************************************! H1 |3 p0 L9 c. D6 W ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************+ i2 o# u; c1 K LR_IROM1 0x08004000 0x00040000 { ; load region size_region& U& F8 o1 }: v ER_IROM1 0x08010000 0x00040000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections); s$ O) y! L- l2 j# P& B6 S+ G .ANY (+RO) } P/ J4 I/ X. h! A1 m RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) }: d9 B$ q* \% P8 w ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data. x8 m# r( D/ W6 O ; main.o (exsram) ; exsram 内存段名称 ;}9 l# u8 k& l( z- f9 @ } - Q" O: l" F @7 J ) Y5 w9 F9 [2 z6 q# q 二、工程说明 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的 应用代码: RS485,CAN,FSMC,SPI,TIM,AD . \$ f% `/ [0 B$ a1 N ) t1 T5 [7 y7 A: {* O; b Project Targets 设置说明. d, n5 T2 A2 G4 u0 _2 C, k& m - q* F. ]# O& `( e' _: t& G7 M 1.Debug in Ram/ _- C* V7 Z* W; D % a) f( K- D. z: i 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命1 e; I; U1 T: e 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框4 A6 t4 q" I# }9 ~( V E+ w4 c! [& w$ E- B 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码4 U' g- U" k/ {# z' h/ q 5 b! I I, B2 N0 K #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ , `- M3 I8 q6 j) j NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH *// n4 F2 A6 S9 ~5 c: q9 r /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif 这样就把中断向量地址转移到Ram中: N5 p2 o* S; M9 E2 R ( ~: R) ]; N" g1 N& c. D 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings8 F5 ]! l4 c$ Q- c7 C, g 在Cortex-M Target Driver Setup对话框, , W) N/ X2 M! s0 t1 |9 i 选择Flash Download为Do not Erase,Program,Verify 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后 IRAM_EXSRAM.sct 分散加载文件: ' e1 ^$ l$ p& M: V, j" M, v ; *************************************************************0 z- F/ y1 Y5 Z& Z2 q3 @$ ^7 N ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* 0 u# S0 s& B# F: p; j2 ` LR_IROM1 0x20000000 0x0000A000 { ; load region size_region0 n' V8 T( S1 P1 V% ?% C) b1 J ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address# B, |: i4 i0 h5 f *.o (RESET, +First) *(InRoot$$Sections)/ H; c- a3 S, `/ `# u6 |2 L .ANY (+RO)2 c8 F( d# Z" s7 c2 ]9 R }' `0 d) V! q( j' a RW_IRAM1 0x2000A000 0x00010000 { ; RW data .ANY (+RW +ZI) }7 B9 W, r( A) o! N RW_RAM1 0x68000000 0x00020000 { ; RW data! x, R c6 s4 ~" H/ X3 W1 ?* \1 b/ z .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称8 h+ b5 I, \, m# S$ x+ ^# C }, ^" K4 Z, d. f } RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件:2 Y# Z6 b6 W! q SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register 1 `9 y) r5 R8 f8 U, b& ` 2.Debug in Flash% w5 b" L) K3 e" M ' J% Q) b/ Z, }! @2 L 在Flash中运行和调试程序,需要对Flash的反复擦除和写入! |+ t0 S+ o1 T $ j: Q& U u/ F2 | FLASH_EXSRAM.sct 分散加载文件: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***$ ?0 l+ G9 N: k* a5 o ; *************************************************************8 j- B- G2 _" r- h% }3 N LR_IROM1 0x08000000 0x00040000 { ; load region size_region; A& l: ?) M# _7 s. z ER_IROM1 0x08000000 0x00040000 { ; load address = execution address *.o (RESET, +First)& f# \0 d6 @* A" z% P. w1 j7 j% U *(InRoot$$Sections)6 C3 R6 @9 n: G: z4 L5 I .ANY (+RO)( V7 @+ r/ Q; H }0 S2 \. s- v- |2 g/ K6 u RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) }1 ?& |; ]' O6 |9 W% L1 p' U3 U EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称; p+ [& j B" E' A' V& ~# Z } }: H7 c2 T1 o [2 R 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化0 u2 K' H7 r5 Z' r: t Q$ p SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写: map 0x68000000,0x68020000 read write exec5 a) \4 l+ k. }* c) _- [- |. N 三、源代码组织架构9 f% E- d9 _1 j2 I4 _ 文件夹名称: STM32F10x_BootLoad_IAP 固件库版本: V3.6.1! Z) ]1 K) }9 }( N6 T5 J ) X$ o5 ?2 R& f% R5 a, J( ] 文件目录结构: STM32F10x_BootLoad_IAP! K/ ^/ g% v8 n& _+ ` │ ├─Project- |9 R' _& S: i) }. m" r( w │ │ 6 S8 d) O( E/ F, T! |$ @' @ │ ├─inc% Z/ k8 w/ b8 e4 t5 E. V/ Z- V1 g6 L │ │ │* A+ j6 X3 i2 h+ U- G* W2 } │ │ │ main.h │ │ │ hw_config.h │ │ │ fsmc_sram.h! b) P* I: e9 I! C │ │ └ stm32f10x_conf.h │ │ │ ├─src+ X/ C+ P8 L# n2 G) e │ │ │ │ │ │ iwdg.c │ │ │ rcc.c │ │ │ gpio.c9 \/ o8 ^7 L0 C$ f( s │ │ │ nvic.c │ │ │ tim.c │ │ │ adc.c │ │ │ usart.c │ │ │ can.c │ │ │ spi.c h, J5 L8 @5 k+ O8 a8 ^0 X │ │ │ dma.c │ │ │ fsmc_sram.c7 E, [. Q2 [3 i) D5 ]: d M- P │ │ │ hw_config.c" a p5 r# |% j4 R0 K7 s' ] │ │ │ stm32f10x_it.c │ │ │ main.c │ │ │ modbus.c, f8 \5 Z7 w" x' c6 M │ │ └ ymodem.c; C! f, i* g! t5 ]% G │ │ │ └─MDK-ARM6 G+ W' C5 {9 P! G9 N- v! r) M$ u │ │ / W/ I5 c' n, R2 h: Z/ ^$ Y │ │ BootLoad_IAP.uvproj │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */ │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ k' Z( @- K" `+ A │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */, s# X& H- W! V* {- h │ │ & p) w S$ C6 G! P' i5 n │ │ - m9 _: W8 _/ }: n │ ├─ROM /* Debug in Flash */$ @$ n1 q% u' e8 e P │ │ │) S3 I( s* q" l H │ │ ├─rom_List │ │ │# T+ Z/ R% [4 a% F │ │ └─rom_out │ │ │ └─RAM /* Debug in Ram */ │ │ │ ├─ram_List! m4 l! M$ n- g) r$ A │ │4 J2 L) M; E1 f7 l3 \ │ └─ram_out │ # I1 {8 y4 O( ]4 p4 M: y ├─Libraries │ └─STM32F10x │ ├─CMSIS │ │ ├─Device │ │ │ └─ST2 b4 f$ \5 b9 w# u9 w+ `" I │ │ │ └─STM32F10x+ }3 `4 l- i) B; t. v │ │ │ ├─Include2 n; V! v9 e2 Q& J- r0 W( e │ │ │ │ │ stm32f10x.h + L/ i, g2 ^+ D │ │ │ │ └ system_stm32f10x.h3 A7 \9 c% o, H l; S │ │ │ └─Source8 F8 y" d# _/ ? │ │ │ └─Templates │ │ │ │ system_stm32f10x.c1 z$ d7 a2 j0 {: |6 g) _ │ │ │ └─arm │ │ │ └ startup_stm32f10x_hd.s: J# s [# I6 I/ `& Q5 z: i# r; } │ │ └─Include8 N' u( ^: F' G: j: x( k/ I: R │ │ └ core_cm3.h │ │ │ ├─STM32_USB-FS-Device_Driver │ │ │ │ │ ├─src6 c9 i" f; g+ o3 B) C │ │ │ │ usb_core.c │ │ │ │ usb_init.c │ │ │ │ usb_int.c │ │ │ │ usb_mem.c; W, P) A+ `- l/ T$ M( O │ │ │ │ usb_regs.c │ │ │ └ usb_sil.c) ?9 `) S7 ] s2 V; ? │ │ │ ) r f7 y5 Z2 ~! g$ F │ │ └─inc# R( |, B, A b p2 v) L6 [9 a │ │ │ - s+ C$ F+ }0 {. [ z2 s │ │ │ usb_core.h │ │ │ usb_def.h9 Q9 D" O5 Z$ u+ W: w │ │ │ usb_init.h; K2 ]3 @! q5 M5 ~, i- S │ │ │ usb_int.h* G( V3 V0 ]$ z, j) M │ │ │ usb_lib.h │ │ │ usb_mem.h" S7 L$ ^# G7 m' D0 P. X9 [ │ │ │ usb_regs.h │ │ │ usb_sil.h │ │ └ usb_type.h │ │0 F. {8 E* ^! u. }" _9 U9 Z │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */ │ │ - J+ P% B* L8 U- V. A& e. \% { │ ├─src! U0 O C) e/ |" m/ o1 ~& A/ o │ │ │ misc.c$ x s D/ D# h# Z" H0 v7 }2 _$ }+ S: k │ │ │ stm32f10x_adc.c. t8 C( A! U& p3 k& x9 q │ │ │ stm32f10x_bkp.c2 M5 b6 r- M5 r. T6 ^9 X0 r │ │ │ stm32f10x_can.c │ │ │ stm32f10x_cec.c │ │ │ stm32f10x_crc.c │ │ │ stm32f10x_dac.c │ │ │ stm32f10x_dbgmcu.c │ │ │ stm32f10x_dma.c │ │ │ stm32f10x_exti.c' _6 S ]/ B2 x7 m; D$ ^- g: \8 q! _ │ │ │ stm32f10x_flash.c( H' M* Z7 T0 S( n5 I │ │ │ stm32f10x_fsmc.c1 f6 {. @2 @6 |/ {6 n+ ]0 y │ │ │ stm32f10x_gpio.c │ │ │ stm32f10x_i2c.c \2 Q$ x2 k" _3 ]: f1 Z( ~) {: Q │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c. n5 E2 G0 W+ B+ J- n" t │ │ │ stm32f10x_rtc.c, J8 X% e/ n9 G5 Z! W& { │ │ │ stm32f10x_sdio.c0 e6 g* z: k; U1 h- U │ │ │ stm32f10x_spi.c, ^: {; L* R( k1 p3 ]# V2 v1 U │ │ │ stm32f10x_tim.c8 B& j* N% O: |! H4 r7 Y │ │ │ stm32f10x_usart.c │ │ └ stm32f10x_wwdg.c1 |4 g8 Q( x1 s │ └─inc │ │ misc.h │ │ stm32f10x_adc.h1 y B i5 P, {* D │ │ stm32f10x_bkp.h: x/ [4 f2 f% ?2 J2 ]( Y │ │ stm32f10x_can.h) ^; N! [ }6 h3 W │ │ stm32f10x_cec.h │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h" X! W8 W% J6 c │ │ stm32f10x_dbgmcu.h0 O" Z7 e' ]" ]) S1 E │ │ stm32f10x_dma.h │ │ stm32f10x_exti.h- L" A* a0 l6 o! H5 C2 |) q: [ u │ │ stm32f10x_flash.h │ │ stm32f10x_fsmc.h, C! i0 K1 R6 B; Q2 C │ │ stm32f10x_gpio.h │ │ stm32f10x_i2c.h+ M$ }% r; R h+ v% `0 C │ │ stm32f10x_iwdg.h │ │ stm32f10x_pwr.h2 f+ p' v; H8 e* E% ` │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h7 `* o0 [8 f7 p9 S* M& Y: ^7 Q │ │ stm32f10x_sdio.h, q4 e( V; u8 p) R" i │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h │ └ stm32f10x_wwdg.h │' ?" j6 U9 R# N' t" z$ l/ t5 M │ └ BootLoad说明.txt% _" {# b6 O3 ~; z( | 3 z& I6 d. e P7 [! ?' A2 ~0 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程序及测试例程打包上传。