OpenEdv-开源电子网

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

定时中断引起死机!求助

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-7-28
在线时间
2 小时
发表于 2013-7-29 16:31:37 | 显示全部楼层 |阅读模式
通过定时中断采集工频整流信号,我想通过定时器每ms采集一次,40次后取平均值。但是每隔几秒程序就死机几次,分析不出原因。把定时器时间延长仍有这个问题,只是间隔长了些。
附程序:
定时中断,用的例子中的TIM3。 
static u16 sz0[40],sz1[40];
u16 k;
void TIM3_IRQHandler(void)
{
static u16 h;
if(TIM3->SR&0X0001)//
{
   sz0[h]=Get_Adc(ADC_CH0);
  sz1[h]=Get_Adc(ADC_CH1);
h++;
}else;
if(h>39)
h=0;else;

TIM3->SR&=~(1<<0);//   
}
定时器初始化
void Timerx_Init(u16 arr,u16 psc)
{
for(k=0;k<40;k++)
{sz0[k]=Get_Adc(ADC_CH0);sz1[k]=Get_Adc(ADC_CH1);}
RCC->APB1ENR|=1<<1;//
  TIM3->ARR=arr;  //
TIM3->SC=psc; //

TIM3->DIER|=1<<0;   //
TIM3->DIER|=1<<6;   //      
TIM3->CR1|=0x01;    //
  MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//
}
取平均值
u16 TIM3_C(u16 x)
{
u32 temp0,temp1;
u16 y;
temp0=temp1=0;
for(k=0;k<40;k++)
{
temp0+=sz0[k];
temp1+=sz1[k];
}
switch (x)
{
case 0:y=(u16)(temp0/40);break;
case 1:y=(u16)(temp1/40);break;
default:y=0;break;
}
return y;
}


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

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-7-28
在线时间
2 小时
 楼主| 发表于 2013-7-29 18:29:54 | 显示全部楼层
确实是死机,狗都动作了,去掉狗后一段时间指示灯也不闪烁了,延时到500ms还是存在这个问题。现在用全局变量读取ADC,中断从全局变量取值就好了,是不是定时中断不能读取ADC?论坛好像有人提过。
回复 支持 0 反对 1

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-29 17:23:37 | 显示全部楼层
回复【楼主位】livei80:
---------------------------------
你这程序不应该死机才对啊...
死机是指要复位才能再次正常运行的状态.你确定是死机?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-29 22:30:05 | 显示全部楼层
回复【3楼】livei80:
---------------------------------
原来你还开狗了....
定时器里面采集ADC需要一定时间,看你的看门狗多久复位了,你设置看门狗复位时间长一点试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-7-30 08:55:39 | 显示全部楼层
不要在中断里面用ADC采数据,时间不定。
stm32 不充许硬件中断嵌中断,如果此时 看门狗一直不喂食,就会引发复位了。
正确办法,
不要在定时中断里面用ADC,把ADC采样放中断外面,
定个全局标记通知信号,当这标记为 设定值时,就进行采样,完成后,值设定为初值。


要用好中断就必须谨记:中断内的程序运行时间是一定的(可计算),尽量要短。
把中断就当成个通知信号,要做具体事情还是在main或os 任务内完成。
1-1
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-7-28
在线时间
2 小时
 楼主| 发表于 2013-7-30 13:04:14 | 显示全部楼层
狗的时间是1S,去掉后程序也不执行,输入不扫描,输出不更新。确认是不能嵌套模拟量采集,现在就采用4楼办法。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-16 03:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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