Forum: Mikrocontroller und Digitale Elektronik STM32F103RBT6 Timer nur als Interruptgenerator - welcher mode?


von J. H. (Firma: heisystec) (hds)


Lesenswert?

Hallo, liebe Mitforisten,

Habe das Problem, dass von oben genanntem Chip schon CAN, USB, USART 
1..3 und ein ADC zuzüglich der SPI2 (SD-MemoryCard) genutzt werden 
sollen.
Brauche noch ca 8 GPIO's als Digitale Ein/Ausgänge.
Das Problem stellt sich jetzt dadurch, dass ich in Ermangelung weiter 
USARTS Serielle Bitbanging -Schnittstellen implementieren muss - an sich 
kein Problem, wenn mir das Tool von STM 
MicroXplorer(http://www.st.com/web/en/catalog/tools/PF251717) nicht bei 
der Aktivierung der Timer gleich Pins dazu fest vergeben wollen würde...

Ich brauche aber keine Timer-Pins, da ich für die beiden RX-Kanäle 
externe Interrupts auf zwei freie GPIO's (EXTI-Line 1 und EXTI-Line 8 
konnektierend)vergebe, die die nichtblockierenden(!) timergesteuerten 
Bitbanging Zustandsautomaten zum Empfang eines Seriell-Chars dann 
anschieben.

Frage:
Wie kann man die Timer(2..4) einfach als Zeit-counter programmieren, die 
mit keinem Pin (PWM oder Compare usw...) verbunden sind, sondern einfach 
nur ihre Zeit abspulen, und dann ihren Timer-Interrupt auslösen? (Mit 
brauchbarer Präzision für Baudraten bis 57600)

Konfiguration:
Libraries: die von STM/CooCox; IDE:CoIDE; (Maple libraries liegen vor 
und sind halbwegs verdaut... ;-) Board:Olimexino-STM32, JTAG: Olimex 
ARM-USB-Tiny-H

Vielen Dank im Voraus...
Joern

von holger (Gast)


Lesenswert?

>Wie kann man die Timer(2..4) einfach als Zeit-counter programmieren, die
>mit keinem Pin (PWM oder Compare usw...) verbunden sind, sondern einfach
>nur ihre Zeit abspulen,

Aktiviere die alternate Function für die entsprechenden
GPIOs einfach nicht.

von J. H. (Firma: heisystec) (hds)


Lesenswert?

Wow, jetzt bin ich ja platt...
So fix geht das hier!

Danke, Holger, wenn ichs richtig verstehe:
GPIO Alternate Function habe ich laut Datenblatt/GPIO-Verdrahtungsplan 
des Chip zu meiner GPIO-Nutzung nur aktiviert (GPIO_Mode_AF_PP) für:
1
....
2
doInitPIN(GPIOA, GPIO_Pin_9,  GPIO_Mode_AF_PP); // D7  USART1 Tx (PA.09)
3
doInitPIN(GPIOA, GPIO_Pin_2,  GPIO_Mode_AF_PP); // D1  USART2 Tx (PA.02)
4
doInitPIN(GPIOB, GPIO_Pin_10, GPIO_Mode_AF_PP); // D29 USART3 Tx (PB.10)
5
doInitPIN(GPIOB, GPIO_Pin_9,  GPIO_Mode_AF_PP); // D24 CAN Tx (PB.09)
6
// Remap1 is for PB8 and PB9
7
GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);  //0x001D4000 Bit14,13='10' 
8
...

Und genau so würden auch die Timer aufgeschaltet auf die entsprechenden 
GPIO's? UNd wenn man dies unterlässt, sind die entsprechenden Pin's 
nicht mit den Timern verbunden?

Joern

von holger (Gast)


Lesenswert?

>Und genau so würden auch die Timer aufgeschaltet auf die entsprechenden
>GPIO's? UNd wenn man dies unterlässt, sind die entsprechenden Pin's
>nicht mit den Timern verbunden?

Ja.

von J. H. (Firma: heisystec) (hds)


Lesenswert?

Danke für den kanppen, aber prägnanten Hinweis...

da die oben genannten, als "alternate GPIO-Ausgänge" auf die seriellen 
Peripherals CAN, USART1..3 geschaltet sind, wie ist dann zu erklären, 
dass diese GPIO's gleichzeitig immer noch Timer-Kanälen zugeordnet sind?

