Forum: Mikrocontroller und Digitale Elektronik [stm32] ADC interupt ist aktiv löst aber nicht aus


von stef b. (joe_)


Lesenswert?

Hallo! leider funktioniert mein ADC interrupt nicht. deshalb hab ich mal 
alles bis auf den ADC und den interupt handler gelöscht ... aber 
trotzdem gehts nicht. der interupt ist enabled und aktiv, aber trotzdem 
springt er nicht in die interrupt routine! kann mir jemand helfen?
1
#include "stm32f10x.h"
2
int value;
3
4
int main(void)
5
{
6
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // GPIOC clock
7
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // ADC clock
8
  
9
/* Input @ PC0 */
10
GPIOC->CRL  &= ~GPIO_CRL_MODE0;  // Input
11
GPIOC->CRL  &= ~GPIO_CRL_CNF0;  // Analog
12
ADC1->CR2 |= ADC_CR2_ADON | ADC_CR2_CONT; // ADC wakeup , continous
13
ADC1->SMPR1 &= ~ADC_SMPR1_SMP10; // set sample time for channel 10 to 1.5 
14
ADC1->SQR1 &= ~ADC_SQR1_L; // 1 conversions
15
ADC1->SQR3 |= ADC_SQR3_SQ1_1 | ADC_SQR3_SQ1_3; // channel 10 is first
16
ADC1->CR1 |= ADC_CR1_EOCIE;// enable interrupt at EOC
17
ADC1->CR2|= ADC_CR2_CAL;// start ADC calibration
18
while(ADC1->CR2 & ADC_CR2_CAL){} // wait during calibration 
19
NVIC_EnableIRQ(ADC1_IRQn); // enable ADC interrupt
20
ADC1->CR2   |= ADC_CR2_ADON;
21
  
22
while(1){}
23
}
24
25
void ADC1_IRQHandler(void)
26
{
27
 if(ADC1->SR & ADC_SR_EOC) 
28
 {
29
  value = ADC1->DR;
30
 }
31
}

von Ingo (Gast)


Lesenswert?

Du müsstest auch das Interruptflag mal löschen, per Hand...

von stef b. (joe_)


Lesenswert?

das macht keinen Unterschied! es wird beim lesen von ADC1->DR 
automatisch gelöscht!
1
void ADC1_IRQHandler(void)
2
{
3
  if(ADC1->SR & ADC_SR_EOC) 
4
  {
5
    ADC1->SR &= ~ADC_SR_EOC;
6
    value = ADC1->DR;
7
  }
8
}

-> probiert und keine Änderung

von stef b. (joe_)


Lesenswert?

habs mal um eine LED erweitert! die sollte dann beim betreten der 
routine eingeschaltet werden ... wird sie aber nicht!
1
#include "stm32f10x.h"
2
int value;
3
4
int main(void)
5
{
6
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // GPIOC clock
7
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // ADC clock
8
  
9
/* LED @ PC8*/
10
GPIOC->CRH |= GPIO_CRH_MODE8_1; // Output 2MHz        
11
GPIOC->CRH &= ~GPIO_CRH_CNF8;  // General push-pull
12
13
/* Input @ PC0 */
14
GPIOC->CRL  &= ~GPIO_CRL_MODE0;  // Input
15
GPIOC->CRL  &= ~GPIO_CRL_CNF0;  // Analog
16
ADC1->CR2 |= ADC_CR2_ADON | ADC_CR2_CONT; // ADC wakeup , continous
17
ADC1->SMPR1 &= ~ADC_SMPR1_SMP10; // set sample time for channel 10 to 1.5 
18
ADC1->SQR1 &= ~ADC_SQR1_L; // 1 conversions
19
ADC1->SQR3 |= ADC_SQR3_SQ1_1 | ADC_SQR3_SQ1_3; // channel 10 is first
20
ADC1->CR1 |= ADC_CR1_EOCIE;// enable interrupt at EOC
21
ADC1->CR2|= ADC_CR2_CAL;// start ADC calibration
22
while(ADC1->CR2 & ADC_CR2_CAL){} // wait during calibration 
23
NVIC_EnableIRQ(ADC1_IRQn); // enable ADC interrupt
24
ADC1->CR2   |= ADC_CR2_ADON;
25
  
26
while(1){}
27
}
28
29
void ADC1_IRQHandler(void)
30
{
31
 if(ADC1->SR & ADC_SR_EOC) 
32
 {
33
  ADC1->SR &= ~ADC_SR_EOC;
34
  GPIOC->BSRR |= GPIO_BSRR_BS8; 
35
  value = ADC1->DR;
36
 }
37
}

von gonzo (Gast)


Lesenswert?

Hi, habe nicht mehr alles genau im Kopf aber weckst du den ADC aus dem 
deep sleep Mode auf? Hast du mal versucht einfach per Hand über SW 
Trigger zu wandeln? Geht das? Ich glaube auch im Continuos Mode muss der 
erste Trigger per SW generiert werden. Passen die Register Inhalte 
ansonsten?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.