一、BootLoader程序使用说明: * w3 ?! ]/ N: s5 G( f 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。% ?7 v; J b" ^8 c7 p 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用9 f5 H4 h& w7 K( x% j& B' q. L 一边读一边写的方法,不受内存大小限制。 ?3 c5 Y9 E! `% ?3 B8 I 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控% t. m. P4 f: {8 h; z0 f 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为# B _' F- f! z5 b6 o 230400bps,TTL通讯则可设为921600bps。9 g' V: a7 _& A: c 5 l6 H" Y; X0 [ 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送* a6 l1 X1 N. y4 _" l 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议5 u7 \+ @/ t7 I, u4 P 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。 Z6 i/ _ M2 V 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都 开启了看门狗,若有故障,自动复位,红灯一闪而过。 ' d2 D, S* _+ u' M- I2 H 5 跳转至APP程序前,需要关闭所有用到的中断,切记。 6 LED指示灯相关的IO脚没有初始化。* Q ]1 R' `) q# K$ z 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中, 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机),! K* ~; i! B1 ` 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。! J4 i2 `2 P) |9 J# f+ m+ e2 \8 S; o ; d. |7 O. ^; C/ x" W; l 7 用户程序的中断向量偏移设置如下:# z+ S8 Q9 ?+ p) Z& U; X" g4 Q NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); ; APP程序分散加载的例子 ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* % p3 l9 A* r( L$ U& e/ Z% z: n% [ LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address *.o (RESET, +First)0 x( h: U( b4 y *(InRoot$$Sections)" _( D; _; `% b7 @ .ANY (+RO) }1 U! W* e9 H; G) S6 C: b, H C RW_IRAM1 0x20000000 0x00010000 { ; RW data. z m# ^ {# o; u0 z" M5 `! e .ANY (+RW +ZI) } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data- K" c" W8 f+ L+ u1 d ; main.o (exsram) ; exsram 内存段名称/ T; N0 g6 G& B. T2 W ;}% E& S( I* C( s" d% _ } . w7 K! u' n4 I: E 8 p2 p: g& h3 @, m # R% p7 D+ h( y. q Z; X 二、工程说明$ w" I% h7 c: W- S& ~% `/ P' T 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的: B, Q, Z% W. U5 a; s7 h 应用代码: RS485,CAN,FSMC,SPI,TIM,AD% t( ?& i/ H! h$ E . J+ N2 G4 e1 Q! B Project Targets 设置说明' d3 z9 |2 e- ?; w* d ' r Y8 V) x% ~# @! z 1.Debug in Ram 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命 # x; K% R- ^& l' m( R 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码) j* i' ]" }# g* q ( O5 C7 c2 {" q3 L6 }# O #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ % K/ H% u" p4 Y% ^) Q6 b NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); # w: y4 I" q# z6 H* ]( K% a #else /* VECT_TAB_FLASH */# j& T4 Q) }+ l /* Set the Vector Table base location at 0x08000000 */ * c4 k) r0 i5 R4 f, ` NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif 这样就把中断向量地址转移到Ram中 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings 在Cortex-M Target Driver Setup对话框, 6 \$ k3 z2 a3 s 选择Flash Download为Do not Erase,Program,Verify3 j- {/ h. u2 U& S+ H, Z% F 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后 IRAM_EXSRAM.sct 分散加载文件:" B: x2 U$ b R5 [; ]& D ! Z0 x1 X6 o7 ]- F% d0 R ; ************************************************************** @# ]+ u% n; }4 Y# s# u7 t X% n ; *** Scatter-Loading Description File generated by uVision ***: U+ D4 N5 O5 `7 L ; ************************************************************* LR_IROM1 0x20000000 0x0000A000 { ; load region size_region ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address8 x4 B6 `: o% c' T" |5 r1 q *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x2000A000 0x00010000 { ; RW data/ A. t- }8 ~# f/ {9 \- x .ANY (+RW +ZI) }% Y9 {/ g4 E1 g! i& S RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称 }" r" P1 S8 {0 {! z } RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件:. w# V8 J' i3 {3 h! O1 d5 M 5 [ P7 @; j. _& T V SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register9 H2 x/ ~* ^6 D* y q3 z6 P 2.Debug in Flash 在Flash中运行和调试程序,需要对Flash的反复擦除和写入; I4 b( Q ]5 E- S2 m6 O; N ! [, e0 ~& u/ g5 ?4 I FLASH_EXSRAM.sct 分散加载文件:% D( `7 u6 M: k ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***6 j t2 A, A4 ]. s0 _* W ; ************************************************************* # w- D1 u: v. }7 F+ T LR_IROM1 0x08000000 0x00040000 { ; load region size_region/ H& ~; |" y8 E9 \, X) k/ W& [. ~ ER_IROM1 0x08000000 0x00040000 { ; load address = execution address1 }; d6 p& @0 h, w5 E7 t3 ~4 V9 y *.o (RESET, +First) *(InRoot$$Sections)$ T/ p" i. v7 |+ ?- T% Z8 Y$ ]4 _ .ANY (+RO)9 A" @: [! D+ v0 T l9 H+ z7 r { } RW_IRAM1 0x20000000 0x00010000 { ; RW data( V+ Z) \- x+ m G, I0 R .ANY (+RW +ZI)( c) w9 C7 s1 x2 U" N }# j, X8 W8 j& ~! n1 f5 D$ Z/ Y! v EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称4 m& B, y% Q5 C' k) }0 K" E1 J' J } }2 y" t w) ?6 F+ E4 K3 d 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化 SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写:2 A8 M* C" t5 ` ( l, C$ L! [2 S- X, T! s$ j( _ map 0x68000000,0x68020000 read write exec & d, ]! t8 c) V+ d H4 D1 y; s3 R 三、源代码组织架构 文件夹名称: STM32F10x_BootLoad_IAP - ~; {; v, V3 \' R 固件库版本: V3.6.1 文件目录结构: - l5 l- A3 V. n8 q- d STM32F10x_BootLoad_IAP$ I0 j: L4 c @# e2 \8 h' I) D. K │ ├─Project$ K* S) D. N2 Y │ │ 3 }7 l2 o0 J7 n% ^! N& Z │ ├─inc" ^1 ?2 A& j: f │ │ │9 u: C) ?, o3 V+ r$ J9 }3 k │ │ │ main.h │ │ │ hw_config.h │ │ │ fsmc_sram.h │ │ └ stm32f10x_conf.h │ │ │ ├─src │ │ │& D# \# Z# `# i+ O* T/ ] │ │ │ iwdg.c │ │ │ rcc.c │ │ │ gpio.c* k g! m7 j+ [! n8 n D2 y1 u( N │ │ │ nvic.c/ N2 l1 U& }* N) Z │ │ │ tim.c5 X% ?: U1 O2 A. G! I1 Z: } │ │ │ adc.c │ │ │ usart.c │ │ │ can.c+ @! z$ E p2 x( N │ │ │ spi.c8 j$ e" X* V; U5 A2 k* b" @5 Z8 ^$ s │ │ │ dma.c │ │ │ fsmc_sram.c- p5 D' Q+ [; J9 J' d2 W │ │ │ hw_config.c8 w$ q0 ]$ U% G/ v │ │ │ stm32f10x_it.c# v, [% E* G! W' B0 U2 Z* S │ │ │ main.c0 s9 V' k8 V6 p4 y7 _2 P │ │ │ modbus.c+ h; E2 |* I, F: f │ │ └ ymodem.c) w8 I \9 Q5 [- P0 j, X# Z │ │ / D; ?+ b2 g& C9 ]9 _- ^% G& z │ └─MDK-ARM │ │ 5 v- F( }, q% T+ }7 ` │ │ BootLoad_IAP.uvproj │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */ │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ 7 r& T+ ^2 |- y │ │ RAM.ini /* IRAM调试初始化文件 */ ' T' ~$ K- ^7 m1 F# j' v3 L │ │ SIM_MAP.ini /* 软件仿真初始化文件 */ │ │ a8 s7 [+ {) I8 j+ [ │ │ ' v6 `3 ]( i+ l% r7 j6 o6 x │ ├─ROM /* Debug in Flash */ │ │ │ │ │ ├─rom_List │ │ │ │ │ └─rom_out7 w- N& c* b( p' _( Q │ │ │ └─RAM /* Debug in Ram */8 Z5 d& P# M( F$ E1 x │ │) Z2 D) Y- G2 E% K' M │ ├─ram_List │ │7 y9 t" U: S# e9 \" _& h │ └─ram_out0 a$ x$ ]0 p2 g; n' S │ $ I2 p* H* Q3 K ├─Libraries" ~8 q1 T9 D8 c. n │ └─STM32F10x │ ├─CMSIS │ │ ├─Device, ^, S8 X' ?" P$ G2 X │ │ │ └─ST │ │ │ └─STM32F10x* ]/ z+ L: O/ r │ │ │ ├─Include% k6 K) j2 R2 @8 H7 ~2 g │ │ │ │ │ stm32f10x.h : v, N4 _5 v; ~, s! H │ │ │ │ └ system_stm32f10x.h/ f, i& Q2 ~( u5 j7 i; b& Y │ │ │ └─Source( ]( S3 ^5 ^8 ^( h' a8 ` │ │ │ └─Templates │ │ │ │ system_stm32f10x.c8 K( P& E; `# ^* w │ │ │ └─arm/ [% g1 u) v( S6 o \) R$ W │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include │ │ └ core_cm3.h! y2 Z/ v- N; w& I( n │ │" `5 N$ d. k# W │ ├─STM32_USB-FS-Device_Driver! ~, n1 `, n6 Z& `& C2 }+ C- r* G │ │ │ , O$ B5 I, ]- @& e" ] │ │ ├─src" F2 y% k" w8 b' ~1 j% u │ │ │ │ usb_core.c │ │ │ │ usb_init.c7 _ ]. {, l( H0 ] N, y0 J │ │ │ │ usb_int.c9 a; s3 J- g i) u8 U8 o. ?' T4 ], n t │ │ │ │ usb_mem.c2 u$ k0 w' b& M: g3 h( v2 @ │ │ │ │ usb_regs.c │ │ │ └ usb_sil.c │ │ │ │ │ └─inc │ │ │ │ │ │ usb_core.h │ │ │ usb_def.h │ │ │ usb_init.h │ │ │ usb_int.h │ │ │ usb_lib.h │ │ │ usb_mem.h │ │ │ usb_regs.h9 j V$ M7 U+ v$ ] │ │ │ usb_sil.h │ │ └ usb_type.h │ │; ?' |+ S0 |/ j- }4 l │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */' e( e# ]7 y+ k1 u+ y9 M │ │ ( O: N0 ]1 N3 [! F │ ├─src# t6 R- n4 j" x8 U │ │ │ misc.c( X" w& Z! \( Q' y │ │ │ stm32f10x_adc.c c$ H, h2 Y& s: i/ l │ │ │ stm32f10x_bkp.c │ │ │ stm32f10x_can.c1 q+ o3 d9 E- H/ t& M y │ │ │ stm32f10x_cec.c) n, J/ g" [4 U: d/ j2 _ │ │ │ stm32f10x_crc.c u" X ?" Q" R( _! E │ │ │ stm32f10x_dac.c) p. N1 J: `1 @% p5 |' p" m │ │ │ stm32f10x_dbgmcu.c │ │ │ stm32f10x_dma.c4 _2 q! C4 g: |/ A$ ?, N, Y$ a │ │ │ stm32f10x_exti.c1 K( R+ q2 y% x │ │ │ stm32f10x_flash.c │ │ │ stm32f10x_fsmc.c6 Z/ @" w* u& T! k- t4 K │ │ │ stm32f10x_gpio.c │ │ │ stm32f10x_i2c.c0 f: Q1 d+ k/ y7 n& x" F6 l │ │ │ stm32f10x_iwdg.c, X! z4 J% T( Q; _ │ │ │ stm32f10x_pwr.c/ A8 R# C8 y2 N; B( v │ │ │ stm32f10x_rcc.c$ D8 o- v+ u3 w# V& V5 T │ │ │ stm32f10x_rtc.c* R C) V& o- {' m& d* K │ │ │ stm32f10x_sdio.c m B8 f! C" z8 x: S0 z │ │ │ stm32f10x_spi.c- z5 e" g& n; X │ │ │ stm32f10x_tim.c0 N7 n. o% l0 Q: B4 r% \3 ?) z │ │ │ stm32f10x_usart.c │ │ └ stm32f10x_wwdg.c │ └─inc │ │ misc.h. j* U1 t& {9 T │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h │ │ stm32f10x_can.h │ │ stm32f10x_cec.h: ?% k' {% R' s7 A- C, y │ │ stm32f10x_crc.h& t- {' t- U% Q) F- z │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h% Q# @: ?3 T2 s9 n7 b8 R; H │ │ stm32f10x_dma.h6 \' r3 r X3 Q# r' I6 v │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h; b( E# y; q# d7 w+ e! G) { │ │ stm32f10x_i2c.h6 V# ~% Z9 k Q7 B/ I: J │ │ stm32f10x_iwdg.h7 R! W: c: u/ b │ │ stm32f10x_pwr.h/ Q% s b8 o6 @' r │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h │ │ stm32f10x_sdio.h! F( \9 x+ U- h: A │ │ stm32f10x_spi.h/ P+ F. f# v. a9 r8 `5 \ │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h │ └ stm32f10x_wwdg.h. z4 o+ N( N* d( S+ z. H0 @# H9 a │" a0 U* p6 F5 x$ M, M- @! q# ^ │ └ BootLoad说明.txt( K' k, |4 a. x2 Y e- A bootloader及256Kb的测试例程打包下载: |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。