OpenEdv-开源电子网

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

AD老是进入硬件错误,帮忙看下,为什么呢,谢谢了

[复制链接]

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2014-1-24 10:04:49 | 显示全部楼层 |阅读模式
OS建立了一个任务,任务里面while(1)就调用下面这个函数,基本上不用几秒就进入HardFault_Handler(void)

AD开门狗中断没有开启,

带SEM的变量都是整型INT8U,本来是多任务的,被整到一个任务,我也懒得去变
CUR_REDRESS_VAL预先置位0x7ff,

INT32S CONVERT_TEMP[2];

帮忙看下,谢谢了




void AD_IDLE_DETECT()//监控AD通道,只做采集,不做别的处理,等待AD中断或者判断结束
{
OS_CPU_SR   cpu_sr = 0u;
/*设置看门狗通道*/
ADC1->CR1&=0xffffffe0;//清除开门狗通道
ADC2->CR1&=0xffffffe0;
ADC1->CR1|=0x8;
ADC2->CR1|=0xe;
/*设置采集通道*/
ADC2->SQR3=0x0000000e;//转换通道到14电流
ADC1->SQR3=0x00000008;//转换通道到8电压
/*进入采集*/
OS_ENTER_CRITICAL();
ADC1->CR2|=AD_START;//开启采集组1
while((!(ADC1->SR&0x00000002))&&(!(ADC2->SR&0x00000002)));//等待
OS_EXIT_CRITICAL();
/*删除状态*/
ADC1->SR&=0;
ADC2->SR&=0;

/*数据判断*/
if((AD_STATUS!=AD_IDLE_SEM)&&(AD_STATUS!=CONVERT_SEM))return;//非监控任务也非提前结束,则返回
// OS_ENTER_CRITICAL();
if(AD_STATUS==CONVERT_SEM)//判断是否结束切换
{
CONVERT_TEMP[0]=ADC1->DR;
CONVERT_TEMP[1]=ADC2->DR;
CONVERT_TEMP[0]=CONVERT_TEMP[0]-CUR_REDRESS_VAL.U_VAG[0];
CONVERT_TEMP[1]=CONVERT_TEMP[1]-CUR_REDRESS_VAL.I_VAG[0];
if((CONVERT_TEMP[0]<AD_GATE)&&(CONVERT_TEMP[1]<AD_GATE))//
{
CONVERT_NUM++;
// if(CONVERT_NUM>=65536)
// {while(1);}
}
else 
CONVERT_NUM=0;//否则还在继续,则重新计算
}
// OS_EXIT_CRITICAL();
/*裁决*/
if(AD_STATUS==CONVERT_SEM)
if(CONVERT_NUM>=AD_END_CONVERT)
{//结束标志
END_AD();
return;
}
/*设置看门狗通道*/
ADC1->CR1&=0xffffffe0;//清除开门狗通道
ADC2->CR1&=0xffffffe0;
ADC1->CR1|=0x9;
ADC2->CR1|=0xf;
/*设置采集通道*/
ADC2->SQR3=0x0000000f;//转换通道到15电流
ADC1->SQR3=0x00000009;//转换通道9//电压
/*进入采集*/
OS_ENTER_CRITICAL();
ADC1->CR2|=AD_START;//开始采集组2
while(!(ADC1->SR&0x00000002)&&(!(ADC2->SR&0x00000002)));//等待
OS_EXIT_CRITICAL();
/*删除状态*/
ADC1->SR&=0;
ADC2->SR&=0;
/*数据判断*/
if((AD_STATUS!=0)&&(AD_STATUS!=CONVERT_SEM))return;
if(AD_STATUS==CONVERT_SEM)//判断是否结束切换
{
CONVERT_TEMP[0]=ADC1->DR;
CONVERT_TEMP[1]=ADC2->DR;
CONVERT_TEMP[0]=CONVERT_TEMP[0]-CUR_REDRESS_VAL.U_VAG[1];
CONVERT_TEMP[1]=CONVERT_TEMP[1]-CUR_REDRESS_VAL.I_VAG[1];
if((CONVERT_TEMP[0]<AD_GATE)&&(CONVERT_TEMP[1]<AD_GATE))
{
CONVERT_NUM++;//测试次数增加
}
else CONVERT_NUM=0;//否则还在继续,则重新计算
}
/*裁决*/
if(AD_STATUS==CONVERT_SEM)
if(CONVERT_NUM>=AD_END_CONVERT)
{//结束标志
END_AD();
return;
}
}

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 02:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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