问答

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

21ic问答首页 - HC32F460 KEUA 和JETA的ADC问题

hc32f460 KEUA ADC

HC32F460 KEUA 和JETA的ADC问题 赏800家园币

HelloOK1232021-12-14
大家好,之前购买了几块HC32F460的开发板。其中也包括JETA型号的。
最近有个KEUA的型号需要调试,调试ADC时,发现数据不更新(同样的程序在JETA等开发板上都正常)。

//----以下是ADC的配置-----------
// ADC初始化
void AdcConfig(void)
{
    AdcClockConfig();
    AdcInitConfig();
    AdcChannelConfig();
}


// ADC时钟直接使用 ClkPeriSrcPclk
static void AdcClockConfig(void)
{
    /* Set bus clock division, depends on the system clock frequency. */
//    m_stcSysclkCfg.enPclk2Div = ClkSysclkDiv64;
//    m_stcSysclkCfg.enPclk4Div = ClkSysclkDiv16;


//    CLK_SysClkConfig(&m_stcSysclkCfg);
    CLK_SetPeriClkSource(ClkPeriSrcPclk);


}


void AdcInitConfig(void)
{
    stc_adc_init_t stcAdcInit;


    MEM_ZERO_STRUCT(stcAdcInit);


   stcAdcInit.enResolution = AdcResolution_12Bit;
    stcAdcInit.enDataAlign  = AdcDataAlign_Right;
    stcAdcInit.enAutoClear  = AdcClren_Disable;
    stcAdcInit.enScanMode   = AdcMode_SAOnce;; //单次采样
    /* 1. Enable ADC1. */
    PWC_Fcg3PeriphClockCmd(PWC_FCG3_PERIPH_ADC1, Enable);
    /* 2. Initialize ADC1. */
    ADC_Init(M4_ADC1, &stcAdcInit);
}




#define ADC1_SA_CHANNEL_COUNT       (3u)
void AdcChannelConfig(void)
{
    stc_adc_ch_cfg_t stcChCfg;
        uint8_t au8Adc1SaSampTime[ADC1_SA_CHANNEL_COUNT] = { 0x60,0x80,0x80};
    MEM_ZERO_STRUCT(stcChCfg);


    stcChCfg.u32Channel  = (ADC1_CH0 | ADC1_CH1| ADC1_CH2);
    stcChCfg.u8Sequence  = ADC_SEQ_A;
    stcChCfg.pu8SampTime = au8Adc1SaSampTime;
    /* 1. Set the ADC pin to analog mode. */
    AdcSetChannelPinMode(M4_ADC1, (ADC1_CH0 | ADC1_CH1| ADC1_CH2), Pin_Mode_Ana);  
    /* 2. Add ADC channel. */
    ADC_AddAdcChannel(M4_ADC1, &stcChCfg);

}

//---以下是测试的main程序----
int32_t main(void)
{
        UseXTAL();//使用外部16M晶振
        //ADC初始化
        AdcConfig();
        ADC_StartConvert(M4_ADC1);// ADC软起动
        while(1)
        {
                Ddl_Delay1ms(1000);
                ADC_GetAllData(M4_ADC1, m_au16Adc1Value, ADC1_CH_COUNT);//读取ADC结果
                ADC_ClrEocFlag(M4_ADC1, ADC_SEQ_A);
                ADC_StartConvert(M4_ADC1);// ADC软起动--重新启动
        }
}


以上代码,在JETA开发板中正常,但是在KEUA板子中,调试发现数值没有变化,即DR寄存器数值的值都没有变化
ADC_GetAllData 会调用 ADC_ReadAllData 读取ADCx->DR
static void ADC_ReadAllData(const M4_ADC_TypeDef *ADCx, uint16_t *pu16AdcData, uint8_t u8Length)
{
    uint8_t i;
    __IO const uint16_t *pu16DataReg = &(ADCx->DR0);

    for (i = 0u; i < u8Length; i++)
    {
        pu16AdcData = pu16DataReg;
    }
}

电路应该是没有问题的,万用表测量的相关ADC的IO管脚,都是有电平的,且电平也是在变化.
不知是哪个环节出了问题?
谢谢







回答 +关注 16
23845人浏览 7人回答问题 分享 举报
7 个回答

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