不是的,我们的单电阻电机demo就是这样操作的,ADCHW触发,step采样完成后,切换成ADCSW触发,continue采样,完成后切换回ADCHW触发,是这个意思吧,ME0是这样做的,别的芯片也一样,寄存器操作有细微区别
void HW_SetupAdcSeq1Mode(const uint8_t *channels, uint8_t channel_cnt, const isr_t adcISR)
{
ADC_Type *base = ADC0;
/* Setup adc configuration */
base->CFG0 = ((channel_cnt - 1) & 0xFU) << ADC_CFG0_SEQLEN_SHIFT | /* Sequence length */
ADC_CFG0_DISCEN(1U) |
ADC_CFG0_CONT(0U) |
ADC_CFG0_TRIGMD(1U);
base->CFG1 = ADC_CFG1_STCNT(32U) | ADC_CFG1_PRS(0); /* Start time count */
base->SMP = ADC_SMP_SMP(1U); /* Sample time */
/* Configure sequence 0 channels for current sensing */
ADC0->CHSEL[0] = ADC_CHSEL_CHSEL(ADC_V_PHASE_CHANNEL);
ADC0->CHSEL[1] = ADC_CHSEL_CHSEL(ADC_V_PHASE_CHANNEL);
base->INTE = ADC_INTE_EOSEQIE(1U); /* Enable end of sequence interrupt */
INT_SYS_InstallHandler(ADC0_IRQn, adcISR, NULL);
INT_SYS_EnableIRQ(ADC0_IRQn);
base->CTRL = ADC_CTRL_ADEN(1U); /* Enable ADC */
base->CTRL |= ADC_CTRL_ADSTART(1U); /* Start ADC */
while(!(base->STS & ADC_STS_ADRDY_MASK)); /* Wait for ADC ready */
}
void HW_SetupAdcSeq2Mode(const uint8_t *channels, uint8_t channel_cnt, const isr_t adcISR)
{
ADC_Type *base = ADC0;
/* Setup adc configuration */
base->CFG0 = ((channel_cnt - 1) & 0xFU) << ADC_CFG0_SEQLEN_SHIFT | /* Sequence length */
ADC_CFG0_CONT(0U) |
ADC_CFG0_DISCEN(0U) |
ADC_CFG0_TRIGMD(0U);
base->CFG1 = ADC_CFG1_STCNT(32U) | ADC_CFG1_PRS(0); /* Start time count */
base->SMP = ADC_SMP_SMP(16U); /* Sample time */
for (int i = 0; i < channel_cnt; i++)
{
base->CHSEL[i] = ADC_CHSEL_CHSEL(channels[i]); /* Setup channel */
}
base->INTE = ADC_INTE_EOSEQIE(1U); /* Enable end of sequence interrupt */
INT_SYS_InstallHandler(ADC0_IRQn, adcISR, NULL);
INT_SYS_EnableIRQ(ADC0_IRQn);
base->CTRL = ADC_CTRL_TSEN(1U) | /* Enable temperature sensor */
ADC_CTRL_ADEN(1U); /* Enable ADC */
base->CTRL |= ADC_CTRL_ADSTART(1U); /* Start ADC */
while(!(base->STS & ADC_STS_ADRDY_MASK)); /* Wait for ADC ready */
}
uint8_t ADCTrgCnt = 0U;
void Motor_AdcFOCISR(void)
{
// GPIOE->PSOR = 1 << 10;
/* Clear the interrupt flag */
MC_ADC->STS = ADC_STS_EOSEQ_MASK;
if(ADCTrgCnt == 0U)
{
CIM->SWTRIG = CIM_SWTRIG_SWT(1U) | CIM_SWTRIG_SWTCNT(0U);
/* User code */
ADCTrgCnt = 1;
HW_SetupAdcSeq2Mode(motorAdcFocUserSample2, 2, Motor_AdcFOCISR);
}
else
{
/* User code */
HW_SetupAdcSeq1Mode(motorAdcFocUserSample1, 2, Motor_AdcFOCISR);
ADCTrgCnt = 0U;
}
// GPIOE->PCOR = 1 << 10;
}