Es wäre toll, wenn mir jemand aus dieser Liste der in der 
STM32f10x-tim.h  angegebenen Funktionen mal eben jene nur ankreuzt, mit 
denen ich mich für die Lösung meines Problems weiter beschäftigen sollte 
- wenn denn für "Timer nicht verbunden mit seinem zugeordneten GPIO" 
keine ganz so einfache, überschaubar hier postbare Lösung klar auf der 
Hand liegt:
1
void TIM_DeInit(TIM_TypeDef* TIMx);
2
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
3
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
4
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
5
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
6
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
7
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
8
void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
9
void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct);
10
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
11
void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);
12
void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);
13
void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct);
14
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
15
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
16
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
17
void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource);
18
void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength);
19
void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState);
20
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
21
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
22
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
23
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);
24
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
25
                             uint16_t ExtTRGFilter);
26
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
27
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
28
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
29
                   uint16_t ExtTRGFilter);
30
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
31
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
32
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
33
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
34
                                uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);
35
void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
36
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
37
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
38
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
39
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
40
void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState);
41
void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState);
42
void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState);
43
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
44
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
45
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
46
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
47
void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
48
void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
49
void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
50
void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
51
void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
52
void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
53
void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
54
void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
55
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
56
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
57
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
58
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
59
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
60
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
61
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
62
void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
63
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
64
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
65
void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
66
void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource);
67
void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState);
68
void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode);
69
void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);
70
void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);
71
void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode);
72
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
73
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
74
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
75
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
76
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
77
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
78
void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
79
void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
80
void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
81
void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
82
void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD);
83
uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
84
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
85
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
86
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);
87
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
88
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
89
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
90
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
91
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
92
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

Oder gibt es hier vllt. jemanden, der ggf. mit allen sein "STM32F10x 
Timer only ohne Outputs oder Inputs"-Interrupt-Snippet teilen will?

Initialisiert werden die Timer Interrupts bei mir so:
1
void doEnableNVIC(uint8_t channel){
2
  NVIC_InitTypeDef N;
3
  N.NVIC_IRQChannel = channel;
4
        N.NVIC_IRQChannelPreemptionPriority = 0;
5
  N.NVIC_IRQChannelSubPriority = 0;
6
  N.NVIC_IRQChannelCmd = ENABLE;
7
  NVIC_Init(&N);
8
}
9
void doInitNVIC(void){ //Nested interrupt Vektoren initialisieren
10
  /*Exti-INterrupts: stm32f10x.h, zeile 254
11
  EXTI0_IRQn                  = 6,      // EXTI Line0 Interrupt
12
  EXTI1_IRQn                  = 7,      // EXTI Line1 Interrupt
13
  EXTI2_IRQn                  = 8,      // EXTI Line2 Interrupt
14
  EXTI3_IRQn                  = 9,      // EXTI Line3 Interrupt
15
  EXTI4_IRQn                  = 10,     // EXTI Line4 Interrupt
16
  EXTI9_5_IRQn                = 23,     // External Line[9:5] Interrupts
17
  TIM2_IRQn                   = 28,      TIM2 global Interrupt
18
  TIM3_IRQn                   = 29,      TIM3 global Interrupt
19
  TIM4_IRQn                   = 30,      TIM4 global Interrupt
20
  */
21
  // Set the Vector Table base location at 0x08000000
22
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
23
  // Configure one bit for preemption priority
24
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
25
26
  doEnableNVIC(USART1_IRQn); //USART1
27
  doEnableNVIC(USART2_IRQn); //USART2
28
  doEnableNVIC(USART3_IRQn); //USART3
29
30
  //Enable External interrupt lines: Bluetooth Rx = PA08; Display = PC01
31
  doEnableNVIC(EXTI1_IRQn);   //D3  SoftSer2 Rx (PA.01) EXTI1 from Bluetooth
32
  doEnableNVIC(EXTI9_5_IRQn); //D30 SoftSer1 Rx (PC.08) EXTI8 from Display
33
34
  //Enable Timer interrupts, Bitbanging-Schnittstellen
35
  doEnableNVIC(TIM2_IRQn);   //D3  SoftSer2 Rx (PA.01) EXTI1 from Bluetooth
36
  doEnableNVIC(TIM3_IRQn);   //D30 SoftSer1 Rx (PC.08) EXTI8 from Display
37
  doEnableNVIC(TIM4_IRQn);   //D36 SoftSer1_2 Tx (PC.07) to Display, to Bluetooth
38
39
}

