Код:
Добрый день!
Имеется контролер F030F4P6.
Нужно настроить 2 канала АЦП через DMA.
Так же имеется документ (RM0360) к нему, собственно по нему и велись настройки.
Проблема в том что не запускается. Ничего не измеряет. Выводит переменную на дисплей всегда "0"
В отладчике показывает что все настройки проходят а самого преобразования нет! И даже нет прерывания
по отправке по DMA ( конец передачи ). Я в хендлере установил переменную (DMA_Counter++;) чтобы как-то
смотреть что происходит, но ничего не происходи переменная не инкрементируется похоже что запросов нет.
Приложу код настроек ADC и DMA.
Кто знает укажите пожалуйста где я ошибся?
Последний кусок кода он расположен в main. Перед функцией int main(void).
Код:
void ADC_DMA_Init(void){
MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER3_Msk, 0b11 << GPIO_MODER_MODER3_Pos);
MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER4_Msk, 0b11 << GPIO_MODER_MODER4_Pos);
MODIFY_REG(ADC1->CFGR2, ADC_CFGR2_CKMODE_Msk, 0b01 << ADC_CFGR2_CKMODE_Pos);
SET_BIT(RCC->AHBENR, RCC_AHBENR_DMAEN);
DMA1_Channel1->CPAR = (uint32_t)&(ADC1->DR);
DMA1_Channel1->CMAR = (uint32_t)Adc;
DMA1_Channel1->CNDTR = 2;
MODIFY_REG(DMA1_Channel1->CCR, DMA_CCR_PL_Msk, 0b01 << DMA_CCR_PL_Pos);
CLEAR_BIT(DMA1_Channel1->CCR, DMA_CCR_DIR);
SET_BIT(DMA1_Channel1->CCR, DMA_CCR_CIRC);
MODIFY_REG(DMA1_Channel1->CCR, DMA_CCR_MSIZE_Msk, 0b01 << DMA_CCR_MSIZE_Pos);
MODIFY_REG(DMA1_Channel1->CCR, DMA_CCR_PSIZE_Msk, 0b01 << DMA_CCR_PSIZE_Pos);
SET_BIT(DMA1_Channel1->CCR, DMA_CCR_TCIE);
SET_BIT(DMA1_Channel1->CCR, DMA_CCR_MINC);
SET_BIT(DMA1_Channel1->CCR, DMA_CCR_EN);
SET_BIT(ADC1->CFGR1, ADC_CFGR1_DMAEN);
SET_BIT(ADC1->CFGR1, ADC_CFGR1_DMACFG);
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);
while(READ_BIT(ADC1->ISR, ADC_ISR_ADRDY));
CLEAR_BIT(ADC1->CR, ADC_CR_ADEN);
SET_BIT(ADC1->CR, ADC_CR_ADCAL);
while(READ_BIT(ADC1->ISR, ADC_CR_ADCAL));
MODIFY_REG(ADC1->SMPR, ADC_SMPR_SMP_Msk, 0b111 << ADC_SMPR_SMP_Pos);
SET_BIT(ADC1->CFGR1, ADC_CFGR1_OVRMOD);
SET_BIT(ADC1->CFGR1, ADC_CFGR1_CONT);
CLEAR_BIT(ADC1->CFGR1, ADC_CFGR1_SCANDIR);
SET_BIT(ADC1->CHSELR, ADC_CHSELR_CHSEL3);
SET_BIT(ADC1->CHSELR, ADC_CHSELR_CHSEL4);
SET_BIT(ADC1->CR, ADC_CR_ADEN);
SET_BIT(ADC1->CR, ADC_CR_ADSTART);
}
void DMA1_Channel1_IRQHandler(void){
if(READ_BIT(DMA1->ISR, DMA_ISR_TCIF1)){
SET_BIT(DMA1->IFCR, DMA_IFCR_CTCIF1);
}
DMA_Counter++;
}