Forum: Mikrocontroller und Digitale Elektronik STM32 Input Capture an PC9


von Georg B. (xsitez)


Lesenswert?

Hallo Forum,

ich probiere schon seit einigen Stunden rum und lese mich durch diverse 
Foren und Beiträge. Leider habe ich noch nichts gefunden, was mein 
Problem erklärt.

Ausgangssituation:
Ich möchte an PC9 eine Frequenz messen.
1kHz +- max.

Meine bisherige Init hierzu:
1
  { // counter input configuration PC9
2
    // variables
3
    GPIO_InitTypeDef GPIO_InitStructure;
4
    EXTI_InitTypeDef EXTI_InitStructure;
5
    NVIC_InitTypeDef NVIC_InitStructure;
6
7
    // clock peripherals
8
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
9
10
    // PC9 input
11
    GPIO_StructInit(&GPIO_InitStructure);
12
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
13
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
14
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
15
    GPIO_Init(GPIOC, &GPIO_InitStructure);
16
17
    // PC9 for interrupt usage line9
18
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource9);
19
20
    // adjust for external interrupt
21
    EXTI_StructInit(&EXTI_InitStructure);
22
    EXTI_InitStructure.EXTI_Line = EXTI_Line9;                 // Line9 => PA9 | PB9 | ...
23
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                  // line activate
24
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        // interrupt mode
25
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;     // rising edge
26
    EXTI_Init(&EXTI_InitStructure);
27
28
    // EXTI_Line9 activation and prio
29
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;         // adjust for external interrupt line9
30
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; // max prio
31
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;      // 2nd prio
32
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            // activate int
33
    NVIC_Init(&NVIC_InitStructure);
34
  }

Interrupt:
1
void EXTI9_5_IRQHandler(void)
2
{
3
  // do not enter twice
4
  if(EXTI_GetITStatus(EXTI_Line9) != RESET)
5
  {
6
    // count the interrupts received, reset is done by time period (devtimer.c)
7
    u32Interrupts++;
8
9
    // clear the EXTI line 9 pending bit
10
    EXTI_ClearITPendingBit(EXTI_Line9);
11
  }
12
}

Dieser muß natürlich in stm32f10x_it.h als Prototyp bekanntgemacht 
werden.
1
void EXTI9_5_IRQHandler(void);  // this line for EXTI Line9

"Abgeholt" wird das Ganze von einem zweiten Interrupt, der alle 500ms 
den gezählten Wert in u32Interrupts ausliesst und rücksetzt.
1
Frequenz = u32Interrupts * 4; // calc frq
2
u32Interrupts = 0;            // reset for next time period

Mein Problem ist jetzt, dass der Interrupt EXTI9_5 etwa 9% zu viel 
zählt.
Trotz Entprellung in Hardware (10nF) und "sauberer" Rechteckkurve 
(50:50) vom Funktionsgenerator.

Kann mir hier jemand weiterhelfen?

Grüße,
XSiteZ

von Uwe B. (derexponent)


Lesenswert?

Hi Georg B,

bist du sicher das die Zeitbasis von deiner
Tor-Frq mit 500ms GENAU stimmt ?

du kannst zum test mal diese Init Funktion benutzen :
(hier für STM32F4 ...musst du event. abändern)
1
  GPIO_InitTypeDef   GPIO_InitStructure;
2
  EXTI_InitTypeDef   EXTI_InitStructure;
3
  NVIC_InitTypeDef   NVIC_InitStructure;
4
5
  // Clock enable (GPIO)
6
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
7
8
  // Config als Digital-Eingang
9
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
10
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
11
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
12
  GPIO_Init(GPIOC, &GPIO_InitStructure);
13
    
14
  // Clock enable (SYSCONFIG)
15
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 
16
17
  // EXT_INT9 mit Pin verbinden
18
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource9);
19
20
  // EXT_INT9 config
21
  EXTI_InitStructure.EXTI_Line = EXTI_Line9;
22
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
23
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
24
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
25
  EXTI_Init(&EXTI_InitStructure);
26
27
  // NVIC config
