一、BootLoader程序使用说明: 1 BootLoader程序占用11K空间,BootLoader预留空间(0x08000000-0x08004000)。 用户程序需要设置在0x08004000以后,也可使用分散加载的方法设置用户程序。 建议用ISP方式并添加写保护,防止BootLoader程序丢失,本BootLoader采用 一边读一边写的方法,不受内存大小限制。 2 先打开超级终端,设置好波特率,8位数据位,1位停止位,无校验,无流控 打开需要升级的程序文件,点击发送。RS485方式通讯一般设置波特率为 230400bps,TTL通讯则可设为921600bps。 3 给下位机上电,在上电500毫秒内,无通讯则跳转至用户程序。若下位机发送 大写'C',发现超级终端有文件发过来,则下位机的BootLoad程序以Y_Modem协议 接收升级程序文件,并将文件内容写入APP程序区,然后跳转至APP程序运行。 4 升级程序时,黄色LED灯闪烁,运行APP程序时,绿灯闪烁。BootLoad程序和APP程序都 开启了看门狗,若有故障,自动复位,红灯一闪而过。 5 跳转至APP程序前,需要关闭所有用到的中断,切记。 6 LED指示灯相关的IO脚没有初始化。 建议产品设计者添加状态LED指示灯:黄灯闪烁表示程序正在升级中, 绿灯闪烁表示正常工作中(LED指示灯在循环中闪烁,如果不闪烁表明死机), 红灯亮表示进入硬件意外挂起函数(如果有看门狗则会复位,否则不掉电一直死机)。 7 用户程序的中断向量偏移设置如下: NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); ; APP程序分散加载的例子 ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08010000 0x00040000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) } ;EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data ; main.o (exsram) ; exsram 内存段名称 ;} } 二、工程说明 本工程是为实现RS485及CAN的IAP而设计的BootLoad程序,附带了以下几种固件库的 应用代码: RS485,CAN,FSMC,SPI,TIM,AD Project Targets 设置说明 1.Debug in Ram 在内存中运行和调试程序,避免Flash的反复擦除和写入,减少芯片寿命 在Option for 'Debug in Ram'\C/C++\Preprocessor Symbols\Defin 编辑框 增加VECT_TAB_RAM宏定义, nvic.c的NVIC_Configuration函数中增加如下代码 #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif 这样就把中断向量地址转移到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以后, 程序空间在前, 数据空间在后 IRAM_EXSRAM.sct 分散加载文件: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x20000000 0x0000A000 { ; load region size_region ER_IROM1 0x20000000 0x0000A000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x2000A000 0x00010000 { ; RW data .ANY (+RW +ZI) } RW_RAM1 0x68000000 0x00020000 { ; RW data .ANY (EX_SRAM) ; EX_SRAM 是声明的内存段名称 } } RAM.ini 程序放在内部SRAM中进行硬件仿真的初始化文件: SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register 2.Debug in Flash 在Flash中运行和调试程序,需要对Flash的反复擦除和写入 FLASH_EXSRAM.sct 分散加载文件: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) } EX_SRAM_DATA 0x68000000 UNINIT 0x00020000 { ; RW data main.o (exsram) ; exsram 内存段名称 } } 注意: exsram全局变量只能在main.c或 main.h中定义,UNINIT表示不初始化 SIM_MAP.ini 软件仿真的初始化命令,将区域(0x68000000,0x68020000)设为可读可写: map 0x68000000,0x68020000 read write exec 三、源代码组织架构 文件夹名称: STM32F10x_BootLoad_IAP 固件库版本: V3.6.1 文件目录结构: STM32F10x_BootLoad_IAP │ ├─Project │ │ │ ├─inc │ │ │ │ │ │ main.h │ │ │ hw_config.h │ │ │ fsmc_sram.h │ │ └ stm32f10x_conf.h │ │ │ ├─src │ │ │ │ │ │ iwdg.c │ │ │ rcc.c │ │ │ gpio.c │ │ │ nvic.c │ │ │ tim.c │ │ │ adc.c │ │ │ usart.c │ │ │ can.c │ │ │ spi.c │ │ │ dma.c │ │ │ fsmc_sram.c │ │ │ hw_config.c │ │ │ stm32f10x_it.c │ │ │ main.c │ │ │ modbus.c │ │ └ ymodem.c │ │ │ └─MDK-ARM │ │ │ │ BootLoad_IAP.uvproj │ │ FLASH_EXSRAM.sct /* Flash调试,分散加载文件 */ │ │ IRAM_EXSRAM.sct /* IRAM调试,分散加载文件 */ │ │ RAM.ini /* IRAM调试初始化文件 */ │ │ SIM_MAP.ini /* 软件仿真初始化文件 */ │ │ │ │ │ ├─ROM /* Debug in Flash */ │ │ │ │ │ ├─rom_List │ │ │ │ │ └─rom_out │ │ │ └─RAM /* Debug in Ram */ │ │ │ ├─ram_List │ │ │ └─ram_out │ ├─Libraries │ └─STM32F10x │ ├─CMSIS │ │ ├─Device │ │ │ └─ST │ │ │ └─STM32F10x │ │ │ ├─Include │ │ │ │ │ stm32f10x.h │ │ │ │ └ system_stm32f10x.h │ │ │ └─Source │ │ │ └─Templates │ │ │ │ system_stm32f10x.c │ │ │ └─arm │ │ │ └ startup_stm32f10x_hd.s │ │ └─Include │ │ └ core_cm3.h │ │ │ ├─STM32_USB-FS-Device_Driver │ │ │ │ │ ├─src │ │ │ │ usb_core.c │ │ │ │ usb_init.c │ │ │ │ usb_int.c │ │ │ │ usb_mem.c │ │ │ │ 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.h │ │ │ usb_sil.h │ │ └ usb_type.h │ │ │ └─STM32F10x_StdPeriph_Driver /* StdPeriph_Driver */ │ │ │ ├─src │ │ │ misc.c │ │ │ stm32f10x_adc.c │ │ │ stm32f10x_bkp.c │ │ │ stm32f10x_can.c │ │ │ stm32f10x_cec.c │ │ │ stm32f10x_crc.c │ │ │ stm32f10x_dac.c │ │ │ stm32f10x_dbgmcu.c │ │ │ stm32f10x_dma.c │ │ │ stm32f10x_exti.c │ │ │ stm32f10x_flash.c │ │ │ stm32f10x_fsmc.c │ │ │ stm32f10x_gpio.c │ │ │ stm32f10x_i2c.c │ │ │ stm32f10x_iwdg.c │ │ │ stm32f10x_pwr.c │ │ │ stm32f10x_rcc.c │ │ │ stm32f10x_rtc.c │ │ │ stm32f10x_sdio.c │ │ │ stm32f10x_spi.c │ │ │ stm32f10x_tim.c │ │ │ stm32f10x_usart.c │ │ └ stm32f10x_wwdg.c │ └─inc │ │ misc.h │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h │ │ stm32f10x_can.h │ │ stm32f10x_cec.h │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h │ │ stm32f10x_dma.h │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h │ │ stm32f10x_pwr.h │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h │ │ stm32f10x_sdio.h │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h │ └ stm32f10x_wwdg.h │ │ └ BootLoad说明.txt bootloader及256Kb的测试例程打包下载: |
USB4 产品设计将会令 USB4 取得成功
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
小缓存实现大效果:X-NUCLEO-GFX01M1 和 TouchGFX 4.15让你的产品...
STM32H7各产品应用定位
单片机是控制电子产品的大脑
为什么自己设计的嵌入式系统稳定性远不如工业级产品?
PCB之间的互连是产品EMC的最薄弱环节
嵌入式产品的开发过程中的各个阶段
为大家设计出高效美观的PCB产品提供一些帮助
紧抓医疗电子机遇,意法半导体STM32/MEMS产品如何布局?
RE:【原创】【MCU实战经验】+ 可在产品中使用的bootloader程序及测试例程打包上传。