Na, rette sich wer kann...

Joern

von J. H. (Firma: heisystec) (hds)


Lesenswert?

Moinsen,
Vielleicht habe ich ja meine Frage zu umfangreich gestellt, dass keiner 
Lust hatte, mir ein einfaches, funktionierendes Timer only snippet zu 
posten...
doch habs nun selber gemacht und hier ists (für alle andern, die vor 
gleicher Frage stehen und auch gerade erst von der MapleIDE auf CoIDE 
umgestiegen sind).

Nochmal zum Ziel: SoftwareSerial Nichtblockierend mit Timer, was soll 
passieren:

A) Ein serielles Signal zieht einen Pin Low, das ist das Startbit.
B) Ein EXTI (external interrupt line) sitzt auf diesem GPIO-Pin und 
wartet auf eine fallende Flanke, löst dadurch den Interrupt aus.
C) Der EXTI-Interrupthandler (als WEAK vorformuliert in den STM-lib's, 
und daher einfach überschrieben) startet einen Timer und deaktiviert 
sich selber.
D) Der Timer kümmert sich ums baudraten-getaktete Einlesen der 
ankommenden Bits, bis das Byte/char (Ein Stoppbit, 8 Datenbits, no 
parity) da ist
E) Mit dem letzten Bit deaktiviert sich der timer im Timer-Interrupt 
wieder und aktiviert den EXTI-Interrupt, der wieder auf die fallende 
Flanke eines Startbit wartet.

Typendeklaration Seriell-Eingangspuffer:
1
#define SSbufcnt 127
2
3
typedef struct {
4
 uint8_t SS_INbuf[SSbufcnt];   //LCD-eingangspuffer, wird timergesteuert gefüllt.
5
 int16_t   SS_INbitcnt;   //fängt mit -1 auf dem Stopbit an
6
 int16_t   SS_INwritePt;  //Schreibzeiger für inputpuffer
7
 int16_t   SS_INreadPt;   //Lesezeiger für inputbuffer, puffer leer
8
} SoftSerINBuf_TypeDef;
9
volatile SoftSerINBuf_TypeDef SSBlueTooth;
 //volatile weil interrupts hier reinschreiben...(nicht nur auf dem 
Stack aktualisieren)

Timer-Initialisierung:
1
void DoInitTimers(uint32_t baud){ //Init der Bitbanging-Timer
2
  //Prescaler-Value und Autoreload-Value aus Baudrate berechnen
3
  uint16_t Prescaler       = 0; //wird beim Register-Setzen auf Prescalervalue + 1 gesetzt
4
  uint32_t CYCLES_PER_BAUD = SystemCoreClock / baud; //1875 bei 38400 baud
5
  while(CYCLES_PER_BAUD>65535){ // Bei Baudraten kleiner 1000
6
    Prescaler++;
7
    CYCLES_PER_BAUD = 1 + CYCLES_PER_BAUD/2;
8
  }
9
  uint16_t Period      = CYCLES_PER_BAUD;
10
  TIM_TimeBaseInitTypeDef  TB;   //Basis-Timerstruktur
11
12
  TIM_Cmd(TIM2,DISABLE );      //Timer ausschalten
13
  TB.TIM_Prescaler     = Prescaler; //Divisor für die Timer - Clock
14
  TB.TIM_CounterMode   = TIM_CounterMode_Up;
15
  TB.TIM_ClockDivision = TIM_CKD_DIV1; //Divisor für die Timer-Clock
16
  //TB.TIM_RepetitionCounter = 0 //nur valide für die TIM1 und TIM8
17
  TB.TIM_Period = Period; //Uint 16 t, die ZÄHLT ER HOCH - 1
18
  //Timer initialisieren
19
  TIM_TimeBaseInit(TIM2, &TB);  //
20
  //TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //dann legt er sofort los und feuert
21
22
  //Eingangspuffer initialisieren:
23
  SSBlueTooth.SS_INbitcnt= -1;
24
  SSBlueTooth.SS_INreadPt=  0;
25
  SSBlueTooth.SS_INwritePt= 0;
26
}

