你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f303 AD 模拟看门狗不能产生中断

[复制链接]
guojunjunjun200 提问时间:2020-3-30 21:46 /
芯片:stm32f303CBT6
IDE:keil
我配置好后ADC后,当从ADC通道引脚输入的电压超过设置范围后,不能进入ADC模拟看门狗中断。
如果在main函数中的while循环里调用ADC_GetConversionValue(ADC1)时,则可以以进入ADC模拟看门狗中断
我想在不调用ADC_GetConversionValue(ADC1)情况应该是可以进入ADC模拟看门狗中断的, 可能是我哪没有
配置好才导致进不了中断的。有用过stm32f303看门狗的帮忙指正,在这里谢谢了。
以下是代码:
**注:不用DMA功能,用DMA功能当然可以产生中断,因为DMA会在后台会读取ADC数据寄存器。**
u32 calibration_value1 = 0;
void ADC1_2_IRQHandler(void)
{
        if(SET == ADC_GetFlagStatus(ADC1,ADC_FLAG_AWD1))
        {
                ADC_ITConfig(ADC1,ADC_IT_AWD1,DISABLE);
                ADC_ClearFlag(ADC1,ADC_FLAG_AWD1);
                ADC_ClearITPendingBit(ADC1,ADC_IT_AWD1);
        }
        if(SET == ADC_GetFlagStatus(ADC2,ADC_FLAG_AWD2))
        {
                ADC_ITConfig(ADC2,ADC_IT_AWD2,DISABLE);
                ADC_ClearITPendingBit(ADC2,ADC_IT_AWD2);

        }
}
void adc1_init(void)
{

        ADC_CommonInitTypeDef cs;
        ADC_InitTypeDef         adcs;

        ADC_VoltageRegulatorCmd(ADC1, ENABLE);
        delay_ms(1);
        ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single); ADC_StartCalibration(ADC1);

        while(ADC_GetCalibrationStatus(ADC1) != RESET );
        calibration_value1 = ADC_GetCalibrationValue(ADC1);
        adcs.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
        adcs.ADC_Resolution = ADC_Resolution_12b;
        adcs.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;//ADC_ExternalTrigConvEvent_7
        adcs.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
        adcs.ADC_DataAlign = ADC_DataAlign_Right;
        adcs.ADC_OverrunMode = ADC_OverrunMode_Disable;
        adcs.ADC_AutoInjMode = ADC_AutoInjec_Disable;
        adcs.ADC_NbrOfRegChannel = 1;
        ADC_Init(ADC1, &adcs);
        cs.ADC_Clock = ADC_Clock_AsynClkMode;
        cs.ADC_Mode  = ADC_Mode_Independent;//ADC_Mode_Interleave;
        cs.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;;
        cs.ADC_DMAMode = ADC_DMAMode_Circular;
        cs.ADC_TwoSamplingDelay = 0;
        ADC_CommonInit(ADC1, &cs);

        //Tconv = Sampling time + 12.5 ADC clock cycles   (12.5+Sampling)/64M
        ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_61Cycles5);//ADC_SampleTime_1Cycles5

        ADC_Cmd(ADC1, ENABLE);
}

void adc1_watchDog_cfg(void)
{

        ADC_AnalogWatchdog1SingleChannelConfig(ADC1,ADC_Channel_3);
        ADC_AnalogWatchdog1ThresholdsConfig(ADC1,400,0);
        ADC_AnalogWatchdogCmd(ADC1,ADC_AnalogWatchdog_SingleRegEnable);
        ADC_ITConfig(ADC1,ADC_IT_AWD1,ENABLE);
}

void ad_gpio_cfg(void)
{
        GPIO_InitTypeDef gs;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
        // RCC_AHB1PeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
        gs.GPIO_Mode = GPIO_Mode_AN;
        gs.GPIO_OType = GPIO_OType_PP;
        gs.GPIO_PuPd = GPIO_PuPd_NOPULL;
        gs.GPIO_Speed = GPIO_Speed_50MHz;
        //PA1--->ADC1_IN2 PA2--->ADC1_IN3 PA4--->ADC2_IN1
        gs.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_4;
        GPIO_Init(GPIOA, &gs);
}

void adc_init(void)
{
        //VrefintCal = *((u16 *)(VREFINT_CAL_ADDR));
        ad_gpio_cfg();
        RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1);//RCC_ADC12PLLCLK_Div1
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE);

        ADC_DeInit(ADC1);
        adc1_init();
        adc1_watchDog_cfg();
        ADC_StartConversion(ADC1);
}

main函数
int main(void)
{
        ...
        while(1)
        {
        ADC_GetConversionValue(ADC1);
        }
        ...
}

收藏 评论4 发布时间:2020-3-30 21:46

举报

4个回答
wenyangzeng 回答时间:2020-4-2 10:03:57
貌似楼主在ADC中断里把ADC中断关闭了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

guojunjunjun200 回答时间:2020-4-8 21:23:40
ADC中断打开与否应该和模拟看门狗没什么关系吧
butterflyspring 回答时间:2020-4-15 16:46:23
关掉了中断,模拟看门狗即使动作了也进入不了中断了
李康1202 回答时间:2020-4-16 09:17:38
不是一个狗吧

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版