有部分中断在flash里面不起作用,在ram就可以

发布: 2009-5-21 09:36 | 作者: anson | 来源: StmFans思蜕盟 OPELC 自由电子联盟

程序是:TIM1 溢出中断+串口1+跑马灯,如果在ram里面仿真,三个功能都可以实现,如果在flash里面仿真,定时器不能工作,复位后,也只是串口和跑马灯在工作

nvic 里面有flash的条件编译的
zhengrob (2009-5-21 12:10:31)
被同样的问题困扰。我用中断实现USART1收发,用RAM仿真收发都正常。可是在FLASH里只能发不能收,收是通过中断实现的。

我也查了条件编译的设置,没找到问题呀。还有那位DX遇到了同样情形,交流一下。
Dylan123 (2009-5-21 14:24:21)
IAR or MDK ???
我用MDK调Systick时 在ram里跑就卡中断     flash里就可以。
littleworm (2009-5-21 14:36:09)
这个现象还真怪异
是不是大伙都喜欢裸奔啊

我用库函数
一直感觉还是比较稳定的啊~~~
jasonjee (2009-5-21 15:16:13)
这毛病是不是和FLASH的延时设置有关?
zhengrob (2009-5-21 15:20:56)
回 littleworm

我的串口通讯程序就是你的教程里的 WORM_UART_INT.rar (IAR442)那个。我可一句都没改过呀。只不过我用的万利199板子。在ram里收发都OK,在flash里就不能收了。 在中断里设断点,可是根本就进不了中断。
anson (2009-5-21 17:14:19)
我的是IAR,希望大家讨论下是什么问题,我就卡在这里了
armcu (2009-5-22 00:05:02)
VECT_TAB_FLASH
littleworm (2009-5-22 09:24:56)

QUOTE:

VECT_TAB_FLASH
armcu 发表于 2009-5-22 00:05
嗯 很有可能
试一下~~·
anson (2009-5-22 09:29:38)

QUOTE:

嗯 很有可能
试一下~~·
littleworm 发表于 2009-5-22 09:24
试过了,我一开始就注意这个问题,是中断向量表的存放位置,改成flash都不行
Dylan123 (2009-5-22 21:07:15)
这个是要在define里改的。。。。。。。。。具体怎么改我也不知道
只是有个印象。。。

小声问一下 littleworm  什么叫 库函数???
zhengrob (2009-5-23 16:17:43)
用中断的USART1收发(IAR442+万利199板运行littleworm的 WORM_UART_INT.rar),在Flash里中断不能运行的问题有进展。
在 main.c中,中断向量表设置函数为:-

void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

#ifdef  VECT_TAB_RAM
   
   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  
   
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif

  。。。。
}
现改为:-
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

//#ifdef  VECT_TAB_RAM
   
//   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
//#else  
   
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
//#endif
... ...
}

编译后无论是在flash里仿真还是在板直接运行,串口都能正常工作。也就是说,中断工作正常。看来问题确是出在flash中断向量表的配置上。但令人困惑的是为什么 #ifdef  VECT_TAB_RAM ... ... #else ... 语句不能正确判断指向呢?
catwill (2009-5-23 16:41:30)
楼上的同学,把定义VECT_TAB_RAM改成
VECT_TAB_FLASH即可
注意有可能是编译器设置中定义的……
具体和你用的环境有关
catwill (2009-5-23 16:41:48)
也有可能是在某文件中定义的~
zhengrob (2009-5-23 18:32:29)
终于搞清楚了。也谢谢Catwill。

在Project -> Options -> C/C++ Compiler -> Preprocessor 里的 Defined Symbols 栏中,定义了VECT_TAB_RAM。 这样就只能在ram里运行了。

把这个定义删掉后,编译环境才会按照在Linker -> Config 和debug -> Download 里的设置来选择在ram或Flash里运行。

希望对其他刚入手的同学有帮助。
littleworm (2009-5-23 18:44:59)
额 呵呵
VECT_TAB_RAM 这个东西我是在工程配置里面设置了的
原来楼主用我的那个程序
换成flash跑的时候没有修改过来~~

呵呵 搞定了就好
zhengrob (2009-5-23 18:49:36)
上面表述的不准确.
应该是:-
如果想在ram里运行,在Project -> Options -> C/C++ Compiler -> Preprocessor 里的 Defined Symbols 栏中,定义VECT_TAB_RAM。
如果想在flash里运行,在Project -> Options -> C/C++ Compiler -> Preprocessor 里的 Defined Symbols 栏中,定义了VECT_TAB_FLASH。

这样应该就没有问题了。
binglin (2009-5-24 00:46:50)
楼上正解,其实坛子上以前就讨论过几次这个问题了。
binglin (2009-5-24 00:47:33)
这个问题,本质上就是中断向量表的位置配置问题。
guoyin (2009-5-28 20:51:28)
呵呵,长见识了!谢谢了!