28
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
29
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
30
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
31
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
32
  NVIC_Init(&NVIC_InitStructure);


und...warum benutzt du nicht einen Timer im "Input-Capture-Mode" ?
wäre das nicht einfacher ?

Gruss Uwe

von Georg B. (xsitez)


Lesenswert?

Hallo,
ich habs mittlerweile am Laufen, aber ich habe vermutlich ein 
Performace-Problem bei ca 1kHz. Kann das sein?
Die Kurve am Oszi ist ok. Trotzdem bricht die berechnete Frequenz ein.
Ein Überlauf kann es nicht sein. Ist alles uint32_t. Das müßte ja ewig 
ausreichen...
Danke für den Tip Uwe. Ich werde dem nachgehen.
So wie es jetzt ist, ist es nicht praktikabel.
Ich melde mich, würde mich aber über Anregungen freuen, da ich bisher 
mit STM32 Timern nicht viel am Hut hatte.
Grüße,
XSiteZ

von Uwe B. (derexponent)


Lesenswert?

>aber ich habe vermutlich ein
>Performace-Problem bei ca 1kHz. Kann das sein?

unwahrscheinlich bei 168MHz CLock :-)


>Ein Überlauf kann es nicht sein. Ist alles uint32_t. Das müßte ja ewig
>ausreichen

wenn du alle 500ms den Counter-Wert sicherst und einen Clock von 1kHz 
hast, dann dürfte da nur ein Wert von 500 drinnstehen...reicht also 
locker


hier mal ein Beispiel für InputCompare
mit TIM3/CH4 an PC9
1
static uint32_t messwert=0;
2
3
4
void init(void)
5
{
6
  GPIO_InitTypeDef GPIO_InitStructure;
7
  TIM_ICInitTypeDef  TIM_ICInitStructure;
8
  NVIC_InitTypeDef NVIC_InitStructure;
9
10
11
  // Clock Enable
12
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
13
14
  // Config des Pins als AF-Input
15
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
16
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
17
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
18
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
19
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
20
  GPIO_Init(GPIOC, &GPIO_InitStructure);
21
22
  // Alternative-Funktion mit dem IO-Pin verbinden
23
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM3);
24
25
  // Clock enable
26
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
27
28
  // Vorteiler einstellen (83 => 1MHz)
29
  TIM_PrescalerConfig(TIM3, 83, TIM_PSCReloadMode_Immediate);
30
31
  // Channel 4
32
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
33
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
34
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
35
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
36
  TIM_ICInitStructure.TIM_ICFilter = 0x3;
37
  TIM_ICInit(TIM3, &TIM_ICInitStructure);
38
39
  // Timer enable
40
  TIM_Cmd(TIM3, ENABLE);
41
42
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
43
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
44
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
45
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
46
  NVIC_Init(&NVIC_InitStructure);
47
48
  TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);
49
}
50
51
void TIM3_IRQHandler(void)
52
{
53
  static uint16_t pos=0;
54
  static uint16_t t1=0;
55
  static uint16_t t2=0;
56
57
58
  if(TIM_GetITStatus(TIM3, TIM_IT_CC4) == SET) {
59
    // Interrupt Flags loeschen
60
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
61
62
    if(pos==0) {
63
      pos=1;
64
      t1=TIM_GetCapture4(TIM3);
65
    }
66
    else {
67
      pos=0;
68
      t2=TIM_GetCapture4(TIM3);
69
70
      if(t2>=t1) {
71
        messwert=t2-t1;
72
      }
73
      else {
74
        messwert=(0xFFFF - t1) + t2;
75
      }
76
    }
77
  }
78
}

bei 1kHz Input am PC9 steht der Messwert bei 1000
wenn dein APB1-Clock bei 42MHz liegt

Gruss Uwe

von Georg B. (xsitez)


Lesenswert?

