Forum: Mikrocontroller und Digitale Elektronik Stm32f10x - Timer Interrupt stört vermutlich USART


von stmler (Gast)


Lesenswert?

hallo,
ich habe einen Timerinterrupt wo jede 200µs auslöst.

beim senden eines Telegrams mit folgender funktion empfängt der slave 
nichts. ich vermute das beim senden der timer interrupt immer wieder 
auslöst. aber bin mir nicht sicher.

das senden ist folgendermaßen realisiert

for(i=0;i<=bByteAnzahl+7;i++)
{
 USART_SendData(USART1, abTelegram[i]);
 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}

wenn ich ein Delay einfüge funktioniert alles, aber braucht lange
for(i=0;i<=bByteAnzahl+7;i++)
{
 USART_SendData(USART1, abTelegram[i]);
 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
 Delay(1);
}

kann mir jemand helfen?

von Franz (Gast)


Lesenswert?

Hallo!

Vielleicht solltest du deinen Aufbau genauer erklären und vlt etwas mehr 
von deinem Code posten. Aus deiner Angabe heraus kann ich dein Problem 
nicht nachvollziehen.

Danke, lg
Franz

von Juergen G. (jup)


Lesenswert?

bei einem laufenden 200us timer-interrupt ist

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

wohl nicht die geeignetste Methode um UART Daten zu senden.
Benutze den UART Interrupt.

von stmler (Gast)


Lesenswert?

und wie verwende ich den usart interrupt zum senden? kenn nur den zum 
empfangen

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Das funktioniert bei mir immer trotz heftiger ISRs im Hintergrund:
1
void uart_put(uint8_t ch)
2
{
3
  while ((USART1->SR & USART_FLAG_TXE) < 1) {};
4
    USART1->DR = ((uint8_t) ch & (uint16_t)0x01FF);
5
}

von stmler (Gast)


Lesenswert?

nein funktioniert leider nicht

von ♪Geist (Gast)


Lesenswert?

Kannst dem USART höhere Prio verpassen, aber dann sind deine 200us nicht 
mehr garantiert.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

stmler schrieb:
> nein funktioniert leider nicht

Was funktioniert nicht? Bei mir läuft alle 30 µs ein Timer IRQ (BLDC 
Steuerung) auf und ich verliere keine Zeichen. Wohlgemerkt hat mein 
USART Codeschnipsel nichts mit Interrupts zu tun, der läuft aus dem 
Hauptprogramm.

von stmler (Gast)


Lesenswert?

Matthias Sch. schrieb:
> Was funktioniert nicht? Bei mir läuft alle 30 µs ein Timer IRQ (BLDC
> Steuerung) auf und ich verliere keine Zeichen. Wohlgemerkt hat mein
> USART Codeschnipsel nichts mit Interrupts zu tun, der läuft aus dem
> Hauptprogramm.

auf der schnittstelle kommt nur müll raus. wenn ich ein delay wie oben 
beschrieben einfüge, dann erhalte ich die daten auf der schnittstelle

von Daniel V. (danvet)


Lesenswert?

stmler schrieb:
> Matthias Sch. schrieb:
>> Was funktioniert nicht? Bei mir läuft alle 30 µs ein Timer IRQ (BLDC
>> Steuerung) auf und ich verliere keine Zeichen. Wohlgemerkt hat mein
>> USART Codeschnipsel nichts mit Interrupts zu tun, der läuft aus dem
>> Hauptprogramm.
>
> auf der schnittstelle kommt nur müll raus. wenn ich ein delay wie oben
> beschrieben einfüge, dann erhalte ich die daten auf der schnittstelle

Du musst prüfen, ob du senden darfst...

von stmler (Gast)


Lesenswert?

Daniel V. schrieb:
> Du musst prüfen, ob du senden darfst...

wie überprüf ich das? die anderen teilnehmer senden nicht, da ist nur 
ein terminal program angeschlossen als empfänger

von Juergen G. (jup)


Lesenswert?

So funktionierts mit sende ISR

in dem Beispiel benutze ich eine FIFO, man kann aber auch die Daten 
direkt schreiben
1
void USART1_IRQHandler(void) {
2
3
  unsigned char tmptail;
4
5
  if (USART_GetFlagStatus(USART1, USART_FLAG_TXE ) == SET) {
6
    if (UART1_TxHead != UART1_TxTail) {
7
      /* calculate and store new buffer index */
8
      tmptail = (UART1_TxTail + 1) & UART1_TX_BUFFER_MASK;
9
      UART1_TxTail = tmptail;
10
      /* get one byte from buffer and write it to UART */
11
      USART_SendData(USART1, UART1_TxBuf[tmptail]);
12
    } else {
13
      /* tx buffer empty, disable UDRE interrupt */
14
      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
15
    }
16
  }
17
}
18
19
extern void uart1_putc(unsigned char data){
20
  uint8_t tmphead;
21
22
  tmphead = (UART1_TxHead + 1) & UART1_TX_BUFFER_MASK;
23
24
  while (tmphead == UART1_TxTail) {
25
    ;/* wait for free space in buffer */
26
  }
27
28
  UART1_TxBuf[tmphead] = data;
29
  UART1_TxHead = tmphead;
30
31
  /* enable interrupt */
32
  USART_ITConfig (USART1, USART_IT_TXE, ENABLE);
33
34
}

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.