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
>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.
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:
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
>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.
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:
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:
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
typedefstruct{
4
uint8_tSS_INbuf[SSbufcnt];//LCD-eingangspuffer, wird timergesteuert gefüllt.
5
int16_tSS_INbitcnt;//fängt mit -1 auf dem Stopbit an
6
int16_tSS_INwritePt;//Schreibzeiger für inputpuffer
7
int16_tSS_INreadPt;//Lesezeiger für inputbuffer, puffer leer
8
}SoftSerINBuf_TypeDef;
9
volatileSoftSerINBuf_TypeDefSSBlueTooth;
//volatile weil interrupts hier reinschreiben...(nicht nur auf dem
Stack aktualisieren)
Timer-Initialisierung:
1
voidDoInitTimers(uint32_tbaud){//Init der Bitbanging-Timer
2
//Prescaler-Value und Autoreload-Value aus Baudrate berechnen
3
uint16_tPrescaler=0;//wird beim Register-Setzen auf Prescalervalue + 1 gesetzt
4
uint32_tCYCLES_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_tPeriod=CYCLES_PER_BAUD;
10
TIM_TimeBaseInitTypeDefTB;//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
case8://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