打印
[STM32F2]

求助为什么使用定时器输入捕捉中断就会HardFault

[复制链接]
1402|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljtzbm|  楼主 | 2016-8-6 14:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用STM32F205的TIM3定时器输入捕捉功能用于接收红外信息,程序运行后有时会进入HardFault。在keil中定位到出错位置为TIM3_IRQHandler中断程序,求解导致出错的原因。#define IR_ARRAY_NUM                                                        200
#define High_level                                                                0x80000000       
unsigned char first_edge = 0;
unsigned char cap_flag = 0;
unsigned int irTime[IR_ARRAY_NUM] = {0x00};               
unsigned short irCount = 0;


void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_CC1)!= RESET)
        {
               
                        if(first_edge == 0)
                        {
                                first_edge = 1;
                                cap_flag = 0x40;
                                TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising);               
                                TIM_SetCounter(TIM3,0);                  
                        }
                        else
                        {
                                if(cap_flag == 0x40)
                                {
                                        cap_flag = 0x80;
                                        if(irCount < IR_ARRAY_NUM)
                                        {
                                                irTime[irCount] = TIM_GetCapture1(TIM3);                               
                                                irCount++;
                                        }
                                        TIM_SetCounter(TIM3,0);       
                                        TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling);
                                }
                                else if(cap_flag == 0x80)
                                {
                                        cap_flag = 0x40;
                                        if(irCount < IR_ARRAY_NUM)
                                        {
                                                irTime[irCount] = TIM_GetCapture1(TIM3)|High_level;                               
                                                irCount++;
                                        }
                                        TIM_SetCounter(TIM3,0);       
                                        TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising);
                                }
                        }       
                       
                TIM_ClearFlag(TIM3,TIM_IT_CC1);       
        }                       
}


沙发
mmuuss586| | 2016-8-6 14:43 | 只看该作者
TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising);               
                                TIM_SetCounter(TIM3,0);      
把这2句先注释掉看看;

观察下出现错误的概率;

使用特权

评论回复
板凳
ljtzbm|  楼主 | 2016-8-6 15:00 | 只看该作者
mmuuss586 发表于 2016-8-6 14:43
TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising);               
                                T ...

还是会进HardFault中断,概率跟原先比相差不大,我想问下,注释这两句的原因。TIM3初始化为下降沿检测,输入的引脚没有波形的时候为高电平,我想从第一个波形就开始记录数据。

使用特权

评论回复
地板
airwill| | 2016-8-8 10:45 | 只看该作者
本帖最后由 airwill 于 2016-8-8 10:49 编辑

我怀疑问题在
irCount++;

这个变量不断的 ++, 却不加以限制.
irTime[irCount] =...
那么超出 IR_ARRAY_NUM 后导致错误.
不妨先改成
  if (++irCount >= IR_ARRAY_NUM) irCount = 0;

使用特权

评论回复
5
quray1985| | 2016-8-8 16:33 | 只看该作者
ljtzbm 发表于 2016-8-6 15:00
还是会进HardFault中断,概率跟原先比相差不大,我想问下,注释这两句的原因。TIM3初始化为下降沿检测, ...

你这个tim3还有用到其他的功能吗

使用特权

评论回复
6
xmshao| | 2016-8-8 17:08 | 只看该作者
严重怀疑数组越界导致的问题。

irTime[irCount] 确认下这个东西。

使用特权

评论回复
7
玛尼玛尼哄| | 2016-8-8 19:28 | 只看该作者
应该是溢出导致的。

使用特权

评论回复
8
ljtzbm|  楼主 | 2016-8-9 13:28 | 只看该作者
quray1985 发表于 2016-8-8 16:33
你这个tim3还有用到其他的功能吗

没有

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