打印
[STM32F2]

STM32F207外扩内存中断向量设置问题

[复制链接]
1408|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fanr520|  楼主 | 2014-9-18 10:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
产品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;
                                }
                        }
                }
        }

}
主程序运行外部程序的时候如果不重新设置中断向量,默认是使用主程序的中断函数,但共享的内存,用户程序没有办法读到正确的值。
如果应用程序重新设置中断向量,就会出错。不能运行。
不知道是不是我的中断向量表设置错误了。

谁有做过这样的案例,给个指导方向。
搞了好久没搞定。


沙发
香水城| | 2014-9-19 14:38 | 只看该作者
中断向量不能放置到(映射到)外部memory区域的地址空间,即这里的0x6800 0000开始的区域。

只能放在片上的SRAM(0x2000 0000)和片上flash(0x0800 0000)开始的区域内某个地方,由offset寄存器指定。

使用特权

评论回复
板凳
香水城| | 2014-9-19 14:39 | 只看该作者
当然,程序和代码是可以放在外部memory的。

中断向量的放置限制是有Cortex-M3内核规定的,这也是出于安全方面的考虑。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