本帖最后由 martinhu 于 2019-5-27 09:36 编辑
你没看明白我的意思,我是说,可以通过区间比较中断的方式用中断处理。因为这里面就是两个中断,一个是连续转换的中断,一个是区间比较的中断,你不能用单次转换来使用连续转换的中断吧?
看你的代码是用寄存器写的,我刚刚也写了一下,分别是用单次采样的查询和中断两种方式采样1/3Vcc和内部温度传感器,
请参考:
这个是查询方式(main.c文件)
int32_t main(void)
{
M0P_CLOCK->PERI_CLKEN_f.ADC = 1;
M0P_CLOCK->PERI_CLKEN_f.GPIO = 1;
M0P_ADC->CR0_f.ADCEN = 1u;
M0P_BGR->CR_f.BGR_EN = 0x1u; //BGR enable
M0P_BGR->CR_f.TS_EN = 0x1u;
delay100us(1);
M0P_ADC->CR1_f.CT = 0;
M0P_ADC->CR0_f.SREF = 1; //2.5V
M0P_ADC->CR0_f.CLKSEL = 0; //0:PCLK,
M0P_ADC->CR0_f.SAM = 3; //3:12 clk,
M0P_ADC->CR0_f.BUFEN = 1;
/*
When System clk is 4MHz, ADC SPS = 4MHz / (12+ 16) = 143K.
If the BUFEN is set as enable, the ADC SPS must be set less than 200K
*/
while (1)
{
M0P_ADC->CR0_f.SEL = 9; //1/3Vcc
M0P_ADC->CR0_f.START = 1;
while(1 == M0P_ADC->CR0_f.START);
u16AdcVal01 = M0P_ADC->RESULT_f.RESULT;
M0P_ADC->CR0_f.SEL = 10; //temprature
M0P_ADC->CR0_f.START = 1;
while(1 == M0P_ADC->CR0_f.START);
u16AdcVal02 = M0P_ADC->RESULT_f.RESULT;
}
}
这个是中断方式:
(main.c文件)
void Adc_Int(void)
{
if(1 == M0P_ADC->IFR_f.HHT_INTF)
{
if(9 == u8FlagChannel)
{
u16AdcVal01 = M0P_ADC->RESULT_f.RESULT;
}
else if( 10 == u8FlagChannel)
{
u16AdcVal02 = M0P_ADC->RESULT_f.RESULT;
}
else
{
}
M0P_ADC->ICLR_f.HHT_INTC = 0;
}
}
int32_t main(void)
{
M0P_CLOCK->PERI_CLKEN_f.ADC = 1;
M0P_CLOCK->PERI_CLKEN_f.GPIO = 1;
M0P_ADC->CR0_f.ADCEN = 1u;
M0P_BGR->CR_f.BGR_EN = 0x1u; //BGR enable
M0P_BGR->CR_f.TS_EN = 0x1u;
delay100us(1);
M0P_ADC->CR1_f.CT = 0;
M0P_ADC->CR0_f.SREF = 1; //2.5V
M0P_ADC->CR0_f.CLKSEL = 0; //0:PCLK,
M0P_ADC->CR0_f.SAM = 3; //3:12 clk,
M0P_ADC->CR0_f.BUFEN = 1;
/*
When System clk is 4MHz, ADC SPS = 4MHz / (12+ 16) = 143K.
If the BUFEN is set as enable, the ADC SPS must be set less than 200K
*/
M0P_ADC->HT_f.HT = 0;
//M0P_ADC->LT_f.LT = 0;
//M0P_ADC->CR1_f.REGCMP = 1;
M0P_ADC->CR1_f.HTCMP = 1;
//M0P_ADC->CR1_f.LTCMP = 1;
M0P_ADC->CR0_f.IE = 1;
EnableNvic(ADC_IRQn,3,TRUE);
while (1)
{
M0P_ADC->CR0_f.SEL = 9; //1/3Vcc
u8FlagChannel = 9;
M0P_ADC->CR0_f.START = 1;
delay100us(1);
M0P_ADC->CR0_f.SEL = 10; //temprature
u8FlagChannel = 10;
M0P_ADC->CR0_f.START = 1;
delay100us(1);
}
}
(interrupts_hc32l110.c文件):
void ADC_IRQHandler(void)
{
//Adc_IRQHandler(0);
Adc_Int();
}
(interrupts_hc32l110.h文件):
extern void Adc_Int(void);
|
|