咱们玩ARM9,一般都是在内存里调试程序,速度飞快。STM32下也能够这样,虽然现在的flash寿数现已很长了,但flash中调试烧录程序仍是一个很慢的进程,有时候程序上一个小小的改动要花上几倍的时刻下载代码,这确实是不能忍耐的。
咱们也能够在开发STM32时,在内存中调试程序。
{
STM32这颗Cortex-M3控制器,与其他许多ARM相同,供给了BOOT0和BOOT1两个管脚用于发动挑选。
BOOT1=x BOOT0=0 从用户闪存发动,这是正常的作业形式。
BOOT1=0 BOOT0=1 从体系存储器发动,这种形式发动的程序功用由厂家设置。(用于串口ISP)
BOOT1=1 BOOT0=1 从内置SRAM发动,这种形式能够用于调试。
在芯片上电复位时,BOOT0和BOOT1两个管脚的状况将决议芯片从何处发动。
1.当BOOT0和BOOT1均设置为逻辑1时,体系将从内置SRAM中发动,这是代码内存调试的第一个条件。
}
经屡次承认,BOOT0和BOOT1状况与内存中调试无直接联络
2.然后,咱们需要在代码中设置正确的中断向量表方位。中断向量表通常被放置在用户程序的开端,所以flash中运转时,向量表坐落0x08000000处,而当代码被放置在SRAM中运转时,他的方位就成了0x20000000。在初始化NVIC时,咱们能够放置如下代码,界说向量表的方位
NVIC_SetVectorTable(0x20000000 , 0x0);
或
NVIC_SetVectorTable(0x08000000 , 0x0);
3. 在编译器中,要进行正确的设置。这儿以IAR 5.4为例阐明。
3.1. 工程选项中Linker项,Config选项卡中,指定Linker Configuration File为stm32f10x_ram.icf, 该文件在FWLIB安装包中能够获得,IAR4和5分别有不同的配置文件。
3.2. 同样是工程选项中Debug项,Download选项卡中,去掉一切钩子,不下载代码到flash
通过以上过程,代码就能够在内存中调试,下载速度飞快,调试速度也比flash中快了不少!
IAP在线晋级
1.boot程序
(1)IROM1 开端地址:0x8000000
(2)要害代码
#define ApplicationAddress0x8003000
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user applications Stack Pointer */
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
1,JumpAddress=*(vu32*)(ApplicationAddress+4);是把用户代码的复位地址赋值给JumpAddress。
2,__MSR_MSP(*(vu32*)ApplicationAddress);是把用户代码的仓库地址写入仓库指针
3,Jump_To_Application()是把用户代码的复位地址交给PC指针
if(((*(vu32*)ApplicationAddress)&0x2FFE0000)==0x20000000)
这句话的意思是把用户代码的首地址里边的数据拿出来,看看是不是以0x20000000最初。
(X & 0x2FFE0000 ) == 0x20000000 意思是说X是不是在0x20000000与0x2001FFFF之间,即栈顶是不是在以0x20000000开端的128K
前面说了用户代码的首地址放的是仓库指针,而仓库应该指向RAM,而RAM的首地址是0x20000000,所以这句话用来判别是不是现已有一个正确的仓库指针地址写在了用户代码的首地址,进一步能够估测是不是有一个正确的用户代码写在了用户代码区,假如现已写入了,就能够跳过去运转,假如没有写入,就不跳过去。这是DEMO程序的判别逻辑,能够这样用,也能够不这样用。
2.APP程序
(1)IROM1 开端地址:0x8003000
(2)要害代码
#define VECT_TAB_OFFSET 0x3000 (修正当地) //NVIC_SetVectorTable(NV%&&&&&%_VectTab_FLASH, 0x3000); //中断向量表映射