搜索

[综合信息] HC 32F003 ADC操作函数

[复制链接]
238|25
 楼主 | 2020-3-25 20:31 | 显示全部楼层 |阅读模式
使能NVIC中ADC中断
  1. static void AdcEnableNvic(IRQn_Type enIrqn)
  2. {
  3.     NVIC_ClearPendingIRQ(enIrqn);
  4.     NVIC_EnableIRQ(enIrqn);
  5.     NVIC_SetPriority(enIrqn, DDL_IRQ_LEVEL_DEFAULT);
  6. }
复制代码


使用特权

评论回复
 楼主 | 2020-3-25 20:32 | 显示全部楼层
除能NVIC中ADC中断
  1. static void AdcDisableNvic(IRQn_Type enIrqn)
  2. {
  3.     NVIC_ClearPendingIRQ(enIrqn);
  4.     NVIC_DisableIRQ(enIrqn);
  5.     NVIC_SetPriority(enIrqn, DDL_IRQ_LEVEL_DEFAULT);
  6. }
复制代码


使用特权

评论回复
 楼主 | 2020-3-25 20:35 | 显示全部楼层
ADC中断服务程序
void Adc_IRQHandler(uint8_t u8Param)
{
    if (TRUE == M0P_ADC->IFR_f.REG_INTF)
    {
        if (NULL != stcAdcIrqCalbaks.pfnAdcRegIrq)
        {
            stcAdcIrqCalbaks.pfnAdcRegIrq();
        }
        M0P_ADC->ICLR_f.REG_INTC = 0u;
    }

    if (TRUE == M0P_ADC->IFR_f.HHT_INTF)
    {
        if (NULL != stcAdcIrqCalbaks.pfnAdcHhtIrq)
        {
            stcAdcIrqCalbaks.pfnAdcHhtIrq();
        }
        M0P_ADC->ICLR_f.HHT_INTC = 0u;
    }

    if (TRUE == M0P_ADC->IFR_f.LLT_INTF)
    {
        if (NULL != stcAdcIrqCalbaks.pfnAdcLltIrq)
        {
            stcAdcIrqCalbaks.pfnAdcLltIrq();
        }
        M0P_ADC->ICLR_f.LLT_INTC = 0u;
    }

    if (TRUE == M0P_ADC->IFR_f.CONT_INTF)
    {
        if (NULL != stcAdcIrqCalbaks.pfnAdcContIrq)
        {
            stcAdcIrqCalbaks.pfnAdcContIrq();
        }
        M0P_ADC->ICLR_f.CONT_INTC = 0u;
    }
}

使用特权

评论回复
 楼主 | 2020-3-25 20:36 | 显示全部楼层
配置ADC中断
void Adc_ConfigIrq(stc_adc_irq_t* pstcAdcIrqCfg,
                   stc_adc_irq_calbakfn_pt_t* pstcAdcIrqCalbaks)
{
    if (TRUE == pstcAdcIrqCfg->bAdcIrq)
    {
        if (NULL != pstcAdcIrqCalbaks->pfnAdcContIrq)
        {
            stcAdcIrqCalbaks.pfnAdcContIrq = pstcAdcIrqCalbaks->pfnAdcContIrq;
        }
    }

    if (TRUE == pstcAdcIrqCfg->bAdcRegCmp)
    {
        if (NULL != pstcAdcIrqCalbaks->pfnAdcRegIrq)
        {
            stcAdcIrqCalbaks.pfnAdcRegIrq = pstcAdcIrqCalbaks->pfnAdcRegIrq;
        }
    }

    if (TRUE == pstcAdcIrqCfg->bAdcHhtCmp)
    {
        if (NULL != pstcAdcIrqCalbaks->pfnAdcHhtIrq)
        {
            stcAdcIrqCalbaks.pfnAdcHhtIrq = pstcAdcIrqCalbaks->pfnAdcHhtIrq;
        }
    }

    if (TRUE == pstcAdcIrqCfg->bAdcLltCmp)
    {
        if (NULL != pstcAdcIrqCalbaks->pfnAdcLltIrq)
        {
            stcAdcIrqCalbaks.pfnAdcLltIrq = pstcAdcIrqCalbaks->pfnAdcLltIrq;
        }
    }
}

使用特权

评论回复
 楼主 | 2020-3-25 20:37 | 显示全部楼层
获取ADC中断状态
void Adc_GetIrqState(stc_adc_irq_t* pstcAdcIrqState)
{
    pstcAdcIrqState->bAdcIrq = M0P_ADC->IFR_f.CONT_INTF;
    pstcAdcIrqState->bAdcRegCmp = M0P_ADC->IFR_f.REG_INTF;
    pstcAdcIrqState->bAdcHhtCmp = M0P_ADC->IFR_f.HHT_INTF;
    pstcAdcIrqState->bAdcLltCmp = M0P_ADC->IFR_f.LLT_INTF;
}

