forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

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

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> ARM
 
hazardrok
Profesionál
Profesionál


Založen: 16.1.2012
Příspěvky: 131

PříspěvekZaslal: 17 červenec 2014, 10:28    Předmět: STM32F100 a ADC - ukládat změřená data přes DMA do bafru Citovat

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:
kód:

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;
    }
  }
= ~TIM_CR1_CEN; // Counter disable
ADC1-

Arrow administrator: přejmenováno z "STM32F100 a ADC"
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> ARM Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2017 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)