OpenEdv-开源电子网

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

关于ADC模拟看门狗中断的问题

[复制链接]

51

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2014-6-16
在线时间
12 小时
发表于 2014-8-3 18:57:17 | 显示全部楼层 |阅读模式
5金钱
我用模拟看门狗来检测ADC转换的电压,如果不在看门狗的区间内,则LED1亮,
如果用查询的方式来查看模拟看门狗状态,可以正常工作,改成中断方式后,ADC转换就不能进行,有高手能看一下吗?
这是部分代码。
void ADConvert_Init(void)
{
ADC_InitTypeDef ADC_InitStruct;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//ADC Init
ADC_DeInit(ADC1);
ADC_InitStruct.ADC_ContinuousConvMode =DISABLE;
ADC_InitStruct.ADC_DataAlign =ADC_DataAlign_Right;
ADC_InitStruct.ADC_ExternalTrigConv =ADC_ExternalTrigConv_None;
ADC_InitStruct.ADC_Mode =ADC_Mode_Independent;
ADC_InitStruct.ADC_NbrOfChannel=1;
ADC_InitStruct.ADC_ScanConvMode =DISABLE;
ADC_Init(ADC1, &ADC_InitStruct);

AnalogWatchDog_Set();
//   ADC_AnalogWatchdogSingleChannelConfig(ADC1,ADC_Channel_1); //??ADC1_channal_1?è???????·
// ADC_AnalogWatchdogThresholdsConfig(ADC1,2482,1861);
// ADC_AnalogWatchdogCmd(ADC1,ADC_AnalogWatchdog_SingleRegEnable);
// ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);

ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1)); //??????????×??á??
ADC_StartCalibration(ADC1); //????AD??×? 
while(ADC_GetCalibrationStatus(ADC1)); //??????×??á??

}

//?è???????????·
void AnalogWatchDog_Set(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
//Usart1 NVIC ????
    NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//??????????3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×???????3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨??????
NVIC_Init(&NVIC_InitStructure); //?ù?????¨????????????VIC?????÷
  
ADC_AnalogWatchdogSingleChannelConfig(ADC1,ADC_Channel_1); //??ADC1_channal_1?è???????·
ADC_AnalogWatchdogThresholdsConfig(ADC1,2482,1861);
ADC_AnalogWatchdogCmd(ADC1,ADC_AnalogWatchdog_SingleRegEnable);
ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);
}

void ADC1_2_IRQHandler(void)   
{
while(ADC_GetITStatus(ADC1, ADC_IT_AWD) != RESET);
ADC_ClearFlag(ADC1, ADC_FLAG_AWD);
LED1=0;
delay_ms(200);
ADC_ClearITPendingBit(ADC1, ADC_IT_AWD); 
}


ADC.zip

5.13 MB, 下载次数: 1426

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-8-3 23:43:05 | 显示全部楼层
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2014-9-15 21:59:55 | 显示全部楼层
楼主这个问题怎么没人解答呢 ?我也遇到这个问题  。但楼主的ADC模式好像有点问题,连续模式得使能啊
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-8-28 11:21:50 | 显示全部楼层
中断函数写的有问题。
小小蜗牛
回复

使用道具 举报

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2013-11-22
在线时间
8 小时
发表于 2016-3-20 20:19:19 | 显示全部楼层
我出现了同样的问题,中断能发生,但ADC好像停止了
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-7-7
在线时间
1 小时
发表于 2016-8-20 00:47:56 | 显示全部楼层
你知道你为什么会停止吗,你在中断里面调用delay,你这个delay函数肯定是用的systick来计时的,systick的中断优先级应该是最低,根本打断不了你这个中断
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-9-16
在线时间
38 小时
发表于 2016-10-25 09:59:52 | 显示全部楼层
表示遇到了,同样的问题,ADC其他中断可以,但是模拟看门狗的中断就是死活不进去,不知道版主有没有解决呢??????????????????
回复

使用道具 举报

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-5-17
在线时间
11 小时
发表于 2016-11-24 11:10:35 | 显示全部楼层
看门狗允许中断位没设置吗
固步自封于FLASH,只能机械性的运作,人应像翱翔天际的雄鹰,装载高速变化的CPU及强大的存储能力,摆脱老旧的结构束缚,翱翔在智能化信息的海洋。
回复

使用道具 举报

9

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-3-7
在线时间
25 小时
发表于 2017-4-7 15:55:25 | 显示全部楼层
2W多的最高值?最大值不应该是4095吗
回复

使用道具 举报

15

主题

