stm32jy 发表于 2021-1-16 14:02

HC32 ADC 中断扫描操作

///< ADC中断服务函数
void Adc_IRQHandler(void)
{   
    if(TRUE == Adc_GetIrqStatus(AdcMskIrqJqr))
    {
      Adc_ClrIrqStatus(AdcMskIrqJqr);
      
      u32AdcRestult0   = Adc_GetJqrResult(AdcJQRCH0MUX);
      u32AdcRestult2   = Adc_GetJqrResult(AdcJQRCH1MUX);
      u32AdcRestult5   = Adc_GetJqrResult(AdcJQRCH2MUX);
      u32AdcRestult0_1 = Adc_GetJqrResult(AdcJQRCH3MUX);
      
      Adc_JQR_Stop();
    }
}


stm32jy 发表于 2021-1-16 14:03

///< ADC采样端口初始化
void App_AdcPortInit(void)
{   
    ///< 开启ADC/BGR GPIO外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
   
    Gpio_SetAnalogMode(GpioPortA, GpioPin0);      //PA00 (AIN0)
    Gpio_SetAnalogMode(GpioPortA, GpioPin2);      //PA02 (AIN2)
    Gpio_SetAnalogMode(GpioPortA, GpioPin5);      //PA05 (AIN5)
}

stm32jy 发表于 2021-1-16 14:05

///< ADC模块初始化
void App_AdcInit(void)
{
    stc_adc_cfg_t            stcAdcCfg;

    DDL_ZERO_STRUCT(stcAdcCfg);
    Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
    Bgr_BgrEnable();      ///< 开启BGR
    ///< ADC 初始化配置
    stcAdcCfg.enAdcMode         = AdcScanMode;            ///<采样模式-扫描
    stcAdcCfg.enAdcClkDiv       = AdcMskClkDiv1;            ///<采样分频-1
    stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle8Clk;      ///<采样周期数-8
    stcAdcCfg.enAdcRefVolSel    = AdcMskRefVolSelAVDD;      ///<参考电压选择-VCC
    stcAdcCfg.enAdcOpBuf      = AdcMskBufDisable;         ///<OP BUF配置-关
    stcAdcCfg.enInRef         = AdcMskInRefDisable;       ///<内部参考电压使能-关
    stcAdcCfg.enAdcAlign      = AdcAlignRight;               ///<转换结果对齐方式-右
    Adc_Init(&stcAdcCfg);
}

stm32jy 发表于 2021-1-16 14:16

///< ADC插队扫描功能配置
void App_AdcJqrCfg(void)
{
    stc_adc_jqr_cfg_t          stcAdcJqrCfg;
   
    DDL_ZERO_STRUCT(stcAdcJqrCfg);
   
    ///< 插队扫描模式功能及通道配置
    ///< 注意:扫描模式下,当配置转换次数为n时,转换通道的配置范围必须为
    stcAdcJqrCfg.bJqrDmaTrig = FALSE;
    stcAdcJqrCfg.u8JqrCnt    = 4;
    Adc_JqrModeCfg(&stcAdcJqrCfg);

    Adc_CfgJqrChannel(AdcJQRCH0MUX, AdcExInputCH0);
    Adc_CfgJqrChannel(AdcJQRCH1MUX, AdcExInputCH2);
    Adc_CfgJqrChannel(AdcJQRCH2MUX, AdcExInputCH5);
    Adc_CfgJqrChannel(AdcJQRCH3MUX, AdcExInputCH0);
   
    ///< ADC 中断使能
    Adc_EnableIrq();
    EnableNvic(ADC_IRQn, IrqLevel3, TRUE);
   
    ///< 启动插队扫描采样
    Adc_JQR_Start();
}

stm32jy 发表于 2021-1-16 14:23

