21ic问答首页 - HC32F460 KEUA 和JETA的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管脚,都是有电平的,且电平也是在变化.
不知是哪个环节出了问题?
谢谢
最近有个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管脚,都是有电平的,且电平也是在变化.
不知是哪个环节出了问题?
谢谢
赞0
评论
2022-01-21
赞0
评论
2021-12-15
赞0
您好,ADC初始化了的。 现在问题的现象是: 同样的程序再JETA封装中可以用,换到了KETA后不正常。 电路我查看了,应该没有问题
评论
2021-12-15
赞0
60PIN的型号,AVCC和AVSS就是参考电压和地,看看是否接的正确。应该和Vcc一样的电压
评论
2021-12-15
赞0
谢谢,我看了,这个是60Pin的管脚,没有参考电压
评论
2021-12-14
赞0
评论
2021-12-14
赞0
评论
2021-12-14
您需要登录后才可以回复 登录 | 注册