8574|18

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于IAR4.42和STM32疑难杂症(已解决.使用IAR5.30) [复制链接]

请各位大虾诊断!
开发平台 (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.

现象就这么多.请大家给个注意阿,谢谢
此帖出自stm32/stm8论坛

最新回复

IAR软件如法使用了。打不开以前的程序了,咋办啊  详情 回复 发表于 2011-7-22 15:04
点赞 关注
 

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

33人已阅

                                 没人给点意见吗?
此帖出自stm32/stm8论坛
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

没人给点意见

                                   没人给点意见?确实不大好判断,真是疑难杂症。
此帖出自stm32/stm8论坛
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 

确实是疑难杂症

                                 请尝试降低J-Link的传输速度试试。
此帖出自stm32/stm8论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

5
 

IAR 4.42A有补丁了?

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 

怀疑

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

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 

还有就是保证你的

                                 下载和芯片复位没问题.
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 

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了.. 各位大虾认为呢..



此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 

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

                                 这个问题几乎是所有调试器的毛病。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 

香版说的很对

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

上电复位最大的好处是可以复位所有东西,包括内核和外设.而仿真复位则不行.
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 

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

                                 有点诡异...有时候RST复位还会产生硬halt.. 
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

12
 

最新报告

我今天更换了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的工程就不会...
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 

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

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()这样的函数调用。
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

14
 

re

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

后面两种我以前就试了.
在初始化之前加上了
NIVC_DeInit()
NVIC_SCBDeInit()
TIM6_DeInit().
但好象没有什么用
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 

这个问题值得关注

                                 JTAG里边不是有一根复位线与芯片的复位线连接能否解决这个问题???
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

16
 

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

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


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

回复

70

帖子

0

TA的资源

一粒金砂(中级)

17
 

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

                                 如果更新影子寄存器不想产生中断,应该先把更新中断关了,再初始化,然后再打开中断
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

18
 

关注

                                 关注ING
此帖出自stm32/stm8论坛
 
 
 

回复

219

帖子

0

TA的资源

纯净的硅(初级)

19
 

IAR软件如法使用了。打不开以前的程序了,咋办啊

1232.jpg (18.78 KB, 下载次数: 0)

1232.jpg
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表