OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7733|回复: 8

请问这是怎么回事?

[复制链接]

22

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2012-4-17
在线时间
0 小时
发表于 2012-12-24 10:42:27 | 显示全部楼层 |阅读模式
程序,刚开始很正常运行,跑了大概几分钟后,就死掉了,用仿真器查看发现,它死在这个地方,求高手解释!!



我用查内存地址的方法,找到了进入死循环后,LR的寄存器地址,然后找到了对应的汇编代码,可是为什么汇编代码却没有对应的C语言代码,不知道是什么原因?具体如下图所示:

































正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
发表于 2012-12-24 11:27:31 | 显示全部楼层
我前几天也是,但是现在好多了,不会总进入HardFault_Handler了。
对你使用的数组,内存进行范围检测,看是否越界操作了,大多数是数组或者内存越界操作引起的。还一个就是局部变量数组不要定义太大,如果太大超过堆栈大小,也好出现这种错误的。
回复 支持 反对

使用道具 举报

22

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2012-4-17
在线时间
0 小时
 楼主| 发表于 2012-12-24 14:58:09 | 显示全部楼层
回复【2楼】Julius007:
---------------------------------
多谢,我检查一下!
回复 支持 反对

使用道具 举报

22

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2012-4-17
在线时间
0 小时
 楼主| 发表于 2012-12-24 17:43:51 | 显示全部楼层
回复【2楼】Julius007:
---------------------------------
我查了一下,还是不行,我怀疑不是数组越界的问题,真是费解啊!
回复 支持 反对

使用道具 举报

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
发表于 2012-12-24 19:15:05 | 显示全部楼层
回复【4楼】everyday666:
---------------------------------
O(∩_∩)O~那不好意思,我就知道这些了。
回复 支持 反对

使用道具 举报

22

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2012-4-17
在线时间
0 小时
 楼主| 发表于 2012-12-26 15:23:09 | 显示全部楼层
回复【6楼】keyway:
---------------------------------
多谢你的回答,我查一下。
回复 支持 反对

使用道具 举报

22

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2012-4-17
在线时间
0 小时
 楼主| 发表于 2012-12-26 15:36:11 | 显示全部楼层
回复【6楼】keyway:
---------------------------------
我使用了定时器中断和外部中断,下面是我的代码,我检查了一下,是没有问题的,麻烦您帮我看一下。

定时器中断:

void TIM2_IRQHandler(void)//100ms进入一次中断
{

if(TIM2->SR&0X0001) //溢出中断
{

IWDG_Feed();// 喂狗
LED_InstructCount++;
if(LED_InstructCount>=2) //正常工作的灯 每隔1 秒 闪烁一次
{
LED_Instruct=!LED_Instruct;
LED_InstructCount=0;
}

if((GSM_Alarm_Weight_Flag==1||GSM_Alarm_Angle_Flag==1||GSM_Alarm_BianFu_Flag==1||GSM_Alarm_Height_Flag==1||GSM_Alarm_FengSu_Flag==1||GSM_Alarm_ShiWen_Flag==1||GSM_Alarm_MotorTemp_Flag==1||GSM_Alarm_Voltage_Flag==1||GSM_Alarm_Charge_Flag==1||GSM_Alarm_Torque_Flag==1)&&(Send_Message_Flag==1))  //只要有一路超过预警值 就发出声光报警
{
BUZZER_Flag=1;  //蜂鸣器 响
LED_Alarm_Flag=1;  //报警灯闪烁
}
if(GSM_Alarm_Weight_Flag==0&&GSM_Alarm_Angle_Flag==0&&GSM_Alarm_BianFu_Flag==0&&GSM_Alarm_Height_Flag==0&&GSM_Alarm_FengSu_Flag==0&&GSM_Alarm_ShiWen_Flag==0&&GSM_Alarm_MotorTemp_Flag==0&&GSM_Alarm_Voltage_Flag==0&&GSM_Alarm_Charge_Flag==0&&GSM_Alarm_Torque_Flag==0)
{
BUZZER_Flag=0;
BUZZER=0;  
LED_Alarm_Flag=0; 
LED_Alarm=1; 
}
if(BUZZER_Flag==1)  // 蜂鸣器 嘀嘀 响
{
BUZZER=!BUZZER;
}
if(LED_Alarm_Flag==1)
{
LED_Alarm=!LED_Alarm; //报警灯闪烁
}
}
TIM2->SR&=~(1<<0);//清除中断标志位
}

