一、BootLoader程序使用说明: % E1 x5 o$ k+ `7 A 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。$ Q2 f+ h9 w1 R* x- o5 \ 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。, N' f8 T# h/ r- p4 j 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用4 P: ^& J8 K: ], _3 X 一边读一边写的方法,不受内存大小限制。 - [ h! E2 P: U2 F' W% @ 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为 230400bps,TTL通讯则可设为921600bps。+ q9 d; s! w ?6 n; ] $ Z, \* J8 c/ g& i$ c 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。$ M$ @, b- i, `6 c, T& F 8 n* {( v1 j3 m. n$ ~4 I 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都" {8 k% I8 I1 E( ^9 Z+ R 开启了看门狗,若有故障,自动复位,红灯一闪而过。8 M4 M3 g& w# t- M3 K* g : ?# ?/ \# E" { m- ` 5 跳转至APP程序前,需要关闭所有用到的中断,切记。) `4 G; x7 U8 k( D# D+ x2 b 6 LED指示灯相关的IO脚没有初始化。. ~% U( S9 g& z2 H5 Q& t 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中,/ b7 L! o2 J) S/ z A# x 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机),* D* w8 r$ v" g- u8 D6 Z& d! R 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。 3 C) v a0 z4 u 7 用户程序的中断向量偏移设置如下:" R& M- i b5 w- v* Q' N NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); ; APP程序分散加载的例子 ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***0 T6 a- D- H X3 l; B( \* K% L ; ************************************************************* LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address1 X) D, T. Z! g* V$ m$ ` *.o (RESET, +First) *(InRoot$$Sections)& D" D* h2 U* o f# z: L* @ .ANY (+RO), j/ l' d; V% q: R1 y$ C } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data0 f9 \1 w3 G$ T) U. v ; main.o (exsram) ; exsram 内存段名称4 z' P% a2 Y* X: B ;} }2 J% J8 i6 v7 U. s" s8 { : h: x4 K( s7 N. `1 m+ S$ H6 N6 z " ?$ ~! b' h/ g) u7 \ 二、工程说明 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的, e8 a0 u( E3 X. ?, x( @7 b# A 应用代码: RS485,CAN,FSMC,SPI,TIM,AD Project Targets 设置说明& A- w7 f8 U6 U4 G0 v; I 1.Debug in Ram 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命 ( z( ?5 N2 c2 K 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码, }0 p6 I5 }% W5 t( E; ^1 y - Y' U; k) w: ` #ifdef VECT_TAB_RAM - [' M ?& j3 z7 a1 O7 ? /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); # s6 ]4 z% _8 j# M9 z: R3 E #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ % e4 C8 \# {( s+ P& X7 A NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif 这样就把中断向量地址转移到Ram中6 K7 |' K" a% Q: l) @, Z6 I; Y% C3 p/ H 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings 在Cortex-M Target Driver Setup对话框, r' F) D" _. _# D4 }: M 选择Flash Download为Do not Erase,Program,Verify( R0 w; V, `& A& S. n4 h5 S 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后 6 U$ Z ^+ H: w: k9 e, \3 f8 |" V IRAM_EXSRAM.sct 分散加载文件:0 U+ `. P' w7 F5 l ; ************************************************************** }$ D6 s( d0 @1 ]* s: b ; *** Scatter-Loading Description File generated by uVision ***% J* U% I+ ]3 t3 O7 J ; ************************************************************* LR_IROM1 0x20000000 0x0000A000 { ; load region size_region: Y! M/ [+ X# j8 n7 t2 v1 N5 s ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address *.o (RESET, +First)1 m" L* U) h. ?% Z *(InRoot$$Sections); C4 N3 `+ N4 k& P' o .ANY (+RO) } RW_IRAM1 0x2000A000 0x00010000 { ; RW data .ANY (+RW +ZI)1 e1 F( f, {/ `5 r4 Y } RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称 } } RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件: SP = _RDWORD(0x20000000); // Setup Stack Pointer2 T: g. z$ s% z: ]& G1 {: o PC = _RDWORD(0x20000004); // Setup Program Counter2 ^: m/ Y/ e% z( P/ [0 O2 A _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register 2.Debug in Flash 2 N: [# O1 o4 ]9 F0 a0 V5 n5 g$ [$ F 在Flash中运行和调试程序,需要对Flash的反复擦除和写入! {; _( t% }- F q0 H0 r$ I9 M FLASH_EXSRAM.sct 分散加载文件: ; *************************************************************4 V0 y& G% \8 N% n' Z( ^ ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00040000 { ; load region size_region2 J* [# Y( ]1 Q5 v+ _: q" M7 d ER_IROM1 0x08000000 0x00040000 { ; load address = execution address *.o (RESET, +First)" i5 I3 m( m# k/ }+ B *(InRoot$$Sections) .ANY (+RO) }! W1 F* O* u, u, k RW_IRAM1 0x20000000 0x00010000 { ; RW data$ M6 ?8 N A3 ]9 g8 S+ M .ANY (+RW +ZI)6 p; G7 f. Q$ R! e }5 N8 C E( }* K+ x4 ]% S3 P EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data# R5 } c3 p. K0 C) v& o main.o (exsram) ; exsram 内存段名称; T/ z5 K6 s5 m$ p) J1 A; ~* K } }6 Q" ]' f! n8 Z% R( r! z 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化* j* W7 a& p0 i. c SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写:- i+ I! U/ ~- W: H- ]" R 7 @ h' A$ {9 b4 |$ z. t. Y* j map 0x68000000,0x68020000 read write exec# v$ d6 R3 k: A2 b/ I( v & I& \! P, Z* s8 K" R- F4 U# j 三、源代码组织架构! l' ^! F" F# J 文件夹名称: STM32F10x_BootLoad_IAP3 K& v% [( k+ ~) k# {! R+ l- { 固件库版本: V3.6.1 4 X7 ]( Z) E$ l$ @1 D 文件目录结构: : N F* C$ n" G& e STM32F10x_BootLoad_IAP │, J" D; b+ ]7 A7 ^ ├─Project │ │ │ ├─inc │ │ │ │ │ │ main.h+ y1 N, U: C2 x │ │ │ hw_config.h9 F# c6 ^ a$ a, @' B$ E0 s/ t │ │ │ fsmc_sram.h5 ^( O: d% W" J) Q2 t │ │ └ stm32f10x_conf.h │ │ 3 X* O( t) q/ i8 J2 x) ^ │ ├─src3 o( _+ M+ N. {. ]6 A1 X k' L. C6 r. [ │ │ │ │ │ │ iwdg.c/ }7 ~- v k$ K$ U6 e8 e │ │ │ rcc.c/ w$ [* E5 b- T" D. q │ │ │ gpio.c │ │ │ nvic.c F3 q& s" `9 y# D. K │ │ │ tim.c │ │ │ adc.c │ │ │ usart.c │ │ │ can.c │ │ │ spi.c; t! G7 b% ` ]7 p i3 v5 z │ │ │ dma.c │ │ │ fsmc_sram.c) N4 L- M! }; Y+ F- z6 Z │ │ │ hw_config.c │ │ │ stm32f10x_it.c │ │ │ main.c │ │ │ modbus.c │ │ └ ymodem.c0 V* d @+ @7 X' W7 f X │ │ │ └─MDK-ARM& h6 T: n7 ~. w │ │ * e# d+ p6 N5 Q7 f4 e, v) P6 h │ │ BootLoad_IAP.uvproj │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */9 B V! v0 t- h) O( ?7 N) ` │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */ H, \# M, ?; ? │ │ │ │ │ ├─ROM /* Debug in Flash */ │ │ │ │ │ ├─rom_List' B7 n' H8 {+ L( _: n8 Q │ │ │ │ │ └─rom_out" ?5 l1 Z7 b' o. x( G9 t1 @0 R │ │ │ └─RAM /* Debug in Ram */ │ │+ z0 K5 y; h/ v3 Y/ {3 w5 _: e │ ├─ram_List6 ?1 _/ h7 M- a9 G │ │! k T& f7 i5 \0 A, _+ a; Z- {; A │ └─ram_out │ ├─Libraries │ └─STM32F10x │ ├─CMSIS │ │ ├─Device │ │ │ └─ST │ │ │ └─STM32F10x3 ^* R& w9 C: l4 ]7 j- p. B │ │ │ ├─Include: @' p9 b" l8 L& ^) S$ Z5 x, L │ │ │ │ │ stm32f10x.h │ │ │ │ └ system_stm32f10x.h3 B% R" g$ x% j4 q, Y+ A \ │ │ │ └─Source │ │ │ └─Templates3 Z( `$ f9 ~: w" K │ │ │ │ system_stm32f10x.c │ │ │ └─arm │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include7 f" z7 I! N* G* G" s6 R) q │ │ └ core_cm3.h) E2 {2 M; o/ V: o# K │ │3 ~: l3 g7 ~8 Q$ `8 V │ ├─STM32_USB-FS-Device_Driver │ │ │ │ │ ├─src │ │ │ │ usb_core.c │ │ │ │ usb_init.c │ │ │ │ usb_int.c │ │ │ │ usb_mem.c3 e v5 m$ L0 q& E6 S( | │ │ │ │ usb_regs.c │ │ │ └ usb_sil.c │ │ │ / n" ?4 B* i; D2 S3 o2 { │ │ └─inc │ │ │ │ │ │ usb_core.h │ │ │ usb_def.h │ │ │ usb_init.h) S; d; g) R7 `$ t- e L │ │ │ usb_int.h │ │ │ usb_lib.h4 Z. @7 |4 X) V, {9 H. }3 `$ c │ │ │ usb_mem.h │ │ │ usb_regs.h │ │ │ usb_sil.h │ │ └ usb_type.h │ │ │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */$ w9 }* m- ]& \2 s' |- S │ │ │ ├─src │ │ │ misc.c4 ~/ @ }1 _6 b" R* x k │ │ │ stm32f10x_adc.c │ │ │ stm32f10x_bkp.c% R' J6 A- R* U( J0 x' P, F; l │ │ │ stm32f10x_can.c │ │ │ stm32f10x_cec.c │ │ │ stm32f10x_crc.c' w9 u; P& j3 u' B* Q0 x │ │ │ stm32f10x_dac.c │ │ │ stm32f10x_dbgmcu.c │ │ │ stm32f10x_dma.c. q5 ^2 E# y$ R │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c │ │ │ stm32f10x_fsmc.c │ │ │ stm32f10x_gpio.c% j3 J, ~/ y4 p6 U$ Y7 {5 t │ │ │ stm32f10x_i2c.c* h0 _# ]7 n3 i( p$ P6 s │ │ │ stm32f10x_iwdg.c( M, v7 r( J4 ^4 [ │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c8 E9 u# K" @. W, d5 k+ p │ │ │ stm32f10x_rtc.c* ?' w; s! S" z* m, w │ │ │ stm32f10x_sdio.c │ │ │ stm32f10x_spi.c0 Y- m: z1 y ^# H, X8 D# ~ │ │ │ stm32f10x_tim.c2 ]2 I M* m' ~: Q │ │ │ stm32f10x_usart.c: l2 i9 t1 [& r# H0 q │ │ └ stm32f10x_wwdg.c, U* A- [4 Z7 ^; e │ └─inc" I2 \5 Y' y& o: y( |! k+ q. S │ │ misc.h │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h# u; m" u9 f) X4 n/ X │ │ stm32f10x_can.h │ │ stm32f10x_cec.h0 I6 d+ [2 w6 q4 @, v; m, n/ f │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h │ │ stm32f10x_dma.h │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h7 h3 r9 @, ^& M5 w: c │ │ stm32f10x_fsmc.h. T% W6 w" \. p │ │ stm32f10x_gpio.h7 K* m' l* [% `! E! J! C5 z1 t0 f │ │ stm32f10x_i2c.h+ K# v. U: S( U1 J │ │ stm32f10x_iwdg.h- R5 S5 g" R+ M9 W │ │ stm32f10x_pwr.h# T& _1 x) g) i+ [4 E: Y, ^9 B* }& f │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h- o1 k0 D/ A+ f g+ D2 a @7 s │ │ stm32f10x_sdio.h' p [) N, u( Y( Q │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h( Q# y- s) _6 J2 j │ │ stm32f10x_usart.h │ └ stm32f10x_wwdg.h │ │ └ BootLoad说明.txt - Y; Q0 X# H$ U9 {3 p" T bootloader及256Kb的测试例程打包下载: |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。