打印
[开发工具]

关于IAR4.42和STM32疑难杂症(已解决.使用IAR5.30)

[复制链接]
6404|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Swd21ic|  楼主 | 2009-2-13 19:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请各位大虾诊断!
开发平台 (IAR4.42(带补丁)+ JLINK + STM32 + uCOS-II v2.86)
写的源代码在自己的PC上运行很正常, 但把整个工程到其他两个同事的PC上都出现了同一个问题!

系统中有一个TIM6的定时中断,在其他两个同事的机器上用IAR debug时,如果芯片FLASH是空的,那么第1次下载后Debug是没有任何问题的. 但如果不擦除全片再次直接Debug时, 会一直陷入到TIM6的中断死循环中,即中断退出后马上又进入该中断(类似于中断位没有清除).

通过验证,我发现该问题只是在IAR Debug时才会出现, 如果板卡断电后,再上电让它自己跑.不会进入那个中断死循环.也就是说.同样烧进去的程序,在调试时就不正常.

另外我发现在我的电脑上,调试时,我直接用IAR RESET板卡,NVIC所有寄存器都可以清0x00000000.但在其他两个同事的电脑上,用IAR RESET, NVIC中TIM6的SETPEND和CLRPEND位一直为1.其他位可以正常清0.

现象就这么多.请大家给个注意阿,谢谢
沙发
Swd21ic|  楼主 | 2009-2-14 21:48 | 只看该作者

33人已阅

没人给点意见吗?

使用特权

评论回复
板凳
ijk| | 2009-2-14 21:55 | 只看该作者

没人给点意见

  没人给点意见?确实不大好判断,真是疑难杂症。

使用特权

评论回复
地板
香水城| | 2009-2-14 21:57 | 只看该作者

确实是疑难杂症

请尝试降低J-Link的传输速度试试。

使用特权

评论回复
5
winloop| | 2009-2-16 09:17 | 只看该作者

IAR 4.42A有补丁了?

使用特权

评论回复
6
wlq_9| | 2009-2-16 09:54 | 只看该作者

怀疑

是LZ程序健状性不够.
建议LZ看一下你的初始化程序.这种情况并非STM32独有,以前在ADS和ARM7下,偶也出现过,最终多半是程序问题,尤其是初始化那一块.

使用特权

评论回复
7
wlq_9| | 2009-2-16 09:56 | 只看该作者

还有就是保证你的

下载和芯片复位没问题.

使用特权

评论回复
8
Swd21ic|  楼主 | 2009-2-17 08:42 | 只看该作者

wlq_9说的非常有道理.

我也怀疑是程序NVIC和定时器初始化的问题..

今天我重新装了4.42,又从SEGGER下载了最新的PC驱动V4.02.
结果出现了和其他同事一样的现象.第2次仿真片子就重复进中断. 现在我用软RST也不能把SETPEND和CLRPEND清0了..(原来可以).

出问题的地方也被我找到了.在定时器6的初始化时好像仿真会出现问题..

原来的做法是:
语句1:调用函数.设置和使能NVIC中TIM6的优先级和中断位
语句2: 调用函数.初始化TIM6.打开Update中断,最后使能定时器开始记时.

现在将两个顺序对调一下.就不会出现重复进中断的问题了.(但RST仍不能清0所有NVIC寄存器)
语句1: 调用函数.初始化TIM6.打开Update中断,最后使能定时器开始记时.
语句2:调用函数.设置和使能NVIC中TIM6的优先级和中断位

虽然地方找到了.但我觉得病根还未除.. 因为在我看来这两个谁前谁后都没关系.而且在例程中.往往是先初始化NVIC.   并且即使在原来调试不成功的情况下直接跑程序又可以跑.. 应该跟IAR支持STM32的debug有关..

So..我决定投奔IAR5.30了.. 各位大虾认为呢..



使用特权

评论回复
9
香水城| | 2009-2-17 08:58 | 只看该作者

调试软件不能产生硬件复位信号,必须使用手动按动复位按

这个问题几乎是所有调试器的毛病。

使用特权

评论回复
10
wlq_9| | 2009-2-17 09:43 | 只看该作者

香版说的很对

因为仿真器没有硬件复位ARM,所以导致ARM的外设一直在运行,而此时ARM内核被JTAG控制停止着.所以对你的初始化代码要求比较严格,初始化顺序有要求.

上电复位最大的好处是可以复位所有东西,包括内核和外设.而仿真复位则不行.

使用特权

评论回复
11
Swd21ic|  楼主 | 2009-2-17 21:51 | 只看该作者

可谁会在最终产品的硬件上留下手动复位额...

有点诡异...有时候RST复位还会产生硬halt.. 

