产品STM32F207,外扩了512K的SRAM,地址为0x68000000开始。
分两个MDK工程,一个是主程序(平台) 一个是客户应用(应用)
主程序烧在Flash里,开机运行。
客户应用存在外扩flash中,MDK编译后生成bin文件。
主程序运行后,通过读取外扩flash中的bin文件,载入到外扩内存0x68000000中开始的地点。
然后调用函数开始运行。
现在一直没能把中断向量设置到外扩SRAM中。
主程序配置如下:
运行外部代码如下:
#define BASE_APP_ADDR ((unsigned int)(0x68000000)) //ÍⲿÀ©Õ¹»ùµØÖ·
#define BASE_APP_CODE_BEGIN BASE_APP_ADDR //Ó¦ÓóÌÐò´úÂë±£´æµØÖ·
#define BASE_APP_CODE_MSIZE ((unsigned int)(0x20000)) //Ó¦ÓóÌÐò×î´ó´úÂë´óС
#define BASE_APP_RUN_ADDR (BASE_APP_CODE_BEGIN+BASE_APP_CODE_MSIZE) //Ó¦ÓóÌÐòÔËÐеØÖ·¿Õ¼ä
#define BASE_APP_RUN_MSIZE ((unsigned int)(0x60000)) //Ó¦ÓóÌÐòÔËÐдúÂë¿Õ¼ä´óС
//½»»»Çø±£´æÔÚÄÚ²¿RAMÖУ¬10K´óСµÄ¿Õ¼äÓÃÀ´±£´æ½»»»µÄ±äÁ¿
#define SWAP_MEM_ADDR ((unsigned int)(0x20000000+0x1D800)) //½»»»ÇøÆðʼµØÖ·
#define SWAP_MSP SWAP_MEM_ADDR //MSP±£´æ4×Ö½Ú
//±£´æµ±Ç°¼Ä´æÆ÷Öµ
__asm SaveReg(void)
{
push {r0-r12};
push {r14};
bx lr;
}
void runapp(void)
{
void (*runbin)();
unsigned short buf;
int fd=-1;
int i=0;
long len=0;
//ÔØÈë³ÌÐò´úÂëµ½Ö¸¶¨ÄÚ´æ¿Õ¼ä
fd=fs_open("1.bin",O_RDWR);
if(fd== -1)
{
printf("Load 1.bin Error\r\n");
return;
}
len=fs_size(fd);
if(len==0)
{
fs_close(fd);
return;
}
i=0;
while(len>0)
{
fs_read(fd,(char *)&buf,2);
len-=2;
*(unsigned short *)((unsigned int)(BASE_APP_CODE_BEGIN+i))=buf;
i+=2;
}
fs_close(fd);
printf("run now\n");
//±£´æµ±Ç°¼Ä´æÆ÷
SaveReg();
//ÔËÐгÌÐò´úÂë
if(g_runappflag==0)
{
*((unsigned int *)(SWAP_MSP))=__get_MSP();
__disable_irq();//¹Ø±ÕÖжÏ
runbin=(void (*)()) (*(unsigned int *)((unsigned int)(BASE_APP_CODE_BEGIN+4)));
__set_MSP(*(volatile unsigned int *) BASE_APP_CODE_BEGIN);
runbin();
}
g_runappflag=1;
__enable_irq();
return;
}
客户程序如下
代码如下:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SysClk_Init
IMPORT __main
; LDR R0, =SysClk_Init
; BLX R0
LDR R0, =__main
BX R0
ENDP
int main(void)
{
unsigned int msp=0;
SCB->VTOR =0x68000000;
__enable_irq();//¿ªÖжÏ
//CMD
printf("APP CMD:f-Format d-Download r-Run 1.bin\r\n");
while(1)
{
if(g_key!=0){
printf("key=%08X\n",g_key);
*(unsigned int *)(SWAP_KEYCODER)=100;
if(g_key==0x10)
{
__disable_irq();
msp=*((unsigned int *)(SWAP_MSP));
__set_MSP(msp);
LoadReg();
return 0;
}
g_key=0;
}
if(rs232len>0)
{
printf("cmd:%c\r\n",rs232rec);
rs232len=0;
switch(rs232rec)
{
case 'b':
{
__disable_irq();
msp=*((unsigned int *)(SWAP_MSP));
__set_MSP(msp);
LoadReg();
return 0;
}
case 'e':
{
printf("e cmd\n");
break;
}
}
}
}
}
主程序运行外部程序的时候如果不重新设置中断向量,默认是使用主程序的中断函数,但共享的内存,用户程序没有办法读到正确的值。
如果应用程序重新设置中断向量,就会出错。不能运行。
不知道是不是我的中断向量表设置错误了。
谁有做过这样的案例,给个指导方向。
搞了好久没搞定。
|