使用特权

评论回复
 楼主 | 2020-3-25 20:37 | 显示全部楼层
清除ADC CONT中断状态
void Adc_ClrContIrqState(void)
{
    M0P_ADC->ICLR = ~(1<<3);
}

使用特权

评论回复
 楼主 | 2020-3-25 20:38 | 显示全部楼层
清除ADC REG中断状态
void Adc_ClrRegIrqState(void)
{
    M0P_ADC->ICLR = ~(1<<2);
}

使用特权

评论回复
 楼主 | 2020-3-25 20:39 | 显示全部楼层
清除ADC HHT中断状态
void Adc_ClrHhtIrqState(void)
{
    M0P_ADC->ICLR = ~(1<<1);
}
清除ADC LLT中断状态
void Adc_ClrIrqLltState(void)
{
    M0P_ADC->ICLR = ~1;
}

使用特权

评论回复
 楼主 | 2020-3-25 20:41 | 显示全部楼层
ADC中断使能
void Adc_EnableIrq(void)
{
    M0P_ADC->CR0_f.IE = 1u;
}

使用特权

评论回复
 楼主 | 2020-3-25 20:42 | 显示全部楼层
ADC比较使能
void Adc_CmpCfg(stc_adc_irq_t* pstcAdcIrqCfg)
{
    if (TRUE == pstcAdcIrqCfg->bAdcRegCmp)
    {
        M0P_ADC->CR1_f.REGCMP = 1u;
    }
    else
    {
        M0P_ADC->CR1_f.REGCMP = 0u;
    }

    if (TRUE == pstcAdcIrqCfg->bAdcHhtCmp)
    {
        M0P_ADC->CR1_f.HTCMP = 1u;
    }
    else
    {
        M0P_ADC->CR1_f.HTCMP = 0u;
    }

    if (TRUE == pstcAdcIrqCfg->bAdcLltCmp)
    {
        M0P_ADC->CR1_f.LTCMP = 1u;
    }
    else
    {
        M0P_ADC->CR1_f.LTCMP = 0u;
    }

    AdcEnableNvic(ADC_IRQn);
}

使用特权

评论回复
 楼主 | 2020-3-25 20:44 | 显示全部楼层
ADC中断除能
void Adc_DisableIrq(void)
{
    uint32_t u32Cr1;
   
    M0P_ADC->CR0_f.IE = 0u;
   
    u32Cr1 = M0P_ADC->CR1 | (1<<15);    // must write 1 to bit 15 to avoid clear ADC_result_acc
    u32Cr1 &= ~((1u<<12)|(1u<<13)|(1u<<14));
    M0P_ADC->CR1 = u32Cr1;
    AdcDisableNvic(ADC_IRQn);
}

使用特权

评论回复
 楼主 | 2020-3-25 20:45 | 显示全部楼层
ADC初始化
en_result_t Adc_Init(stc_adc_cfg_t* pstcAdcConfig)
{
    if (NULL == pstcAdcConfig)
    {
        return ErrorInvalidParameter;
    }

    M0P_ADC->CR0_f.CLKSEL = pstcAdcConfig->enAdcClkSel;
    M0P_ADC->CR0_f.SAM = pstcAdcConfig->enAdcSampTimeSel;
    M0P_ADC->CR0_f.SREF = pstcAdcConfig->enAdcRefVolSel;
    M0P_ADC->CR0_f.BUFEN = pstcAdcConfig->bAdcInBufEn;
    M0P_ADC->HT_f.HT = pstcAdcConfig->u32AdcRegHighThd;
    M0P_ADC->LT_f.LT = pstcAdcConfig->u32AdcRegLowThd;
    M0P_ADC->CR1_f.TRIGS0 = pstcAdcConfig->enAdcTrig0Sel;
    M0P_ADC->CR1_f.TRIGS1 = pstcAdcConfig->enAdcTrig1Sel;
    M0P_ADC->CR0_f.IE = 0u;
    M0P_ADC->CR1_f.REGCMP = 0u;
    M0P_ADC->CR1_f.HTCMP = 0u;
    M0P_ADC->CR1_f.LTCMP = 0u;

    return Ok;
}

使用特权

评论回复
 楼主 | 2020-3-25 20:47 | 显示全部楼层