Hallo Uwe,
danke für das Beispiel,
was ich noch vergesen habe: Ich verwende eine STM32F103VE bei 72MHz.
Leider kennt mein Compilerpaket manche der o.g. Funktionen und/oder 
defines nicht. :-(
Ich versuche gerade das umzuschreiben...
Grüße,
XSiteZ

von Uwe B. (derexponent)


Lesenswert?

>Leider kennt mein Compilerpaket manche der o.g. Funktionen und/oder
>defines nicht. :-(

bei STM auf der Webseite gibt es für fast alle Anwendungen
Beispielquellcode (den habe ich auch benutzt)

bestimmt gibt es auch ein Beispiel für Input-Capture
mit dem STM32F103VE

musst einfach mal danach suchen
vlt geht das schneller als alle Fehler einzeln zu beseitigen

von Georg B. (xsitez)


Lesenswert?

Hallo,
du meinst das hier:
http://www.st.com/web/en/home/catalog/mmc/FM141/SC1169/SS1031/LN1565/PF164491#
-> Design Resources
hat leider nichts passendes.

Hier mein aktuller Anlauf:
1
  {
2
    GPIO_InitTypeDef        GPIO_InitStructure;
3
    TIM_TimeBaseInitTypeDef TIM_InitStructure;
4
5
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE );
6
7
    // pin PC9 as input
8
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
9
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
10
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
11
    GPIO_Init(GPIOC, &GPIO_InitStructure);
12
13
    // remap TIM3 to PC9 (TIM3_Ch4)
14
    GPIO_PinRemapConfig( GPIO_FullRemap_TIM3, ENABLE );
15
16
    RCC_APB1PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
17
18
    // init timer (counter)
19
    TIM_InitStructure.TIM_Period = 65535;
20
    TIM_InitStructure.TIM_Prescaler = 0;
21
    TIM_InitStructure.TIM_ClockDivision = 0;
22
    TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
23
    TIM_InitStructure.TIM_RepetitionCounter = 0;
24
25
    TIM_TimeBaseInit( TIM3, &TIM_InitStructure );
26
27
    // cfg TIM3 for external clock
28
    TIM_TIxExternalClockConfig( TIM3, TIM_TIxExternalCLK1Source_TI2,
29
                                TIM_ICPolarity_Rising, 0 );
30
31
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE);
32
33
    // enable timer
34
    TIM_Cmd( TIM3, ENABLE );
35
  }

ein anderer Interrupt macht dann alle 500ms:
1
    {                                    //
2
      extern uint32_t u32Frequency;      //
3
                                         //
4
      u32Frequency = TIM3->CNT << 1;     // readout
5
      TIM3->CNT = 0;                     // reset
6
    }                                    //

Das Problem ist, das es nicht da tut, was es soll.
In u32Frequency stehen irgendwelche zufälligen Werte.
Ich vermute, dass TIM3 einfah so losläuft, ohne auf irgend ein externes 
clock Signal zu warten.

Was mache ich falsch?

Danke für Durchsicht.

Grüße,
XSiteZ

von Uwe B. (derexponent)


Lesenswert?

>hat leider nichts passendes

dann hast du nicht lange genug gesucht

mach mal einen download von STSW-STM32054 :

http://www.st.com/web/en/catalog/tools/PF257890

und wenn du da unter : "Project/STM32F10x_StdPeriph_Examples/TIM"

nichts findest...dann schreib nochmal ;-)


>Ich vermute, dass TIM3 einfah so losläuft, ohne auf irgend ein externes
>clock Signal zu warten.

das lässt sich per Debugger prüfen

Gruss Uwe

von Georg B. (xsitez)


Lesenswert?

Ich werd nicht.

Ich hab alles fast 1:1 aus dem Beispiel ..Examples\TIM\InputCapture
Natürlich umgeschrieben von PA7 (T3_Ch2) auf PC9 (TIM3_Ch4).

Einzig was ich mehr brauche für diesen Kanal ist ein
1
GPIO_PinRemapConfig( GPIO_FullRemap_TIM3, ENABLE );
und alles was dem Interrupt einfällt ist Chaos.

Er reagiert auf ein Event am Eingang. Soweit ja mal ganz gut, nur 
eventuell für 0Hz etwas unpraktisch, aber prinzipiell mal nicht 
schlecht.
Nur liefert
1
TIM_GetCapture4(TIM3);
totalen Datenkram zurück.