ADC 顺序扫描 功能配置
///< ADC 中断服务程序
void Adc_IRQHandler(void)
{   
    if(TRUE == Adc_GetIrqStatus(AdcMskIrqSqr))
    {
      Adc_ClrIrqStatus(AdcMskIrqSqr);
      
      u32AdcRestult0   = Adc_GetSqrResult(AdcSQRCH0MUX);//获取顺序扫描通道0
      u32AdcRestult2   = Adc_GetSqrResult(AdcSQRCH1MUX);//获取顺序扫描通道1
      u32AdcRestult5   = Adc_GetSqrResult(AdcSQRCH2MUX);//获取顺序扫描通道2
      
      u32AdcRestultAcc = Adc_GetAccResult();
      
      Adc_SQR_Stop();
    }
}

stm32jy 发表于 2021-1-16 15:29

///< ADC 采样端口初始化
void App_AdcPortInit(void)
{   
    ///< 开启GPIO外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
   
    Gpio_SetAnalogMode(GpioPortA, GpioPin0);      //PA00 (AIN0)
    Gpio_SetAnalogMode(GpioPortA, GpioPin2);      //PA02 (AIN2)
    Gpio_SetAnalogMode(GpioPortA, GpioPin5);      //PA05 (AIN5)
}

///< ADC 模块初始化
void App_AdcInit(void)
{
    stc_adc_cfg_t            stcAdcCfg;

    DDL_ZERO_STRUCT(stcAdcCfg);
   
    ///< 开启ADC/BGR外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
   
    Bgr_BgrEnable();      ///< 开启BGR
   
    ///< ADC 初始化配置
    stcAdcCfg.enAdcMode         = AdcScanMode;            ///<采样模式-扫描
    stcAdcCfg.enAdcClkDiv       = AdcMskClkDiv1;            ///<采样分频-1
    stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle8Clk;      ///<采样周期数-8
    stcAdcCfg.enAdcRefVolSel    = AdcMskRefVolSelAVDD;      ///<参考电压选择-VCC
    stcAdcCfg.enAdcOpBuf      = AdcMskBufDisable;         ///<OP BUF配置-关
    stcAdcCfg.enInRef         = AdcMskInRefDisable;       ///<内部参考电压使能-关
    stcAdcCfg.enAdcAlign      = AdcAlignRight;               ///<转换结果对齐方式-右
    Adc_Init(&stcAdcCfg);
}

///< ADC 顺序扫描 功能配置
void App_AdcSQRCfg(void)
{
    stc_adc_sqr_cfg_t          stcAdcSqrCfg;
   
    DDL_ZERO_STRUCT(stcAdcSqrCfg);
      
    ///< 顺序扫描模式功能及通道配置
    ///< 注意:扫描模式下,当配置转换次数为n时,转换通道的配置范围必须为
    stcAdcSqrCfg.bSqrDmaTrig = FALSE;
    stcAdcSqrCfg.enResultAcc = AdcResultAccEnable;
    stcAdcSqrCfg.u8SqrCnt    = 3;
    Adc_SqrModeCfg(&stcAdcSqrCfg);

    Adc_CfgSqrChannel(AdcSQRCH0MUX, AdcExInputCH0);
    Adc_CfgSqrChannel(AdcSQRCH1MUX, AdcExInputCH2);
    Adc_CfgSqrChannel(AdcSQRCH2MUX, AdcExInputCH5);
   
    ///< ADC 中断使能
    Adc_EnableIrq();
    EnableNvic(ADC_IRQn, IrqLevel3, TRUE);
   
    ///< 启动顺序扫描采样
    Adc_SQR_Start();

}   

stm32jy 发表于 2021-1-16 16:34

int32_t main(void)
{   
   
    ///< ADC 采样端口初始化
    App_AdcPortInit();
   
    ///< ADC 模块初始化
    App_AdcInit();
   
    ///< ADC 顺序扫描 功能配置
    App_AdcSQRCfg();
   
    while(1)
    {      
      ;
    }
}
页: [1]
查看完整版本: HC32 ADC 中断扫描操作