复位ADC
void Adc_DeInit(void)
{
    AdcDisableNvic(ADC_IRQn);

    M0P_ADC->CR0_f.ADCEN = 0u;

    M0P_ADC->CR0_f.IE = 0u;
    M0P_ADC->CR1_f.REGCMP = 0u;
    M0P_ADC->CR1_f.HTCMP = 0u;
    M0P_ADC->CR1_f.LTCMP = 0u;
    M0P_ADC->ICLR_f.CONT_INTC = 0u;
    M0P_ADC->ICLR_f.REG_INTC = 0u;
    M0P_ADC->ICLR_f.HHT_INTC = 0u;
    M0P_ADC->ICLR_f.LLT_INTC = 0u;

    M0P_ADC->CR0_f.CLKSEL = 0u;
    M0P_ADC->CR0_f.SAM = 0x2u;
    M0P_ADC->CR0_f.SREF = 0x3u;
    M0P_ADC->CR0_f.SEL = 0xFu;
    M0P_ADC->CR0_f.BUFEN = 0u;
    M0P_ADC->HT_f.HT = 0xFFFu;
    M0P_ADC->LT_f.LT = 0u;
    M0P_ADC->CR1_f.TRIGS0 = 0u;
    M0P_ADC->CR1_f.TRIGS1 = 0u;
}

使用特权

评论回复
 楼主 | 2020-3-25 20:52 | 显示全部楼层
ADC转换开始
void Adc_Start(void)
{
    M0P_ADC->ICLR_f.CONT_INTC = 0u;
    M0P_ADC->CR0_f.STATERST = 1u;
    M0P_ADC->CR0_f.START = 1u;
}

使用特权

评论回复
 楼主 | 2020-3-25 20:58 | 显示全部楼层
ADC转换停止
void Adc_Stop(void)
{
    M0P_ADC->CR0_f.START = 0u;
}

使用特权

评论回复
 楼主 | 2020-3-25 21:00 | 显示全部楼层
ADC 配置普通转换模式
en_result_t Adc_ConfigNormMode(stc_adc_cfg_t* pstcAdcConfig, stc_adc_norm_cfg_t* pstcAdcNormCfg)
{
    if ((NULL == pstcAdcNormCfg) || (NULL == pstcAdcConfig))
    {
        return ErrorInvalidParameter;
    }

    pstcAdcConfig->enAdcOpMode = AdcNormalMode;
    M0P_ADC->CR1_f.CT = 0u;
    M0P_ADC->CR0_f.SEL = pstcAdcNormCfg->enAdcNormModeCh;
    M0P_ADC->CR1_f.RACC_EN = pstcAdcNormCfg->bAdcResultAccEn;

    return Ok;
}

使用特权

评论回复
 楼主 | 2020-3-25 21:01 | 显示全部楼层
配置连续转换模式
en_result_t Adc_ConfigContMode(stc_adc_cfg_t* pstcAdcConfig, stc_adc_cont_cfg_t* pstcAdcContCfg)
{
    if ((NULL == pstcAdcContCfg) || (NULL == pstcAdcConfig))
    {
        return ErrorInvalidParameter;
    }

    pstcAdcConfig->enAdcOpMode = AdcContMode;
    M0P_ADC->CR1_f.CT = 1u;
    M0P_ADC->CR0_f.SEL = pstcAdcContCfg->enAdcContModeCh;
    M0P_ADC->CR1_f.RACC_EN = pstcAdcContCfg->bAdcResultAccEn;
    if (pstcAdcContCfg->bAdcResultAccEn)
    {
        M0P_ADC->CR1_f.RACC_CLR = 1u;
    }
    M0P_ADC->CR2 = 1<<pstcAdcContCfg->enAdcContModeCh;
    M0P_ADC->CR2_f.ADCCNT = pstcAdcContCfg->u8AdcSampCnt;

    return Ok;
}

使用特权

评论回复
 楼主 | 2020-3-25 21:06 | 显示全部楼层
配置扫描转换模式
en_result_t Adc_ConfigScanMode(stc_adc_cfg_t* pstcAdcConfig, stc_adc_scan_cfg_t* pstcAdcScanCfg)
{
    if ((NULL == pstcAdcScanCfg) || (NULL == pstcAdcConfig))
    {
        return ErrorInvalidParameter;
    }

    pstcAdcConfig->enAdcOpMode = AdcScanMode;
    M0P_ADC->CR1_f.CT = 1u;
    M0P_ADC->CR2 = pstcAdcScanCfg->u8AdcScanModeCh;
    M0P_ADC->CR2_f.ADCCNT = pstcAdcScanCfg->u8AdcSampCnt;

    return Ok;
}

使用特权

评论回复
 楼主 | 2020-3-25 21:07 | 显示全部楼层
查询ADC转换状态
boolean_t Adc_PollBusyState(void)
{
    return M0P_ADC->CR0_f.START;
}

使用特权

评论回复
 楼主 | 2020-3-25 21:08 | 显示全部楼层
获取采样值
en_result_t Adc_GetResult(uint16_t* pu16AdcResult)
{
    if (NULL == pu16AdcResult)
    {
        return ErrorInvalidParameter;
    }

    *pu16AdcResult = M0P_ADC->RESULT_f.RESULT;

    return Ok;
}

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表