使用特权

评论回复
12
Swd21ic|  楼主 | 2009-2-17 22:01 | 只看该作者

最新报告

我今天更换了IAR5.30EV版本..及时不把初始化TIM6和NVIC的时序对调..也可以正常运行了..

我总结下来IAR5修正的IAR4的BUG等问题..
1) IAR5的自带的J-Link Flashloader比IAR4快很多倍
2) IAR5可以用J-LINK RDI的方式.IAR4会报"R15错误"
3) IAR5用调试时,在窗口中能够正确的观察SP(即当前SP),SP_main与SP_process之间的问题,而IAR4在切换到SP_process堆栈后.Resigster调试窗口SP仍然是SP_main的值. 大家可以运行固件库的那个M3例子试下.程序是跑对了.但是调试看起来是不正确的.  这个问题在程序使用ucos时很恼火.因为切换到任务时,SP仍然是一个固定的值.导致某些分配在堆栈里的局部变量看起来也是错误的值!!!  (但不知道为什么用IAR5.3+J-LINK RDI仍然会出现该错误)
4) ...还在寻找中..

但也出现了几个问题..大虾们看看
1) 运行uCOS,单步到汇编任务切换的语句.不能正常切换.全速Go又可以过去.:如下:
   OSStartHighRdy
    LDR     R0, =NVIC_SYSPRI14 
    LDR     R1, =NVIC_PENDSV_PRI
    STRB    R1, [R0]

    MOVS    R0, #0                                        
    MSR     PSP, R0

    LDR     R0, =OSRunning                
    MOVS    R1, #1
    STRB    R1, [R0]

    LDR     R0, =NVIC_INT_CTRL                     
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]

    CPSIE   I                                              

OSStartHang
    B       OSStartHang                              
   
   运行完“CPSIE I"后就一直在B OStartHang上不动了.
   这个问题在本人机器上IAR4中就有, 但在别人装的IAR4上又没有问题. 可以单步挂起PENDSVC.进行任务切换..
2) 程序运行到汇编中有些问题..如果在汇编中设置断点会提示
   "不能在奇数地址上设置断点”...很奇怪.我用IAR4的工程就不会...

使用特权

评论回复
13
香水城| | 2009-2-17 22:10 | 只看该作者

不必一定使用手动产生硬件复位,还有很多其它方法

1)在复位引脚上临时焊一条线,需要执行硬件复位时把这条线短时间与地短接一下。

2)使用XXXX_DeInit()函数,可以通过软件对相应的模块执行硬件复位。例如可以调用TIM_DeInit(TIM2)单独对TIM2执行复位。

3)直接使用APB1外设复位寄存器(RCC_APB1RSTR)和APB2外设复位寄存器(RCC_APB2RSTR)对相应外设执行复位。如果需要复位所有的外设,可以写这样的4条语句:
    RCC_APB1RSTR=0xFFFF;
    RCC_APB1RSTR=0;
    RCC_APB2RSTR=0xFFFF;
    RCC_APB2RSTR=0;


建议在程序的开始部分使用方法2或3对相应模块执行复位,这样可以有效地减少很多调试时遇到的麻烦。如果你仔细看ST提供的例子,很多模块的初始化之前都使用了XXXX_DeInit()这样的函数调用。

使用特权

评论回复
14
Swd21ic|  楼主 | 2009-2-18 19:09 | 只看该作者

re

香主说的方法1好像有问题.
一旦把RST脚拉低.JTAG访问就断掉了...

后面两种我以前就试了.
在初始化之前加上了
NIVC_DeInit()
NVIC_SCBDeInit()
TIM6_DeInit().
但好象没有什么用

使用特权

评论回复
15
violet520| | 2009-2-19 11:16 | 只看该作者

这个问题值得关注

JTAG里边不是有一根复位线与芯片的复位线连接能否解决这个问题???

使用特权

评论回复
16
香水城| | 2009-2-19 11:33 | 只看该作者

关键是调试软件是否支持通过JTAG中的复位线产生复位信号

目前没有看到这样的功能。


15楼的担忧没有道理:“一旦把RST脚拉低.JTAG访问就断掉了...”,我说的方法1与手动按复位键在功能上没有区别。我说的方法解决11楼说的最终产品上没有复位键的问题。

使用特权

评论回复
17
violet520| | 2009-2-19 14:27 | 只看该作者

TIM6更新影子寄存器也会产生中断

如果更新影子寄存器不想产生中断,应该先把更新中断关了,再初始化,然后再打开中断

使用特权

评论回复
18
violet520| | 2009-7-1 16:54 | 只看该作者

关注

关注ING

使用特权

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

本版积分规则

71

主题

781

帖子

1

粉丝