[stm32] ADC interupt ist aktiv löst aber nicht aus

OP #3077874
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
}
OP #3077884
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
}
Gast #3078014
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren