一、BootLoader程序使用说明: 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。* y4 U' o g1 ]0 t2 d0 m 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用 一边读一边写的方法,不受内存大小限制。 ! P; w# b* C& I, H6 Z2 y; O 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为- Y. I% Y1 p1 x5 a3 [3 L% I1 y# X 230400bps,TTL通讯则可设为921600bps。. u$ h" `" q& [( H" B7 P) [; l, l* U5 W 6 X4 h0 n2 S, x, X& F" T( S 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送/ c, N8 Y( w* N/ z* v 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。3 {5 z' e& H+ M& O& Q! f, {; j* K) f 2 p( s; ?* M+ z 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都 开启了看门狗,若有故障,自动复位,红灯一闪而过。7 q* b9 L8 |+ Q2 B+ q ' Y5 A% Z7 A- y" x. C( J 5 跳转至APP程序前,需要关闭所有用到的中断,切记。( X3 C2 A- _. P6 \* H. n" _ " \$ `7 \9 f: N. x6 b" @1 a! u4 U1 \ 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中, 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机),4 N0 ~! W- ?/ G3 N 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。 7 用户程序的中断向量偏移设置如下:, i# w* m/ W" Q6 S NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);# j7 Z0 ^- D/ i& i* ]9 h - S2 E1 I+ ]. n. g2 A6 ^ ; APP程序分散加载的例子 ; *************************************************************! M h) y: |% ?# S Q, q6 z0 V ; *** Scatter-Loading Description File generated by uVision ***$ G8 g F- q6 a, z Q ; ************************************************************* LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address: f5 e5 x# O4 E, c- C3 e/ Q' x *.o (RESET, +First) *(InRoot$$Sections), ^: M$ n& I6 L .ANY (+RO) }7 u" C; c' v& o% {2 B; k8 l RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI)# ?( ^0 V8 @. s8 Z ` k } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data% k9 }5 D# G" Q4 N0 }% |/ s ; main.o (exsram) ; exsram 内存段名称 ;}$ |& E- V0 t, w8 f+ B6 `. O }& {4 v9 { I' J0 r% ^ 8 f2 S2 S& T0 [9 R$ [* k! W- E 0 ^" E6 m; ~% \3 B- X % _, R* k) _0 X2 e 二、工程说明 / \: t5 x3 Q8 F( ~6 Q4 Y6 [0 E C; e 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的2 u% o3 @2 t, A# [; A- H h 应用代码: RS485,CAN,FSMC,SPI,TIM,AD . W" o5 c% F& B: _1 Y( G. x# ^ N ! r5 j; L: s! S2 J Project Targets 设置说明% G4 E: A @- S' c% h 2 X% O$ @. f8 i) C) L, t" x- v 1.Debug in Ram ; F8 ^$ e5 D, i. ?! G 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命$ C& @$ {; T' B) u$ f- P 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框- |4 [4 t3 o3 M" l2 ] 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码, g4 V: V- N" m9 k #ifdef VECT_TAB_RAM ( N# d1 F$ ], S9 S /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH *// n/ ]* \' \6 B, q9 R /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); ' z# U* {3 X7 E2 [8 v0 H. v #endif! [3 B7 a$ D$ _$ M8 `4 g# p 这样就把中断向量地址转移到Ram中 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings 在Cortex-M Target Driver Setup对话框, 选择Flash Download为Do not Erase,Program,Verify 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后 2 ]5 K7 _. x5 f9 L& l% X IRAM_EXSRAM.sct 分散加载文件: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** v! i' K- l4 ` L' k5 _& Z" e7 N ; *************************************************************6 _! n7 U# {9 x LR_IROM1 0x20000000 0x0000A000 { ; load region size_region2 l& `" w% l/ Z2 ] ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address *.o (RESET, +First)1 C* B) N8 |1 J G *(InRoot$$Sections)8 D% ]) h5 w+ x .ANY (+RO)* [ I# W. R! x& O x3 H }& }6 G( h F! j6 U RW_IRAM1 0x2000A000 0x00010000 { ; RW data .ANY (+RW +ZI): }* N! O9 {$ G0 O$ I }/ j' W' t1 G* T9 w$ W RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称4 O) Q8 N& k$ H } }! G7 m* y% Z F( g, i3 i RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件:4 C3 M b8 N0 ^2 ?$ q SP = _RDWORD(0x20000000); // Setup Stack Pointer* N) x2 X. i$ w1 C* Y PC = _RDWORD(0x20000004); // Setup Program Counter) `0 G; L! F! k" { _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register7 Z3 |; U* ?: C; b8 a 2.Debug in Flash5 Q) P# Q2 S- k# @ : L; H! y1 F" _. i, ` 在Flash中运行和调试程序,需要对Flash的反复擦除和写入3 c3 c2 V5 C, ^9 p6 e5 e 0 M7 M: c3 c6 q" s! Q' {! x" ^3 T FLASH_EXSRAM.sct 分散加载文件:/ Z/ Z; Q7 H) L0 Y F % K3 ~$ g5 m( \7 l9 b: l z: z ; *************************************************************' T$ n2 h; a% I' L" v) s ; *** Scatter-Loading Description File generated by uVision *** l5 O \! T% G+ v% ^ ; ************************************************************* LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; load address = execution address *.o (RESET, +First)/ ]) C, I! D" {5 ^0 _1 N& E *(InRoot$$Sections)' c, w4 d2 B4 w: z8 [9 P1 F .ANY (+RO) }" {; h% l0 T% m' C8 d* U; E \! g RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) }7 @4 S5 p5 O7 e8 p. l EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data; }# a( i* b, j4 G main.o (exsram) ; exsram 内存段名称' x" ~$ X1 k1 q* \$ X8 D) G } } 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化 7 Y3 y* J. m4 ~3 I SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写:4 \" z0 w1 Q6 \! ^1 J map 0x68000000,0x68020000 read write exec 3 U( ]1 G; G9 e! h, k" A) j 3 F0 I1 i' P6 h+ m: C! L3 o5 i 三、源代码组织架构 9 J0 E# [+ m- ?4 a7 k 文件夹名称: STM32F10x_BootLoad_IAP6 G _7 w" T. T6 G8 E4 h+ s6 n; D 5 d; k( h2 [ A5 G" r 固件库版本: V3.6.1" @, |( t: |/ C) { 文件目录结构:$ N; _1 p( D' q* K2 A* Z $ P2 m: s' v! q6 \) C3 A4 [2 n2 m( H STM32F10x_BootLoad_IAP │ ├─Project. N! K' C: _9 ] │ │ 3 O6 ^7 ?# X2 A9 H2 v+ s' `: G │ ├─inc* _9 a Y' `& F6 q# |* c$ D │ │ │" b0 b" B) A- a │ │ │ main.h. \0 y5 O& {9 V1 u# J) U3 n- _ │ │ │ hw_config.h9 B7 M. f- K* A4 Y) W8 d% I# F │ │ │ fsmc_sram.h │ │ └ stm32f10x_conf.h │ │ │ ├─src7 a2 }( o% }7 W* Z# |! w │ │ │ │ │ │ iwdg.c3 A4 T) K; p4 q& c │ │ │ rcc.c, X% E" B, o) F& [7 w │ │ │ gpio.c │ │ │ nvic.c/ E0 o/ H( H. U% P& V8 {) _+ C │ │ │ tim.c! D2 p; u8 _! D' j! i) A │ │ │ adc.c │ │ │ usart.c │ │ │ can.c │ │ │ spi.c │ │ │ dma.c7 m0 ^, m$ c5 d W │ │ │ fsmc_sram.c1 T1 u O' X4 E │ │ │ hw_config.c │ │ │ stm32f10x_it.c* Y7 S- y& D% w- l1 {8 u3 Q │ │ │ main.c; {% L1 _$ J6 f; c$ }' a7 ^1 S5 h │ │ │ modbus.c0 \; c- _# A0 _& v │ │ └ ymodem.c3 l3 l4 {* m' L; p │ │ ; Z' x6 s0 f* [. K4 z$ {9 | │ └─MDK-ARM │ │ 0 J+ \* A& @5 K G# T, k │ │ BootLoad_IAP.uvproj8 G9 K+ V/ ~) J │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */ │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */5 Q* ?% A. _ p$ B8 D K │ │ - ~+ {( x7 p9 [ │ │ │ ├─ROM /* Debug in Flash */! c. F- u. s( V+ v% f │ │ │) N" g) V% ?8 d" \: ? │ │ ├─rom_List │ │ │8 O) l L1 d E/ y$ [ │ │ └─rom_out3 L+ h% ~+ P* y9 y3 ?" D │ │4 Q; Z9 g2 C4 T9 o% R% ] │ └─RAM /* Debug in Ram */, }2 ^% [5 }1 E# f' w. D │ │8 ?( E+ ~# C% Z, K8 g% v! b0 G3 U B │ ├─ram_List' p5 R+ `3 n- ^- ^4 ?/ k │ │ │ └─ram_out5 r( b. e1 o9 T/ N& B │ - z) u6 h$ @% ~: ?$ I$ j ├─Libraries │ └─STM32F10x │ ├─CMSIS │ │ ├─Device │ │ │ └─ST │ │ │ └─STM32F10x* V- T# u- o# r- c% v2 u │ │ │ ├─Include2 g5 G4 Z# e% U1 E8 ^ Q │ │ │ │ │ stm32f10x.h │ │ │ │ └ system_stm32f10x.h │ │ │ └─Source │ │ │ └─Templates! d6 A! b! [9 | e8 h │ │ │ │ system_stm32f10x.c │ │ │ └─arm │ │ │ └ startup_stm32f10x_hd.s2 Z Y' V) U" r( E& H │ │ └─Include) V+ v& d% ^2 y6 s0 E │ │ └ core_cm3.h │ │* ^7 j& G5 ]' R" y d- o │ ├─STM32_USB-FS-Device_Driver │ │ │ │ │ ├─src │ │ │ │ usb_core.c │ │ │ │ usb_init.c │ │ │ │ usb_int.c- E. b: \* U& O% \8 b7 e │ │ │ │ usb_mem.c' v7 ~* Y6 L) \3 Y3 J+ ~( Y2 r! C7 Y │ │ │ │ usb_regs.c8 j" f! i Z. b% E6 T& H │ │ │ └ usb_sil.c+ L* x* c: _+ Q. \& Z0 c6 y/ a │ │ │ │ │ └─inc │ │ │ │ │ │ usb_core.h │ │ │ usb_def.h7 x, J- a* ]1 r3 I$ I │ │ │ usb_init.h │ │ │ usb_int.h │ │ │ usb_lib.h │ │ │ usb_mem.h │ │ │ usb_regs.h │ │ │ usb_sil.h* k2 C$ [& x/ i" Y$ d* A2 C │ │ └ usb_type.h) ^+ j0 J: u) i Z k5 G0 H) M5 s │ │ │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */ │ │ │ ├─src │ │ │ misc.c │ │ │ stm32f10x_adc.c │ │ │ stm32f10x_bkp.c │ │ │ stm32f10x_can.c! G V# F, ~; C& |, I │ │ │ stm32f10x_cec.c' `/ G" W# R3 |7 D4 Y │ │ │ stm32f10x_crc.c │ │ │ stm32f10x_dac.c │ │ │ stm32f10x_dbgmcu.c. A( e# c8 `1 P. c0 N% b; Z6 | │ │ │ stm32f10x_dma.c+ `3 y3 Q3 u2 f4 @$ n6 y! Y2 ` │ │ │ stm32f10x_exti.c' x; n B- A2 k* f8 W( a │ │ │ stm32f10x_flash.c s- O2 u+ o q& ` │ │ │ stm32f10x_fsmc.c% E+ q, M3 |% w. H% C │ │ │ stm32f10x_gpio.c │ │ │ stm32f10x_i2c.c │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c8 e8 J( [9 z i6 C │ │ │ stm32f10x_rtc.c$ K$ W6 v7 s' h: v- Y │ │ │ stm32f10x_sdio.c │ │ │ stm32f10x_spi.c' @; I$ c }3 y6 {/ I4 r │ │ │ stm32f10x_tim.c: C" b6 _2 f; ~; K9 p │ │ │ stm32f10x_usart.c; `" {+ F- j# E1 w. B │ │ └ stm32f10x_wwdg.c$ m0 M8 k4 Y; W, F1 _; Q7 M │ └─inc │ │ misc.h* N% |% o' ?. ^! T/ P; T │ │ stm32f10x_adc.h9 h6 g* A* y5 k/ c' I% g │ │ stm32f10x_bkp.h! B5 e+ ^7 }9 A8 _9 g4 Q" g │ │ stm32f10x_can.h │ │ stm32f10x_cec.h │ │ stm32f10x_crc.h! i7 a" y# F6 Q" V- [0 W- c │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h V9 f- k$ R) s9 J/ e │ │ stm32f10x_dma.h │ │ stm32f10x_exti.h+ c% x( @3 K) C/ w) U1 _ │ │ stm32f10x_flash.h │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h │ │ stm32f10x_i2c.h- }3 P1 ^, k! T2 \ │ │ stm32f10x_iwdg.h │ │ stm32f10x_pwr.h, |9 t9 G( ]; J: u. A. U* x0 H │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h │ │ stm32f10x_sdio.h │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h ?' h) C' B; E/ [: k │ └ stm32f10x_wwdg.h& Z3 [. y* M( r+ l │7 k- {& H* F1 H# H9 V │/ i: G, E7 Z. G: o0 \0 W └ BootLoad说明.txt 0 b2 F" `6 m2 \; L bootloader及256Kb的测试例程打包下载: |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。