... GPIO-Initialisierungsroutine enthält:
1
EXTI_InitTypeDef E;
2
DoInitPIN(GPIOA, GPIO_Pin_1,   GPIO_Mode_IPU);     // D3  SoftSer2 Rx (PA.01) EXTI1
3
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);// D3  SoftSer2 Rx (PA.01) EXTI1
4
E.EXTI_Mode =    EXTI_Mode_Interrupt;
5
E.EXTI_Trigger = EXTI_Trigger_Falling;
6
E.EXTI_LineCmd = ENABLE;
7
E.EXTI_Line = EXTI_Line1; //Bluetooth-Input D3  SoftSer2 Rx (PA.01) EXTI1
8
EXTI_Init(&E);

EXTI-Interruptroutine sieht so aus:
1
void EXTI1_IRQHandler(void){//FAllende Flanke auf assoziiertem GPIO-Pin detektiert:
2
  //Startbit beginnt
3
  if (EXTI_GetITStatus(EXTI_Line1) != RESET){
4
    EXTI_ClearITPendingBit(EXTI_Line1);
5
    if (SSBlueTooth.SS_INbitcnt==-1 ){ //Startbit wird erwartet
6
      SSBlueTooth.SS_INbitcnt++;
7
      //1. Disable This interrupt:
8
      DoExtiDisable(EXTI_Line1); //Dies gibt genug zeit, um die Pin-Probe zeitlich etwas von der Kante des ersten Daten- bits weg zu rücken
9
      //2. Start Timer to receive Byte
10
      //Unbedingt Counter -Refresh auslösen mit 
11
      TIM2->EGR = TIM_PSCReloadMode_Immediate; //generate Update Event, setzt das UD-Bit
12
      TIM_Cmd(TIM2,ENABLE); //Schaltet den Timer online
13
      TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //Schaltet den Timer interrupt online
14
    }
15
    __DSB(); //!!! Alle Memorytransfers abwarten für EXTI_ClearITPendingBit sonst risiko des Mehrfachfeuerns
16
  }
17
}

Timer-Interruptroutine Sieht so aus:
1
void TIM2_IRQHandler(void){ //D3  SoftSer2 Rx (PA.01) EXTI1 from Bluetooth
2
  if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){ //IRQ ist durch Baud-Timer-Update ausgelöst
3
    //clear interrupt and start counting again to get precise freq
4
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
5
    //Siehe den zugeordneten Pin nach, und lese dort L oder H - Bit ein
6
    uint8_t b = 0;
7
    b         = GPIO_ReadInputDataBit(GPIOA,  GPIO_Pin_1);
8
    //setze Bit in Char gemäß Bitzähler
9
    switch (SSBlueTooth.SS_INbitcnt){
10
      case 0: //erstes bit einsammeln, Timer umstellen auf Bitperiode
11
        SSBlueTooth.SS_INbuf[SSBlueTooth.SS_INwritePt] = b;
12
        SSBlueTooth.SS_INbitcnt++;
13
        break;
14
        case 1: //bit einsammeln,
15
        case 2: //bit einsammeln,
16
        case 3: //bit einsammeln,
17
        case 4: //bit einsammeln,
18
        case 5: //bit einsammeln,
19
        case 6: //bit einsammeln,
20
        case 7: //bit einsammeln,
21
          SSBlueTooth.SS_INbuf[SSBlueTooth.SS_INwritePt] |= (b << SSBlueTooth.SS_INbitcnt++);
22
        break;
23
        case 8: //Stopbit, timer-Stop; reset des Bitcounters für nächstes Startbit - interrupt
24
          TIM_Cmd(TIM2,DISABLE);
25
          TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
26
          DoExtiEnable(EXTI_Line1);
27
            SSBlueTooth.SS_INbitcnt = -1;
28
            if (SSBlueTooth.SS_INwritePt>SSbufcnt-1 ) {
29
              SSBlueTooth.SS_INwritePt = 0;
30
            }
31
            else {
32
              SSBlueTooth.SS_INwritePt++;
33
            }
34
        break;
35
    }
36
  }
37
}


Tja... so far, so good:
IT works ;-)

(Bin ja hellauf begeistert, nach dem MapleIDE-Blindflug mal in CoIDE 
tatsächlich einen Blick auf den aktuellen Zustand der 
Peripherals-Register werfen zu können)

Joern

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.