1. 前言
在stm32新建工程(参照stm32栏目的stm32新建工程)后,需要下载写好的程序运行。 有两种方式验证你程序的正确性,一种是直接下载到flash中,一种是在sram中跑。程序在sram中运行掉电会消失,不过避免了每次擦写flash,毕竟flash的擦写次数是有限的,在sram中验证程序没有问题后,可以再烧录在flash中。
烧录工具:st-link
2. 程序下载到flash中
在编译完程序后,在烧录程序前需要进行一些设置。首先连接上st-link。然后进行下面的步骤。 1)点击界面魔法棒 2)勾选ROM/RAM空间(一般都默认勾选) 3)选择调试器。这里选择st-link。勾选启动时加载应用程序和自动进入main函数。 4)设置st-link debugger settings。port选择SW,选择调试速率。设置flash擦除扇区,添加flash。
5)选择下面两项 6)下载程序,点击load按钮。
3. 程序在sram中运行
由于flash的擦除次数有限,而手上的开发板又是一代代传承下来的,为避免啥也没学会,stm32就报废了,想掌握一种在线编程的方法,即将程序不烧录进flash,而是放在sram中运行。 1)给sram分区 M4处理器的flash初始地址为0x80000000,而sram起始地址为0x20000000。首先将sram空间均分,一部分为构造的rom,一部分为ram。注意rom的地址是紧跟着rom的。这里构造的目的是假装从rom启动,这样不需要在硬件上变更boot0、boot1的值,这个我验证了不变更硬件,即不需要boot0/1选择1,1进入sram启动,只维持0、0,也可工作。 2)增加sram向量表 对应的要在main函数中加 NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);,这样才能找到sram的入口地址。否则入口地址总是在0x00000000(当代码有警告如语法错误时,也是显示0). 3)增加初始化文件 增加ini同时,load application at startup注意也不要勾选,否则先从flash启动。这一步很重要。
增加的ini文档,在安装包里,一定要增加ini,否则还是在flash地址跑。
地址:PACK\Keil\STM32F4xx_DFP\2.15.0\MDK\Boards\ST\32F469IDISCOVERY\Blinky\Debug_RAM.ini 文档的内容如下: FUNC void Setup (void) { SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter XPSR = 0x01000000; // Set Thumb bit _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register }
LOAD %L INCREMENTAL // Download to RAM Setup();
g, main 有看到说需要把LOAD %L INCREMENTAL 的%L改为 …\obj\template20211206.axf ,即改为输出执行文件所在的地址。我调试了两种,发现没必要,用官方的就好,不过要注意SP/PC的地址是不是sram的地址。 4)选择不擦除flash,因为现在是在sram空间里 5)不要勾选update target before debugging,意思是在线调试时,不下载到flash中,否则在进入debug时,会显示flash download失败。这个很重要。 6)最后就进入sram运行了。 先选stop/start debug,即右上角图标,再选左上角图标run,就可进入sram中运行程序了,然后再退出debug的界面,跑的程序依旧是sram的程序。当然重新上电后还是原来flash里的程序,在sram中验证程序的目标达到了,完美。
参考文献
《STM32F4开发指南-库函数版本-V1.2》
|