Ich werd das Ganze jetzt mal sacken lassen und mich kommende Woche 
nochmal dransetzen.

So ein Mist grrrrr

Bis dann
XSiteZ

_________________________
nur der Vollständigkeit halber:
Init:
1
{
2
  TIM_ICInitTypeDef  TIM_ICInitStructure;
3
4
  /* TIM3 clock enable */
5
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
6
7
  /* GPIOA and GPIOB clock enable */
8
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
9
10
  NVIC_InitTypeDef NVIC_InitStructure;
11
12
  /* Enable the TIM3 global Interrupt */
13
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
14
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
15
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
16
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
17
  NVIC_Init(&NVIC_InitStructure);
18
19
  GPIO_InitTypeDef GPIO_InitStructure;
20
21
  /* TIM3 channel 4 pin (PC.09) configuration */
22
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9;
23
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
24
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
25
26
  GPIO_Init(GPIOC, &GPIO_InitStructure);
27
28
  /* TIM3 configuration: Input Capture mode ---------------------
29
     The external signal is connected to TIM3 CH4 pin (PC.09)
30
     The Rising edge is used as active edge,
31
     The TIM3 CCR4 is used to compute the frequency value
32
  ------------------------------------------------------------ */
33
34
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
35
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
36
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
37
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
38
  TIM_ICInitStructure.TIM_ICFilter = 0x0;
39
40
  TIM_ICInit(TIM3, &TIM_ICInitStructure);
41
42
  GPIO_PinRemapConfig( GPIO_FullRemap_TIM3, ENABLE );
43
44
  /* TIM enable counter */
45
  TIM_Cmd(TIM3, ENABLE);
46
47
  /* Enable the CC4 Interrupt Request */
48
  TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);
49
}

Interrupt:
1
// Timer triggered by external signal PC.09
2
void TIM3_IRQHandler(void)
3
{
4
  static uint16_t u16CaptureNumber=0;
5
  static uint16_t u16Capture1=0;
6
  static uint16_t u16Capture2=0;
7
  static uint32_t u32Measurement;
8
  extern uint32_t u32Frequency;
9
10
  if(TIM_GetITStatus(TIM3, TIM_IT_CC4) == SET)
11
  {
12
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
13
14
    if(u16CaptureNumber == 0)
15
    {
16
      u16CaptureNumber = 1;
17
      u16Capture1 = TIM_GetCapture4(TIM3);
18
    }
19
    else
20
    {
21
      u16CaptureNumber = 0;
22
      u16Capture2 = TIM_GetCapture4(TIM3);
23
    }
24
25
    if(u16Capture2 >= u16Capture1)
26
    {
27
      u32Measurement = u16Capture2 - u16Capture1;
28
    }
29
    else
30
    {
31
      u32Measurement = (0xFFFF - u16Capture1) + u16Capture2;
32
    }
33
    u32Frequency = ((uint32_t) SystemCoreClock / u32Measurement) << 1;
34
    u32Frequency = u32Frequency; // thisisacompilerbreakpoint
35
  }
36
}

von Uwe B. (derexponent)


Lesenswert?

was eine falsche Klammersetzung so alles ausrichten kann :-)

1
void TIM3_IRQHandler(void)
2
{
3
  static uint16_t u16CaptureNumber=0;
4
  static uint16_t u16Capture1=0;
5
  static uint16_t u16Capture2=0;
6
  static uint32_t u32Measurement;
7
  extern uint32_t u32Frequency;
8
9
  if(TIM_GetITStatus(TIM3, TIM_IT_CC4) == SET)
10
  {
11
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
12
13
    if(u16CaptureNumber == 0)
14
    {
15
      u16CaptureNumber = 1;
16
      u16Capture1 = TIM_GetCapture4(TIM3);
17
    }
18
    else
19
    {
20
      u16CaptureNumber = 0;
21
      u16Capture2 = TIM_GetCapture4(TIM3);
22
23
24
      if(u16Capture2 >= u16Capture1)
25
      {
26
        u32Measurement = u16Capture2 - u16Capture1;
27
      }
28
      else
29
      {
30
        u32Measurement = (0xFFFF - u16Capture1) + u16Capture2;
31
      }
32
      u32Frequency = ((uint32_t) SystemCoreClock / u32Measurement) << 1;
33
      u32Frequency = u32Frequency; // thisisacompilerbreakpoint
34
    }
35
  }
36
}


