一、BootLoader程序使用说明:5 P+ q$ c: U7 O1 S u0 j! j; O 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用 一边读一边写的方法,不受内存大小限制。 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控( d' }4 ^& c1 ]* y0 \ ? 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为! j- s U6 j7 e) ? 230400bps,TTL通讯则可设为921600bps。 ; s& \+ Z+ B) ~# _ 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议5 D0 B' a* h8 E+ {+ }: l 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。 ; R9 V9 P! _' |' F' S* F 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都 开启了看门狗,若有故障,自动复位,红灯一闪而过。 5 跳转至APP程序前,需要关闭所有用到的中断,切记。! r1 I- Z4 ^ [, @1 ]: I 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中,7 D) R2 ~5 B, m0 a 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机), 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。1 k5 H* V# D$ S$ \4 F 7 用户程序的中断向量偏移设置如下:# x, i" r1 k, B- S# G& B. r NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);/ ^( V5 H! _' H) G! G ; APP程序分散加载的例子 ; *************************************************************, R7 M) s. |% H" G+ f3 f' r ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************8 M; b8 m8 b8 `, x4 F- o LR_IROM1 0x08004000 0x00040000 { ; load region size_region8 d3 H K, B( J, f( z ER_IROM1 0x08010000 0x00040000 { ; load address = execution address *.o (RESET, +First)7 |: f" A; p4 A! M, R( `1 ?9 J# ? *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) }( Q) W4 Z9 j2 `7 z6 h+ ? ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data, Q- u: a6 ^0 L/ L. G+ R ; main.o (exsram) ; exsram 内存段名称- K) S) T- z/ ?- ]" W+ _ ;} e7 n) A- h: z$ N }' e4 w, g+ J0 b+ r( D( g 8 q& J" f. Y% K& \5 h2 ]: k 二、工程说明 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的 应用代码: RS485,CAN,FSMC,SPI,TIM,AD Project Targets 设置说明% f2 W: A' w- R/ i8 N7 w ( U% @7 H( A6 k( } 1.Debug in Ram6 l" e5 f0 j6 ^4 R# N 7 N* e% Y$ N% z: T) L( c8 _ 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命3 C+ w1 R: T, r U' i5 h4 P# R; \) F 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码 ; y9 i1 W+ r+ \& d0 E5 H( p) u #ifdef VECT_TAB_RAM # M! F; o) w' K* Y /* Set the Vector Table base location at 0x20000000 */ 5 ]0 L- K/ e$ L" [9 k NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */% ^# S8 ]4 `( D9 [$ A /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif 这样就把中断向量地址转移到Ram中8 w8 ?. R, B- g5 T( z3 Y' G+ z 点击Option for 'Debug in Ram'\Utilities\Configure Flash Memu Command\Settings; T( v+ [: d2 S4 }( V! r& W& \8 q 在Cortex-M Target Driver Setup对话框, 选择Flash Download为Do not Erase,Program,Verify% C+ U$ s5 K( ~* D" f5 x2 `6 o 分配程序空间和数据空间为0x20000000以后, 程序空间在前, 数据空间在后) }9 O v. C l7 s6 r# F# p IRAM_EXSRAM.sct 分散加载文件: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***9 g+ B: L- \" u+ Q- Q6 v R6 d ; *************************************************************" U: h; B4 g4 \9 e LR_IROM1 0x20000000 0x0000A000 { ; load region size_region# H# i7 }: z9 q$ @1 l3 L ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address3 i* `3 n+ `+ l$ H *.o (RESET, +First)6 |( |. z$ |8 T- f. K! Y6 ^ *(InRoot$$Sections) .ANY (+RO)$ R* D, K# ]1 m5 O# N! p }, H% M& S+ o O4 Z- Z RW_IRAM1 0x2000A000 0x00010000 { ; RW data% g; c4 D+ t7 O( N8 ]7 s- P .ANY (+RW +ZI) }3 v$ S9 L8 |1 \, @- W0 _( O RW_RAM1 0x68000000 0x00020000 { ; RW data2 o, q, ^% U( X( u" e u8 k% x .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称 } } RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件: " \# [/ E( m6 m( [" j5 y' o* d SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter! I0 _2 Y( @ e- J2 I/ I1 } _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register6 J; T' }/ W+ r9 x) {0 P " [. ^! I' p+ H# M, N" n5 ~ % w8 m8 I: z; F7 K6 V- i4 z( W$ d5 Q 2.Debug in Flash9 ?7 w+ {& `8 t/ n( Y 在Flash中运行和调试程序,需要对Flash的反复擦除和写入 FLASH_EXSRAM.sct 分散加载文件:$ W3 n( Y, n2 r6 w/ m $ z8 U& j4 i% I" s6 S4 k1 ~ ; ************************************************************** F* q2 @$ H: n ; *** Scatter-Loading Description File generated by uVision ***' s! d: w. O% V ; *************************************************************+ _% }3 m* u0 u3 `" G / B5 ?0 h' Z1 b7 z LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; load address = execution address *.o (RESET, +First), |1 v7 z) r, E; q *(InRoot$$Sections)% l% |" B0 Y9 @9 P .ANY (+RO) }- x/ U( M O1 J! `+ g; J7 v RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI): Z( L3 T4 T2 L8 \- t/ j } EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称 } } # z: o2 d6 C5 m! \/ ~/ A8 M6 D 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化 " Y: j y# c$ F SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写: ' |( O* Y8 w# |6 s1 |3 i map 0x68000000,0x68020000 read write exec' b# E1 P, T0 ~ # S) {; |: X. v& c6 O0 m 三、源代码组织架构3 O/ a$ F* d( p/ B. U. v % C' ]1 ]) _+ d+ H 文件夹名称: STM32F10x_BootLoad_IAP. O2 |' ^3 o4 C ^& M c+ w 9 |4 P4 s! o- r& u* y2 X! S i 固件库版本: V3.6.1! B! ^9 G7 y- k 文件目录结构:! A5 k9 q) w: g! [ 3 `4 s$ J" n- l9 R- c STM32F10x_BootLoad_IAP │ ├─Project │ │ 3 L, R g, S) [4 X4 T+ F │ ├─inc │ │ │ │ │ │ main.h │ │ │ hw_config.h │ │ │ fsmc_sram.h- o3 ~- c8 u7 |) v3 b# d" O' y │ │ └ stm32f10x_conf.h7 F$ l B. w1 b$ r9 j! b7 f: Q& Y# J │ │ , z" z# ^- M x' t; Z$ X& g* k │ ├─src │ │ │ │ │ │ iwdg.c │ │ │ rcc.c │ │ │ gpio.c( j* X! b# Q! t" x; P: X1 u6 o │ │ │ nvic.c" g# A4 ~" [+ S! C4 v │ │ │ tim.c │ │ │ adc.c; C& x" C, w( g7 Y" v, G0 u │ │ │ usart.c) o! V" n" p# g6 W' f$ p- G# ^ │ │ │ can.c( Z& O* V7 k( h0 _ B │ │ │ spi.c' E2 x2 h a7 A0 z6 O │ │ │ dma.c │ │ │ fsmc_sram.c │ │ │ hw_config.c! F8 C3 ~% O2 Q$ [; r ~ │ │ │ stm32f10x_it.c │ │ │ main.c% h* z7 I$ X+ a- w9 h6 v, Z │ │ │ modbus.c │ │ └ ymodem.c/ B% Z8 o8 Y2 A4 P# z/ I r5 a │ │ │ └─MDK-ARM │ │ │ │ BootLoad_IAP.uvproj- R5 U5 t8 h9 W0 l& d, y3 b+ { │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */ │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */ │ │ │ │ │ ├─ROM /* Debug in Flash */ │ │ │9 r/ m3 ?1 J' S │ │ ├─rom_List" r8 X4 S* M: N R1 ?$ K │ │ │! E1 [5 Z. v# }$ a' P$ N │ │ └─rom_out4 c f& z W2 u │ │ │ └─RAM /* Debug in Ram */ │ │$ Y, k! d8 R2 v. T3 t3 q │ ├─ram_List" v h0 O Q1 W' M │ │ │ └─ram_out │ 0 V) l6 i3 u5 e- k" c/ x a ├─Libraries- S% I) z! Z% e( |/ H! [( |' P │ └─STM32F10x │ ├─CMSIS │ │ ├─Device │ │ │ └─ST9 {2 u& ?9 H! A. W │ │ │ └─STM32F10x │ │ │ ├─Include │ │ │ │ │ stm32f10x.h 4 i1 t& @- e4 h │ │ │ │ └ system_stm32f10x.h4 d. |5 f+ k. a) j5 I6 e │ │ │ └─Source │ │ │ └─Templates │ │ │ │ system_stm32f10x.c │ │ │ └─arm, K; L( W# }$ k: w! a; { │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include7 }) x7 i+ j7 n8 ^ │ │ └ core_cm3.h │ │ │ ├─STM32_USB-FS-Device_Driver │ │ │ : X3 R# i- p6 y k2 A6 ] │ │ ├─src9 L- X6 Z) ]2 Y! U: r' q# [ │ │ │ │ usb_core.c │ │ │ │ usb_init.c │ │ │ │ usb_int.c, p- C- L$ F X3 O( X" e- A │ │ │ │ usb_mem.c% e6 \$ f9 {0 O ~9 y9 h( ? │ │ │ │ usb_regs.c │ │ │ └ usb_sil.c │ │ │ 9 V4 P0 w% N, l │ │ └─inc& `. ^) W8 D! B& \( {$ x │ │ │ │ │ │ usb_core.h │ │ │ usb_def.h# j$ C3 O/ k- J0 G9 Z │ │ │ usb_init.h │ │ │ usb_int.h; K& V% P. v" f# B5 Z6 y. U8 { │ │ │ usb_lib.h │ │ │ usb_mem.h │ │ │ usb_regs.h0 M% d0 n4 v) [; k │ │ │ usb_sil.h │ │ └ usb_type.h │ │ │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */5 E2 p* |0 U. w) p │ │ 8 W# m8 P; E; y0 d │ ├─src │ │ │ misc.c │ │ │ stm32f10x_adc.c │ │ │ stm32f10x_bkp.c3 r( I) _6 r. o2 t │ │ │ stm32f10x_can.c! ~$ `4 Q+ o7 V. p3 e/ Q9 P │ │ │ stm32f10x_cec.c │ │ │ stm32f10x_crc.c │ │ │ stm32f10x_dac.c │ │ │ stm32f10x_dbgmcu.c: t0 [/ O' q7 t6 S9 ~* ?' d- q0 s │ │ │ stm32f10x_dma.c │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c& [6 I) o) H1 L% M2 k │ │ │ stm32f10x_fsmc.c: O8 p& ~7 z2 Y/ y │ │ │ stm32f10x_gpio.c │ │ │ stm32f10x_i2c.c$ c0 {% B0 g( _* Q │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c- l; n5 o7 h, z4 ~- t │ │ │ stm32f10x_rtc.c* `; h2 E% g& q0 I) Z% { │ │ │ stm32f10x_sdio.c │ │ │ stm32f10x_spi.c, s7 H' ?6 z8 T1 _' x. j' T& o │ │ │ stm32f10x_tim.c) |& R& V) z( X9 @9 x" ? │ │ │ stm32f10x_usart.c │ │ └ stm32f10x_wwdg.c │ └─inc │ │ misc.h$ }0 X8 }' B. j ^ │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h x1 l1 D( `% @, Y5 C! j │ │ stm32f10x_can.h │ │ stm32f10x_cec.h! w& X& }0 y8 m │ │ stm32f10x_crc.h/ d6 [) g' M8 J+ a* o: P │ │ stm32f10x_dac.h; ]4 M, S: t- Y2 r. S │ │ stm32f10x_dbgmcu.h │ │ stm32f10x_dma.h& i0 g4 `* o" c7 c3 L │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h) _! `- ~- T0 r$ S( ]6 h$ E$ q │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h │ │ stm32f10x_i2c.h) k% ?; Z, W7 N. p9 W0 c: i/ s9 } │ │ stm32f10x_iwdg.h2 P# x: T% ?2 t │ │ stm32f10x_pwr.h5 x9 E) x1 u- a! }' t6 u( C2 B9 G │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h6 l3 a$ f5 P0 j+ s5 {5 s │ │ stm32f10x_sdio.h │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h │ └ stm32f10x_wwdg.h2 h# P) Z9 i% q' M │ │ └ BootLoad说明.txt% u% G' J7 P! H$ \6 ~. C: J; F bootloader及256Kb的测试例程打包下载: |
基于STM32的自动跟踪小车
获取STM32代码运行时间的技巧
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。