本帖最后由 eltonchang2001 于 2022-11-9 11:30 编辑
HT32F52352芯片内部配有一个 12-bit 多通道 A/D 转换器,并提供了 14 个通道,其中包括 12 个提供模拟信号的外部通道和2 个内部通道。另外,A/D 转换器有3种工作模式,即单次转换、连续转换及非连续转换模式。 在外部模拟信号连接PA6的情况下,若采用连续转换模式,则输出的结果如图1至图3所示。 图1 接入3.3V 图2 悬空状态 图3 接地状态
测试的主程序为: #include "ht32.h"
#include "ht32_board.h"
#include "ht32_board_config.h"
void ADC_Configuration(void);
volatile bool gADC_SingleEndOfConversion;
vu32 gPotentiometerLevel;
int main(void)
{
RETARGET_Configuration();
ADC_Configuration();
ADC_Cmd(HTCFG_ADC_PORT, ENABLE);
ADC_SoftwareStartConvCmd(HTCFG_ADC_PORT, ENABLE);
while (1)
{
if (gADC_SingleEndOfConversion)
{
printf("\rPotentiometer level is %04d", (int)gPotentiometerLevel);
__Delay(1000000);
}
}
}
所添加的ADC配置函数为: void ADC_Configuration(void)
{
{
CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};
CKCUClock.Bit.AFIO = 1;
CKCUClock.Bit.HTCFG_ADC_IPN = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE);
}
AFIO_GPxConfig(HTCFG_VR_GPIO_ID, HTCFG_VR_AFIO_PIN, HTCFG_ADC_AFIO_MODE);
{
CKCU_SetADCnPrescaler(HTCFG_ADC_CKCU_ADCPRE, CKCU_ADCPRE_DIV64);
ADC_RegularGroupConfig(HTCFG_ADC_PORT, CONTINUOUS_MODE, 1, 0);
#if (LIBCFG_ADC_SAMPLE_TIME_BY_CH)
// The sampling time is set by the last parameter of the function "ADC_RegularChannelConfig()".
#else
ADC_SamplingTimeConfig(HTCFG_ADC_PORT, 0);
#endif
ADC_RegularChannelConfig(HTCFG_ADC_PORT, HTCFG_VR_ADC_CH, 0, 0);
ADC_RegularTrigConfig(HTCFG_ADC_PORT, ADC_TRIG_SOFTWARE);
}
ADC_IntConfig(HTCFG_ADC_PORT, ADC_INT_SINGLE_EOC, ENABLE);
NVIC_EnableIRQ(HTCFG_ADC_IRQn);
}
进行ADC中断处理的函数为: void HTCFG_ADC_IRQHandler(void)
{
extern vu32 gPotentiometerLevel;
extern volatile bool gADC_SingleEndOfConversion;
ADC_ClearIntPendingBit(HTCFG_ADC_PORT, ADC_FLAG_SINGLE_EOC);
gPotentiometerLevel = (HTCFG_ADC_PORT->DR[0] & 0x0FFF);
gADC_SingleEndOfConversion = TRUE;
}
此外,在ht32_board_config.h文件中需添加如下内容: #if (LIBCFG_NO_ADC)
#error "This example code does not apply to the chip you selected."
#endif
#define HTCFG_ADC_IPN ADC0
#if defined(USE_HT32F52352_SK)
#define _HTCFG_VR_GPIOX A
#define _HTCFG_VR_GPION 6
#define _HTCFG_VR_ADC_CHN 6
#endif
#define HTCFG_VR_GPIO_ID STRCAT2(GPIO_P, _HTCFG_VR_GPIOX)
#define HTCFG_VR_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_VR_GPION)
#define HTCFG_VR_ADC_CH STRCAT2(ADC_CH_, _HTCFG_VR_ADC_CHN)
#define HTCFG_ADC_PORT STRCAT2(HT_, HTCFG_ADC_IPN)
#define HTCFG_ADC_AFIO_MODE STRCAT2(AFIO_FUN_, HTCFG_ADC_IPN)
#define HTCFG_ADC_CKCU_ADCPRE STRCAT2(CKCU_ADCPRE_, HTCFG_ADC_IPN)
#define HTCFG_ADC_IRQn STRCAT2(HTCFG_ADC_IPN, _IRQn)
|