aber vorsicht ...da gibt es eine Division durch null, wenn
u16Capture2 = u16Capture1 !!
-> also u32Frequency nur ausrechnen, wenn u32Measurement!=0

und ist diese Zeile notwendig ?
1
GPIO_PinRemapConfig( GPIO_FullRemap_TIM3, ENABLE );

Gruss Uwe

von Georg B. (xsitez)


Lesenswert?

Hallo Uwe,

ich breche die Versuche mit InputCapture hiermit ab.
In der readme vom Beispiel in der STM32F10x_StdPeriph_Lib_V3.5.0 steht 
der kleine Satz

"For Low-density, Medium-density, High-density and Connectivity line 
devices, the minimum frequency value to measure is 1100 Hz.
For Low-Density Value line, Medium-Density and High-Density Value line 
devices, the minimum frequency value to measure is 366 Hz."

Das Konzept ist damit für meine Anwendung nicht geeignet.

Ich brauche eine Frequenzbestimmung für 0..1kHz. (vgl. meine erste Post)
Dazu würde ich gerne TIM3 (PC.09) als extern getriggerten Counter 
betreiben.
Im Prinzip das, was ich in meinem ersten Post bereits am Laufen habe, 
nur möchte ich das Zählen der Interrupts vom Timer (TIM3->CNT) erledigen 
lassen. Damit hat die CPU nicht (im Worst Case) 1000 Sprünge in der 
Sekunde zu und von einem IRQ_Handler, um eine Variable zu ++en.
Performancegründe. Die CPU soll sich auf Wichtigeres konzentrieren...
Danke für deine Unterstützung bis hier her.
Ich denke ich muss mich dann wohl doch durch das Datenblatt wursteln.

Wie immer für Hilfe dankbar.

XSiteZ

von interrobang (Gast)


Lesenswert?

ok ist lange her, bin aber via Google hierüber gestolpert.

1KHz mit einem 16Bit counter bei 72MHz messen? Ich vermute mal der 
Counter hat schneller die 65535 grenze geknackt als eine Flanke bei 
1000Hz festgestellt werden kann.

Also musst Du TIM3 ein Prescaler verpassen, so z.B.:

/* Configures the TIMx Prescaler. */
TIM_PrescalerConfig(TIM3, 2000, TIM_PSCReloadMode_Immediate); // 36KHz

von Paul P. (interrobang)


Lesenswert?

Georg B. schrieb:
> Hallo Uwe,
>
> ich breche die Versuche mit InputCapture hiermit ab.
> In der readme vom Beispiel in der STM32F10x_StdPeriph_Lib_V3.5.0 steht
> der kleine Satz
>
> "For Low-density, Medium-density, High-density and Connectivity line
> devices, the minimum frequency value to measure is 1100 Hz.
> For Low-Density Value line, Medium-Density and High-Density Value line
> devices, the minimum frequency value to measure is 366 Hz."
>
> Das Konzept ist damit für meine Anwendung nicht geeignet.
>
> Ich brauche eine Frequenzbestimmung für 0..1kHz. (vgl. meine erste Post)
>

jaja, den ganzen text lesen! Das gild wenn der chip mit 72MHz rennt und 
wenn kein Teiler verwendet wird. In dem Example Code von ST wird nämlich 
kein Teiler angwendet und daher die Warnung ;)

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Man koennte auch die Zaehlerueberlaeufe mitzaehlen...

von Werner (Gast)


Lesenswert?

/* TIM3 channel 4 pin (PC.09) configuration */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

Das ist glaube ich falsch. GPIO Mode muss auf alternate function 
gestellt werden und dann noch entsprechend die selbige im entsprechenden 
AFR Register eingestellt werden.

Werner

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.