STM32F3 Comparator Interrupt Problem und wie Multiplexen

OP #3713324
Lesenswert?

Hallo Zusammen,

hat jemand schonmal den Comparator des STM32F303VCT6 vom STM32F3 
Discovery Board genutzt? Ich habe testweise ein Poti an PA1 
angeschlossen um das auslösen des Comparators zu testen. PA1 ist dabei 
der nicht invertierte Eingang (VREFINT versorgt den invertierten 
Eingang).
Der Ausgang des Comparators geht direkt auf einen Ausgang PF4 an dem 
eine LED angeschlossen ist. Dies funktioniert auch Problemlos. Die LED 
die durch den Systick getoggelt wird soll mir nur zeigen das der 
Controller noch lebt.

Nun zu meinem Problem:
Der Interrupt des Comparators funktioniert nicht so wie ich mir das 
vorstelle. Wenn die LED an PF4 leuchtet hat der Comparator ja ausgelöst. 
Dann müsste ja auch der Interrupt ausgelöst werden oder? Aber die LED 
die vom Interrupt des Comparators getoggelt werden soll verhält sich 
ganz anders.

Des Weiteren gibt es ja bei der Atmega Reihe meisst einen Multiplexer 
für den Comparator mit den man auf einen andere Quelleingang umschalten 
kann aber den gleichen Comperator nutzt. Wie könnte man das mit dem ST 
Controller realisieren?

1
#include "stm32f30x.h"
2
#include "stm32f3_discovery.h"
3
#include "main.h"
4

5
void comp_init(void);
6
void EXTI1_IRQHandler(void);
7
void SysTick_Handler(void);
8

9
uint32_t Timing = 0;
10

11
int main(void)
12
{
13
  // Quarz Einstellungen aktivieren
14
  SystemInit();
15
  SysTick_Config(SystemCoreClock/1000);
16

17
  STM_EVAL_LEDInit(LED3);
18
  STM_EVAL_LEDInit(LED4);
19
  STM_EVAL_LEDInit(LED5);
20
  STM_EVAL_LEDInit(LED9);
21
  STM_EVAL_LEDInit(LED10);
22
  STM_EVAL_LEDOn(LED3);
23
  STM_EVAL_LEDOn(LED4);
24
  STM_EVAL_LEDOn(LED5);
25

26
  comp_init();
27

28
    while(1)
29
    {
30
      //blank
31
    }
32
}
33

34
void comp_init(void)
35
{
36
  GPIO_InitTypeDef GPIO_InitStructure;
37
  COMP_InitTypeDef COMP_InitStructure;
38
  EXTI_InitTypeDef EXTI_InitStructure;
39
  NVIC_InitTypeDef NVIC_InitStructure;
40

41
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
42
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
43
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
44

45
  //Konfiguration des GPIO => PA1 als Input des Comparators
46
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
47
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
48
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
49
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
50
  GPIO_Init(GPIOA, &GPIO_InitStructure);
51

52
  //Konfiguration des GPIO => PF4 als Output des Comparators
53
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
54
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
55
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
56
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
57
  GPIO_Init(GPIOF, &GPIO_InitStructure);
58
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource4, GPIO_AF_2);
59

60
  //Konfiguration des Comp1
61
  COMP_InitStructure.COMP_InvertingInput = COMP_InvertingInput_VREFINT;
62
  COMP_InitStructure.COMP_NonInvertingInput = COMP_NonInvertingInput_IO1;
63
  COMP_InitStructure.COMP_Output = COMP_Output_None;
64
  COMP_InitStructure.COMP_BlankingSrce = COMP_BlankingSrce_None;
65
  COMP_InitStructure.COMP_OutputPol = COMP_OutputPol_NonInverted;
66
  COMP_InitStructure.COMP_Hysteresis = COMP_Hysteresis_No;
67
  COMP_InitStructure.COMP_Mode = COMP_Mode_HighSpeed;
68
  COMP_Init(COMP_Selection_COMP1, &COMP_InitStructure); // Enable COMP1 parameters
69
  COMP_Cmd(COMP_Selection_COMP1, ENABLE); // Enable COMP1
70

71
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1); //Connected EXTI Line to PA1 pin
72

73
  //Konfiguration des EXTI
74
  EXTI_InitStructure.EXTI_Line = EXTI_Line21; //Connected to the Comparator 1 event
75
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
76
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
77
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
78
  EXTI_Init(&EXTI_InitStructure);
79

80
  //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
81

82
  //Konfiguration des NVIC
83
  NVIC_InitStructure.NVIC_IRQChannel = COMP1_2_3_IRQn;
84
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
85
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
86
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
87
  NVIC_Init(&NVIC_InitStructure);
88
}
89

90
void COMP1_2_3_IRQHandler(void)
91
{
92
  EXTI_ClearITPendingBit(EXTI_Line21);
93
  STM_EVAL_LEDToggle(LED10);
94
}
95

96

97
void SysTick_Handler(void)
98
{
99
  Timing++;
100
  if(Timing == 500)
101
  {
102
    STM_EVAL_LEDToggle(LED9);
103
    Timing = 0;
104
  }
105
}

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