void TIM3_IRQHandler(void)//500ms进入一次中断
{
if(TIM3->SR&0X0001) //溢出中断
{
if(Rtc_show_Flag==1)
{
Rtc_show();
}
DisplayAdc_Count++;
if((DisplayAdc_Count>=5)&&(DisplayMain_Count==0))
{
 DisplayAdc_Count=0;
 Adc_Timing_Display();  // 定时器中只负责 显示  当前采样的到的 信号值

}
if(SecondFlag_10>8)
{
DisplayMain_Flag=1;
}
if(DisplayMain_Count>=20)
{
DisplayMain_Count++;
if(DisplayMain_Count>=30)
{
Display_Main();
  DisplayMain_Count=0;
}
}
if(DelayCount_Flag_1s==1)
{
   DelayCount_1s++;
}

if(DelayStart_Flag==1)
{
DelayCount++;
}

SecondFlag_2++;  if (SecondFlag_2>=250)  SecondFlag_2=0;
SecondFlag_3++;  if (SecondFlag_3>=250)  SecondFlag_2=0;
SecondFlag_10++; if (SecondFlag_10>=250)  SecondFlag_2=0;
}
TIM3->SR&=~(1<<0);//清除中断标志位
}

void Timer3_Init(u16 arr, u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值 刚好 1ms
TIM3->SC=psc;//预分频器为7200,得到10Khz 的计数时钟
// 这两个 位置同样设置才可以使用中断
TIM3->DIER|=1<<0;  //允许更新 中断
// TIM3->DIER|=1<<14;  //允许触发DMA 请求
TIM3->DIER|=1<<6; //允许 触发中断
TIM3->CR1|=0X01;  //使能 定时器 3
MY_NVIC_Init(2,3,TIM3_IRQChannel,2); //抢占 1, 子优先级3, 组2
}
void Timer2_Init(u16 arr, u16 psc)
{
RCC->APB1ENR|=1<<0; //TIM2时钟使能
TIM2->ARR=arr; //设定计数器自动重装值 刚好 1ms
TIM2->SC=psc;//预分频器为7200,得到10Khz 的计数时钟
// 这两个 位置同样设置才可以使用中断
TIM2->DIER|=1<<0;  //允许更新 中断
// TIM2->DIER|=1<<14;  //允许触发DMA 请求
TIM2->DIER|=1<<6; //允许 触发中断
TIM2->CR1|=0X01;  //使能 定时器 3
MY_NVIC_Init(0,2,TIM2_IRQChannel,2); //抢占 0, 子优先级2, 组2

}

按键外部中断:

void EXTIX_Init(void)
{
Key_Scan_FLine();
//Ex_NVIC_Config(GPIO_G,0,1);  //下降沿触发,第一行
Ex_NVIC_Config(GPIO_F,5,1);//F口,5位,下降沿触发,第一列,第六
   MY_NVIC_Init(1,1,EXTI9_5_IRQChannel,2);//中断线5--9   
}

void EXTI9_5_IRQHandler(void)
{
      //具体内容 没有列出
}


请您看一下,应该没问题的。

回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2012-12-26 19:43:25 | 显示全部楼层
回复【8楼】everyday666:
---------------------------------
共享你的工程,这样看着费力,我跑来试试。
回复 支持 反对

使用道具 举报

2

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-12-26 20:44:38 | 显示全部楼层
回复【4楼】everyday666:
---------------------------------
如果是数组越界的话  可以修改启动代码里面的Stack_Size      EQU     0x00000400的大小。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-20 04:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表