【NUCLEO-L476RG开发】在RAM中进行Debug
前几天在社区QQ群里有个小伙伴在找使用RAM进行debug的设置,论坛有很多这样的例子和教程,我写了个demo在NUCLEO-L476RG上测试下,给需要的同学。之所以要选择在ram中调试,很重要的原因是考虑到Flash的寿命问题,因为每次下载程序都要进行Flash的擦除,如果次数多了可能会导致Flash有问题,但是MCU内的Flash的擦写次数普遍可以达到上万次,所以说几乎不可能因为调试程序次数太多把Flash搞坏掉,如果真能把Flash擦除坏,那肯定能成为高手了。 L476RG内部有2个SRAM,一个是SARM1,我们用作flash,一个是SRAM2,我们用作sarm。根据上面的内存分配,相应的keil的设置如下:
然后从keil的安装目录下复制Dbg_RAM.ini文件用于初始化调试信息及设置中断向量表,内容如下:
/*----------------------------------------------------------------------------
Setup()configure PC & SP for RAM Debug
*----------------------------------------------------------------------------*/
FUNC void Setup (void) {
SP = _RDWORD(0x20000000); // Setup Stack Pointer
PC = _RDWORD(0x20000004); // Setup Program Counter
_WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register
}
LOAD %L INCREMENTAL // load the application
Setup(); // Setup for Running
g, main
上面的LOAD %L INCREMENTAL的用作 linker output file 来debug当前工程,具体可参考:load 命令用法
因为上面的设置我们要去掉Load Application at Startup并选中该初始化文件Dbg_RAM.ini,设置如下:
设置下载的debug模式:
编译后直接点debug后全速运行就可以了,led闪烁串口输出信息,如果这个时候退出debug模式,程序会继续运行,但是复位后RAM内容就会清除程序不再存在,可以预先清除FLASH内容用于观察现象。因为RAM大小的限制,这个方法也只仅限于比较小的程序。
main如下:
//creep
//2015-11-09
int main(void)
{
uint8_t sta = ON;
HAL_Init();
SystemClock_Config();
USART2_Init();
LED_Init();
while(1)
{
LED(sta);
sta = !sta;
HAL_Delay(500);
printf("Hi,I am creep!!\r\n");
}
}
测试demo:
高手啊,顶一个 研究的比较细。 yanhaijian 发表于 2015-11-10 08:39
研究的比较细。
这都是别人玩剩下的:) creep 发表于 2015-11-10 08:47
这都是别人玩剩下的
我知道,这个论坛毕竟新手很多,能研究到这个地步的人论坛里面不多。 感谢橙子分享,嘿嘿,原来那个ini文件可以在keil里面找到,,,我都是在网上找了一个一直用 风子 发表于 2015-11-10 09:00
感谢橙子分享,嘿嘿,原来那个ini文件可以在keil里面找到,,,我都是在网上找了一个一直用 ...
keil自己提供的一些程序比ST的好用多了,虽然不怎么开源,但是稳定性很好! 看看,,,,,,,,,,,,,, 橙子大神 安臣 发表于 2015-11-10 11:31
橙子大神
整的都不好意思了,安臣大哥!!:lol