1 BOOT模式
-
在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。
-
从待机模式退出时,BOOT引脚的值将被被重新锁存;因此,在待机模式下BOOT引脚应保持为需要的启动配置。
STM32F103RC芯片内存映射如下:
-
内部Flash启动(
boot0 = 0 & boot1 = x
):内核从0x08000000)
和0x08000004)
分别获取SP初值、复位向量地址。Flash编程一次可以写入16位(半字)。 -
内部SRAM启动(
boot0 = 1 & boot1 = 1
):只能在0x20000000
开始的地址区访问SRAM,内核从0x20000000)
和0x20000004)
分别获取SP初值、复位向量地址。支持字节、半字(16位)或全字(32位)访问 -
系统存储器启动(
boot0 = 1 & boot1 = 0
):内核从0x1FFF0000
和0x1FFF0004
分别获取SP初值、复位向量地址。该存储区ST公司内嵌了一段BootLoader程序,为ISP(In System Program)
提供支持:- 对于小容量、中容量和大容量的产品:通过USART1接口启用自举程序。(串口烧录hex文件)
- 对于互联型产品:通过USART1/2、CAN2或USB OTG全速接口的设备模式
2 ISP一键下载电路分析
BOOT1必须处于低电平,同时需要上位机(如FlyMCU,它是mcuisp最新版本)辅助控制RTS和DTR电平状态。
S8550-PNP箭头向里:当Ve - Vb > 0.7v (0.5),e和c导通。
S8050-NPN箭头向外:当Vb - Ve > 0.7v (0.5),e和c导通。
即用be控制ce,be导通看箭头方向
DTR->1,RTS->0
,Q2&3导通,RESET->0,BOOT0->1
(IN4148二极管防止电路倒灌IO口),切换到系统存储器启动模式,进入BootLoader引导下载程序。DTR->0,RTS->1
,Q2&3截止,RESET->1,BOOT0->0
,切换到内部Flash启动模式,复位后启动运行程序。
3 在SRAM中调试代码
STM32内部Flash最大可擦除10000
次,一般程序都会烧录到其中进行调试,但若超过最大擦除次数,flash会损坏。因此对于体积较小的代码可以烧录到内部SRAM中调试,但是需要一直带电调试,因为RAM断电即丢失数据。
-
BOOT0->1 BOOT1->1
-
设置一个RAM调试工程
- 修改sct文件,把程序分配到片内SRAM
LR_IROM1 0x20000000 0x00010000 { ; load region size_region
RO_IRAM 0x20000000 0x00008000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM 0x20008000 0x00008000 { ; RW data
.ANY (+RW +ZI)
}
}
- 修改下载配置,把程序下载到SRAM
修改下载器烧录算法和程序的存储地址和空间,下载器烧录算法起始地址必须大于代码段结束地址(可通过MAP文件查看)。
每次点击debug都会重新下载axf到RAM
- 修改中断向量表基地址
使能SystemInit()
的VECT_TAB_SRAM
宏,可在C/C++配置全局定义
#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */
#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
- 修改调试器配置,初始化SP和PC指针(仅STM32F1需要配置,F4不需要,按上面步骤配置点击下载即可)
Debug_RAM.ini
配置文件参考keil_v5/ARM/Pack/Keil/STM32F1xx_DFP/
:
FUNC void Setup (void) {
SP = _RDWORD(0x20000000); // 设置栈指针SP,把0x20000000地址中的内容赋值到SP。
PC = _RDWORD(0x20000004); // 设置程序指针PC,把0x20000004地址中的内容赋值到PC。
// _WDWORD(0xE000ED08, 0x20000000); // 设置向量表偏移寄存器 (这里可以不设置, SystemInit中配置了该寄存器)
}
LOAD %L INCREMENTAL // 下载axf文件到RAM
Setup(); //调用上面定义的setup函数设置运行环境
//g, main //跳转到main函数
因为Cortex-M3/4复位时会从0x00000000
和0x00000004
的相对位置取出MSP初值以及将复位向量地址赋给PC,在SRAM中的绝对位置就是0x20000000
和0x20000004
。STM32F1系列貌似从SRAM启动复位时,不会自动取出这两个值,因此无法正常运行。
因此,需要点击debug引导.ini
中的文件来初始化pc和sp指针,同时调试时不能点RST,必须退出重新进入debug以复位,同时也不能硬件复位。
此外,如果还有问题可以试试keilkill.bat
清除工程再重新编译试试。
END