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

[复制链接]
1879|2
 楼主| fanr520 发表于 2014-9-18 10:43 | 显示全部楼层 |阅读模式
产品STM32F207,外扩了512K的SRAM,地址为0x68000000开始。
分两个MDK工程,一个是主程序(平台) 一个是客户应用(应用)
主程序烧在Flash里,开机运行。
客户应用存在外扩flash中,MDK编译后生成bin文件。
主程序运行后,通过读取外扩flash中的bin文件,载入到外扩内存0x68000000中开始的地点。
然后调用函数开始运行。
现在一直没能把中断向量设置到外扩SRAM中。

主程序配置如下:
1.png
运行外部代码如下:
  1. #define BASE_APP_ADDR   ((unsigned int)(0x68000000))   //ÍⲿÀ©Õ¹»ùµØÖ·
  2. #define BASE_APP_CODE_BEGIN   BASE_APP_ADDR  //Ó¦ÓóÌÐò´úÂë±£´æµØÖ·
  3. #define BASE_APP_CODE_MSIZE   ((unsigned int)(0x20000))  //Ó¦ÓóÌÐò×î´ó´úÂë´óС
  4. #define BASE_APP_RUN_ADDR  (BASE_APP_CODE_BEGIN+BASE_APP_CODE_MSIZE)  //Ó¦ÓóÌÐòÔËÐеØÖ·¿Õ¼ä
  5. #define BASE_APP_RUN_MSIZE   ((unsigned int)(0x60000))  //Ó¦ÓóÌÐòÔËÐдúÂë¿Õ¼ä´óС

  6. //½»»»Çø±£´æÔÚÄÚ²¿RAMÖУ¬10K´óСµÄ¿Õ¼äÓÃÀ´±£´æ½»»»µÄ±äÁ¿
  7. #define SWAP_MEM_ADDR  ((unsigned int)(0x20000000+0x1D800)) //½»»»ÇøÆðʼµØÖ·
  8. #define SWAP_MSP        SWAP_MEM_ADDR   //MSP±£´æ4×Ö½Ú

  1. //±£´æµ±Ç°¼Ä´æÆ÷Öµ
  2. __asm SaveReg(void)
  3. {       
  4.         push {r0-r12};
  5.         push {r14};
  6.         bx lr;
  7. }

  8. void runapp(void)
  9. {
  10.         void (*runbin)();
  11.         unsigned short buf;
  12.         int fd=-1;
  13.         int i=0;
  14.         long len=0;
  15.         //ÔØÈë³ÌÐò´úÂëµ½Ö¸¶¨ÄÚ´æ¿Õ¼ä
  16.         fd=fs_open("1.bin",O_RDWR);
  17.         if(fd== -1)
  18.         {
  19.                 printf("Load 1.bin Error\r\n");
  20.                 return;
  21.         }
  22.         len=fs_size(fd);
  23.         if(len==0)
  24.         {
  25.                 fs_close(fd);
  26.                 return;
  27.         }
  28.         i=0;
  29.         while(len>0)
  30.         {
  31.                 fs_read(fd,(char *)&buf,2);
  32.                 len-=2;
  33.                 *(unsigned short *)((unsigned int)(BASE_APP_CODE_BEGIN+i))=buf;
  34.                 i+=2;
  35.         }
  36.         fs_close(fd);
  37.         printf("run now\n");
  38.         //±£´æµ±Ç°¼Ä´æÆ÷
  39.         SaveReg();
  40.         //ÔËÐгÌÐò´úÂë
  41.         if(g_runappflag==0)
  42.         {
  43.                 *((unsigned int *)(SWAP_MSP))=__get_MSP();
  44.                 __disable_irq();//¹Ø±ÕÖжÏ
  45.                 runbin=(void (*)()) (*(unsigned int *)((unsigned int)(BASE_APP_CODE_BEGIN+4)));       
  46.                 __set_MSP(*(volatile unsigned int *) BASE_APP_CODE_BEGIN);
  47.                 runbin();                       
  48.         }
  49.         g_runappflag=1;
  50.         __enable_irq();       
  51.         return;       
  52. }
客户程序如下
2.png
代码如下:
  1. ; Reset handler
  2. Reset_Handler    PROC
  3.                  EXPORT  Reset_Handler             [WEAK]
  4.         IMPORT  SysClk_Init
  5.         IMPORT  __main
  6. ;                 LDR     R0, =SysClk_Init
  7. ;                 BLX     R0
  8.                  LDR     R0, =__main
  9.                  BX      R0
  10.                  ENDP
  1. int main(void)
  2. {
  3.         unsigned int msp=0;       
  4.         SCB->VTOR =0x68000000;
  5.         __enable_irq();//¿ªÖжÏ
  6.         //CMD
  7.         printf("APP CMD:f-Format d-Download r-Run 1.bin\r\n");
  8.         while(1)
  9.         {
  10.                
  11.                 if(g_key!=0){
  12.                         printf("key=%08X\n",g_key);
  13.                         *(unsigned int *)(SWAP_KEYCODER)=100;
  14.                         if(g_key==0x10)
  15.                         {
  16.                                         __disable_irq();
  17.                                         msp=*((unsigned int *)(SWAP_MSP));       
  18.                                         __set_MSP(msp);
  19.                                         LoadReg();       
  20.                                         return 0;                                               
  21.                         }
  22.                 g_key=0;
  23.         }
  24.                 if(rs232len>0)
  25.                 {       
  26.                         printf("cmd:%c\r\n",rs232rec);                       
  27.                         rs232len=0;
  28.                         switch(rs232rec)
  29.                         {       
  30.                                 case 'b':
  31.                                 {
  32.                                         __disable_irq();
  33.                                         msp=*((unsigned int *)(SWAP_MSP));       
  34.                                         __set_MSP(msp);
  35.                                         LoadReg();       
  36.                                         return 0;                                       
  37.                                 }
  38.                                 case 'e':
  39.                                 {               
  40.                                         printf("e cmd\n");
  41.                                         break;
  42.                                 }
  43.                         }
  44.                 }
  45.         }

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

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


香水城 发表于 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

粉丝
快速回复 在线客服 返回列表 返回顶部