OpenEdv-开源电子网

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

模拟看门狗问题

[复制链接]

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-7-14
在线时间
17 小时
发表于 2018-8-12 22:40:41 | 显示全部楼层 |阅读模式
5金钱
今天与遇到问题了,关于模拟看门狗网上资料特别少。大家帮我看看为什么我配置的模拟看门狗触发不了呢。


[mw_shl_code=c,true]void Adc2_init(void){
        GPIO_InitTypeDef GPIO_InitStructure;
        ADC_InitTypeDef ADC_InitStru;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC2,ENABLE);
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);  //<=14Mhz  //ADC 2 IN15
       
        ADC_DeInit(ADC2);  //important
        ADC_InitStru.ADC_ContinuousConvMode=ENABLE;
        ADC_InitStru.ADC_DataAlign=ADC_DataAlign_Right;  //数据右对齐
        ADC_InitStru.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
        ADC_InitStru.ADC_Mode=ADC_Mode_Independent;
        ADC_InitStru.ADC_NbrOfChannel=1;   //开启一个采样通道
        ADC_InitStru.ADC_ScanConvMode=DISABLE;
        ADC_SoftwareStartConvCmd(ADC2, ENABLE);
        ADC_Init(ADC2,&ADC_InitStru);
       
        ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 1, ADC_SampleTime_71Cycles5 );

        ADC_Cmd(ADC2,ENABLE);
        ADC_ResetCalibration(ADC2);
        while(ADC_GetCalibrationStatus(ADC2)) continue;
        ADC_StartCalibration(ADC2);
        while(ADC_GetCalibrationStatus(ADC2)) continue;
       

  ADC_AnalogWatchdogSingleChannelConfig(ADC2,ADC_Channel_15);   //配置模拟看门狗
  ADC_AnalogWatchdogThresholdsConfig(ADC2,0,0x800);
  ADC_AnalogWatchdogCmd(ADC2,ADC_AnalogWatchdog_SingleRegEnable);
//        ADC_AnalogWatchdogCmd(ADC2,ENABLE);       
       
        ADC_ITConfig(ADC2,ADC_IT_AWD,ENABLE);//
  NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  NVIC_Init(&NVIC_InitStructure);
}

void ADC1_2_IRQHandler(void)
{
// ADC_ITConfig(ADC1,ADC_IT_AWD,DISABLE);
  if(SET == ADC_GetFlagStatus(ADC2,ADC_FLAG_AWD))
  {
  //  ADC_ClearFlag(ADC2,ADC_FLAG_AWD);
               
                In_Protect=0;
    ADC_ClearITPendingBit(ADC2,ADC_IT_AWD);
   }
//   ADC_ITConfig(ADC1,ADC_IT_AWD,ENABLE);
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

至此,问题已经解决了。还好想起了在网上查配置看门狗资料的时候看到的一个帖子,说是上阈值和下阈值颠倒了,刚才一看果然是的。 应该改成这样 ADC_AnalogWatchdogThresholdsConfig(ADC2,0x800 ,0); 外国人和中国人的思维还真不一样。 其实配置的时候这些函数都是我在博客上copy的,但是发个有这样错误的帖子就不应该了吧,难道自己的代码不去测试就贴出来了。 既然问题解决了,准备回宿舍。。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-7-14
在线时间
17 小时
 楼主| 发表于 2018-8-12 22:40:42 | 显示全部楼层
至此,问题已经解决了。还好想起了在网上查配置看门狗资料的时候看到的一个帖子,说是上阈值和下阈值颠倒了,刚才一看果然是的。

应该改成这样  ADC_AnalogWatchdogThresholdsConfig(ADC2,0x800 ,0);
外国人和中国人的思维还真不一样。
其实配置的时候这些函数都是我在博客上copy的,但是发个有这样错误的帖子就不应该了吧,难道自己的代码不去测试就贴出来了。
既然问题解决了,准备回宿舍。。。。
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-7-14
在线时间
17 小时
 楼主| 发表于 2018-8-12 22:57:04 | 显示全部楼层
还是没有人回,emmm~
自己解决了
ADC_SoftwareStartConvCmd(ADC2, ENABLE);
    ADC_Init(ADC2,&ADC_InitStru);
反正软件转换开始函数不能放在初始化前面。
不过新的问题又来了,为啥一直触发模拟看门狗?模拟看门狗真的是一只疯狗,时而安静时而暴躁而不受控制。
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-13 14:14:42 | 显示全部楼层
我来学习了,楼主普及一下模拟看门狗,是什么意思,有什么用途
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-7-14
在线时间
17 小时
 楼主| 发表于 2018-8-24 22:34:06 | 显示全部楼层
ssssssssssss 发表于 2018-8-13 14:14
我来学习了,楼主普及一下模拟看门狗,是什么意思,有什么用途

我也是个初学者,以下复制于百度百科

在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成各种寄存器和内存的数据混乱,会导致程序指针错误,不在程序区,取出错误的程序指令等,都会陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续正常工作,会造成整个系统的陷入停滞状态,发生不可预料的后果。
看门狗就是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启信号的电路。看门狗命令在程序的中断中拥有最高的优先级。

模拟看门狗自然是针对模拟电信号的监测程序或电路啦。比如我做个输入电压保护,输入电压太高或者太低都是不符合要求的,那么模拟看门狗就能派上用场,一旦输入电压低于或者高于某个阈值,都能触发模拟看门狗中断,至于怎么处理,在模拟看门狗中断函数里写程序就行啦。其实就是通过adc采集模拟信号,将对应数据做处理,不过模拟看门狗比一般的用adc采集数据再处理要快,具体原因忘了,好像是省去了一个什么步骤。
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-7-14
在线时间
17 小时
 楼主| 发表于 2018-8-24 22:42:57 | 显示全部楼层
星邻 发表于 2018-8-24 22:34
我也是个初学者,以下复制于百度百科

在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到 ...

如果被ADC转换的模拟电压低于低阀值或高于高阀值, AWD模拟看门狗状态位被设置。阀值位
于ADC_HTR和ADC_LTR寄存器的最低12个有效位中。通过设置ADC_CR1寄存器的AWDIE位
以允许产生相应中断。
阀值独立于由ADC_CR2寄存器上的ALIGN位选择的数据对齐模式。比较是在对齐之前完成的
(见11.5节)。
158/754
通过配置ADC_CR1寄存器,模拟看门狗可以作用于1个或多个通道,如表63所示。


也就是说adc采集数据后,如果符合条件,中断会在数据对齐之前产生。
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-27 08:22:59 | 显示全部楼层
星邻 发表于 2018-8-24 22:42
如果被ADC转换的模拟电压低于低阀值或高于高阀值, AWD模拟看门狗状态位被设置。阀值位
于ADC_HTR和ADC_ ...

谢谢指导
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 00:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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