[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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.