118

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3060
金钱
3060
注册时间
2015-12-20
在线时间
299 小时
发表于 2017-8-21 14:48:39 | 显示全部楼层
我也遇到了问题,不知道有没有大神会解呢
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-5-8
在线时间
0 小时
发表于 2019-5-8 14:04:48 | 显示全部楼层
亲测去掉这句while(ADC_GetITStatus(ADC1, ADC_IT_AWD) != RESET); 就正常了,其实中断没必要加这句判断的。
回复

使用道具 举报

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2020-6-20
在线时间
14 小时
发表于 2020-8-2 11:30:05 | 显示全部楼层
我的模拟看门狗怎么死活进不去啊?就是在例程上直接加的模拟看门狗
void  Adc_Init(void)
{   
  GPIO_InitTypeDef  GPIO_InitStructure;
        ADC_CommonInitTypeDef ADC_CommonInitStructure;
        ADC_InitTypeDef       ADC_InitStructure;
        NVIC_InitTypeDef NVIC_InitStucture;
       
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ê1ÄüGPIOAê±Öó
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ê1ÄüADC1ê±Öó

  //Ïè3õê¼»ˉADC1í¨μà5 IO¿ú
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 í¨μà5
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//Ä£Äaêäèë
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//2»′øéÏÏÂà-
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉ  

        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);          //ADC1¸′λ
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);        //¸′λ½áêø         

       
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//¶àá¢Ä£ê½
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//ὸö2éÑù½×¶ÎÖ®¼äμÄÑó3ù5¸öê±Öó
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMAê§Äü
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//Ô¤·ÖÆμ4·ÖÆμ¡£ADCCLK=PCLK2/4=84/4=21Mhz,ADCê±Öó×îoÃ2»òa3¬1y36Mhz
  ADC_CommonInit(&ADC_CommonInitStructure);//3õê¼»ˉ
       
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λÄ£ê½
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//·Çé¨Ãèģ꽠      
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//1رÕá¬Dø×a»»
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//½ûÖ1′¥·¢¼ì2a£¬ê1óÃèí¼t′¥·¢
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//óò¶ÔÆë       
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1¸ö×a»»Ôú1æÔòDòáDÖD ò2¾íêÇÖ»×a»»1æÔòDòáD1
  ADC_Init(ADC1, &ADC_InitStructure);//ADC3õê¼»ˉ
       

        ADC_Cmd(ADC1, ENABLE);//¿aÆôAD×a»»Æ÷       


        //+++++
       
        NVIC_InitStucture.NVIC_IRQChannel=ADC_IRQn;
        NVIC_InitStucture.NVIC_IRQChannelPreemptionPriority=2;//ÇàÕ¼óÅÏè¼¶
        NVIC_InitStucture.NVIC_IRQChannelSubPriority=0;//Ïìó|óÅÏè¼¶
        NVIC_InitStucture.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStucture);
       
                //ADCÄ£Äa¿′ÃÅ1·ÖD¶Ïê1Äü
       
        ADC_AnalogWatchdogSingleChannelConfig(ADC1,ADC_Channel_10);//¶Ôμ¥¸öADC í¨μàéèÖÃÄ£Äa¿′ÃÅ1·
       
        ADC_AnalogWatchdogThresholdsConfig(ADC1, 0x7FF, 0x064);//+éèÖøßμíãDÖμ£¿
       
       
        ADC_AnalogWatchdogCmd(ADC1,ADC_AnalogWatchdog_SingleRegEnable);//ê1ÄüÄ£Äa¿′ÃÅ1·
       
        ADC_ITConfig(ADC1,ADC_IT_AWD,ENABLE);
}                       


void ADC_IRQHandler()
{

         if(ADC_GetITStatus(ADC1,ADC_IT_AWD)==SET)//+Îaé¶2»êÇADC_GetITStatus£¿òѽa¾ö£¬μ«êÇÕa¸ö×÷óÃêÇê2Ã′£¿
         {
                ADC_ClearFlag(ADC1,ADC_FLAG_AWD);
       
                LED0=!LED0;
                delay_ms(250);       
                ADC_ClearITPendingBit(ADC1,ADC_IT_AWD);       
         }
}
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-8-2 18:46:51 | 显示全部楼层
16622723012 发表于 2020-8-2 11:30
我的模拟看门狗怎么死活进不去啊?就是在例程上直接加的模拟看门狗
void  Adc_Init(void)
{   

ADC_AnalogWatchdogSingleChannelConfig(ADC1,ADC_Channel_10);
A5 是通道5吧
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 04:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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