STM32F100 a ADC - ukládat změřená data přes DMA do bafru

Ahoj, mám prosbu. Nezkoušel někdo spouštět AD převodník externí událostí a ukládat změřená data přes DMA do bafru? Mě se to povedlo rozeběhnout tak, že když použiju timer4 v režimu PWM tak to bez problémů funguje tak jak bych chtěl. Problém ale nastal když jsem potřeboval použít tim4 na něco jiného a chtěl použít tim1. Podle datašitu to jde, ale ať dělám co dělám vždycky se mi spustí jen jeden odměr a pak to přestane fungovat.
Přikládám kód, který by podle mě měl fungovat:

[code]
void init_adc(void){
ADC1->CR1 = 0
| ADC_CR1_DISCEN; // Discontinuous mode on regular channels
ADC1->CR2 = 0
| ADC_CR2_ADON // A/D Converter ON / OFF
| ADC_CR2_EXTTRIG // External Trigger Conversion
| ADC_CR2_EXTSEL_1 // External Event Select - bit
| ADC_CR2_DMA // Direct Memory access mode
| ADC_CR2_TSVREFE // Temperature Sensor and VREFINT Enable
| ADC_CR2_CAL; // A/D Calibration
ADC1->SQR1 = 0
| ADC_SQR1_L_0 // Regular channel sequence length - 8
| ADC_SQR1_L_1
| ADC_SQR1_L_2;
ADC1->SQR2 = 0
| (ADC_SQR2_SQ7 & (ADC_SQR2_SQ7_4))
| (ADC_SQR2_SQ8 & (ADC_SQR2_SQ8_4 | ADC_SQR2_SQ8_0));
ADC1->SQR3 = 0;

ADC1->SMPR2 = 0
| ADC_SMPR2_SMP0_0
| ADC_SMPR2_SMP0_1
| ADC_SMPR2_SMP0_2;
ADC1->SMPR1 = 0
| ADC_SMPR1_SMP16_0
| ADC_SMPR1_SMP16_1
| ADC_SMPR1_SMP16_2
| ADC_SMPR1_SMP17_0
| ADC_SMPR1_SMP17_1
| ADC_SMPR1_SMP17_2;

while((ADC1->CR2 & ADC_CR2_CAL) != 0);

// timer je nastaven tak, aby kazdych 156,25us spustil AD prevodnik
TIM1->PSC = 1875 - 1;
TIM1->ARR = 1; // actual auto-reload Value
TIM1->CCMR2 = 0
| TIM_CCMR2_OC3PE // Enable CCR1 preloading
| TIM_CCMR2_OC3M_2 // PWM mode 1: OC3M = 110
| TIM_CCMR2_OC3M_1;
TIM1->CCER = TIM_CCER_CC3E; // Enable Capture/Compare output 3
TIM1->CCR3 = 1; // Capture/Compare 3 Value

init_dma_adc();
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
}

static void init_dma_adc(void){
DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR;
DMA1_Channel1->CMAR = (uint32_t)(pamet);
DMA1_Channel1->CNDTR = MERENYCH_AD_KANALU*VZORKOVANI;

DMA1_Channel1->CCR = 0
| DMA_CCR1_EN // Channel enable
| DMA_CCR1_PSIZE_0 // Peripheral size - Bit 1
| DMA_CCR1_MSIZE_0 // Memory size - Bit 1
| DMA_CCR1_MINC // Memory increment mode
| DMA_CCR1_TCIE // Transfer complete interrupt enable
| DMA_CCR1_PL_0 // Channel Priority level - Bit 0
| DMA_CCR1_PL_1; // Channel Priority level - Bit 1

ADC1->CR2 |= ADC_CR2_ADON; // A/D Converter ON / OFF

TIM1->CNT = 0; // NULL time register
TIM1->CR1 |= TIM_CR1_CEN; // Counter enable
}

void DMA1_Channel1_IRQHandler(void){
if(DMA1->ISR & DMA_ISR_TCIF1){
DMA1->IFCR |= DMA_IFCR_CTCIF1; // clear CTCIF flag
TIM1->CR1 &= ~TIM_CR1_CEN; // Counter disable
ADC1->CR2 &= ~ADC_CR2_ADON; // A/D Converter ON / OFF
DMA1_Channel1->CCR &= ~DMA_CCR1_EN; // Channel Disable
m_vyhodnoceni_ad = 1;
}
}
[/code]= ~TIM_CR1_CEN; // Counter disable
ADC1-

:arrow_right: administrator: přejmenováno z "STM32F100 a ADC"