问答

汇集网友智慧,解决技术难题

21ic问答首页 - HC32L110的ADC通道AdcAVccDiV3Input不能中断问题

HC32L110的ADC通道AdcAVccDiV3Input不能中断问题

yjsmcu2023-01-04
//使用\HC32L110_DDL_Rev1.1.5\example\adc\adc_cont_irq_sw范例改
/******************************************************************************
* Include files
******************************************************************************/
#include "adc.h"
#include "gpio.h"

/******************************************************************************
* Local pre-processor symbols/macros ('#define')                           
******************************************************************************/


/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/

/******************************************************************************
* Local type definitions ('typedef')                                         
******************************************************************************/

/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/

/******************************************************************************
* Local variable definitions ('static')                                      *
******************************************************************************/
static uint32_t u32AdcResultAcc;


/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/

void AdcContIrqCallback(void)
{   
    //中断标志位判断和清零,已在库函数中处理Adc_IRQHandler();

    Adc_GetAccResult(&u32AdcResultAcc);
    Adc_ClrAccResult();

    // Adc_ClrContIrqState();   
}
void AdcRegIrqCallback(void)
{   
    // 中断标志位判断和清零,已在库函数中处理Adc_IRQHandler();


    // Adc_ClrRegIrqState();   
}

void AdcHhtIrqCallback(void)
{   
    // 中断标志位判断和清零,已在库函数中处理Adc_IRQHandler();

    // Adc_ClrHhtIrqState();
}

void AdcLltIrqCallback(void)
{   
    // 中断标志位判断和清零,已在库函数中处理Adc_IRQHandler();


    // Adc_ClrLltIrqState();
}

/**
******************************************************************************
** \brief  Main function of project
**
** \return uint32_t return value, if needed
**
** This sample
**
******************************************************************************/
int32_t main(void)
{
    stc_adc_cfg_t             stcAdcCfg;
    stc_adc_cont_cfg_t        stcAdcContCfg;
    stc_adc_irq_t             stcAdcIrq;
    stc_adc_irq_calbakfn_pt_t stcAdcIrqCalbaks;


    DDL_ZERO_STRUCT(stcAdcCfg);
    DDL_ZERO_STRUCT(stcAdcContCfg);
    DDL_ZERO_STRUCT(stcAdcIrq);
    DDL_ZERO_STRUCT(stcAdcIrqCalbaks);

    Clk_SwitchTo(ClkRCL);
    Clk_SetRCHFreq(ClkFreq24Mhz);
    Clk_SwitchTo(ClkRCH);

    Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE);              //GPIO 外设时钟使能


    if (Ok != Clk_SetPeripheralGate(ClkPeripheralAdcBgr, TRUE))  //ADCBGR 外设时钟使能
    {
        return Error;
    }   

    //Gpio_SetAnalog(2, 4, TRUE);


    //ADC配置
    Adc_Enable();
    M0P_BGR->CR_f.BGR_EN = 0x1u;  //BGR必须使能
    M0P_BGR->CR_f.TS_EN = 0x0u;   //内置温度传感器,视使用需求
    delay100us(1);

    stcAdcCfg.enAdcOpMode = AdcContMode;                //连续采样模式
    stcAdcCfg.enAdcClkSel = AdcClkSysTDiv1;             //PCLK
    stcAdcCfg.enAdcSampTimeSel = AdcSampTime8Clk;       //8个采样时钟
    // stcAdcCfg.enAdcRefVolSel = RefVolSelInBgr2p5;    //参考电压:内部2.5V(avdd>3V,SPS<=200kHz)
    stcAdcCfg.enAdcRefVolSel = RefVolSelAVDD;           //参考电压:AVDD
    stcAdcCfg.bAdcInBufEn = TRUE;
    //stcAdcCfg.bAdcInBufEn = FALSE;                      //电压跟随器如果使能,SPS采样速率 <=200K
    stcAdcCfg.enAdcTrig0Sel = AdcTrigDisable;           //ADC转换自动触发设置
    stcAdcCfg.enAdcTrig1Sel = AdcTrigDisable;
    Adc_Init(&stcAdcCfg);   

    stcAdcIrq.bAdcIrq = TRUE;                            //转换完成中断函数入口配置使能
    stcAdcIrq.bAdcRegCmp = FALSE;
    stcAdcIrq.bAdcHhtCmp = FALSE;
    stcAdcIrq.bAdcLltCmp = FALSE;
    stcAdcIrqCalbaks.pfnAdcContIrq = AdcContIrqCallback; //转换完成中断入口函数
    stcAdcIrqCalbaks.pfnAdcRegIrq = AdcRegIrqCallback;
    stcAdcIrqCalbaks.pfnAdcHhtIrq = AdcHhtIrqCallback;
    stcAdcIrqCalbaks.pfnAdcLltIrq = AdcLltIrqCallback;
    Adc_ConfigIrq(&stcAdcIrq, &stcAdcIrqCalbaks);        //转换中断入口函数配置
    Adc_EnableIrq();                                     //中断使能
    Adc_CmpCfg(&stcAdcIrq);                              //结果比较中断使能/禁止配置


    stcAdcContCfg.enAdcContModeCh = AdcAVccDiV3Input;      //通道0 P24
    stcAdcContCfg.u8AdcSampCnt = 0x09u;                 //P24 连续累加次数(次数 = 0x09+1)
    stcAdcContCfg.bAdcResultAccEn = TRUE;               //累加使能
    Adc_ConfigContMode(&stcAdcCfg, &stcAdcContCfg);

    while(1)
    {
        Adc_Start();        //ADC开始转换

        delay1ms(1000);

    }
}

/******************************************************************************
* EOF (not truncated)
******************************************************************************/


回答 +关注 15
4728人浏览 9人回答问题 分享 举报
9 个回答
  • 这段代码是一个ADC模块的例程,使用了模块库函数。它通过设置ADC的一些配置信息,如ADC的工作模式、采样时间、规则采样间隔时间等来实现ADC的功能。
    具体而言,它实现了以下功能:
    • 初始化系统时钟,使能GPIO外设时钟和ADCBGR外设时钟。
    • 配置BGR,使能BGR以保证ADC正常工作。
    • 初始化ADC模块,包括ADC的连续采样模式、采样时间、规则采样间隔时间等。
    • 设置ADC的中断回调函数,分别对于连续采样完成、规则采样完成、采样高于预设阈值和采样低于预设阈值的情况进行回调。

    请注意,本例程并未配置ADC的规则采样,因此规则采样回调函数和高低阈值回调函数未使用。
  • 这个问题可能是由于 ADC 通道 AdcAVccDiV3Input 配置不正确导致的。您需要确保 ADC 通道已经正确配置并且通道中断已经被启用。您还可以检查 ADC 驱动代码中是否有任何错误,例如在 ADC 中断回调函数中缺少足够的代码来处理中断。

  • 其实就是那些  中断向量的指向  中断的开启 模块的初始化配置  
  • 楼主只开启了ad中断使能 好像没有开启总的中断使能
  • 你这个没有进入低功耗 也没有开启中断使能啊
  • 中断向量的配置那 是不是不小心给屏蔽掉了啊
  • 中断向量配置 是否开启总中断 是否开启ad采集中断等
  • 模拟量采集除了可以通过采集是否完成来进行中断唤醒外  还可以通过什么方式唤醒呢
  • 你的中断回调函数呢?

您需要登录后才可以回复 登录 | 注册