Forum: Mikrocontroller und Digitale Elektronik STM32 - USART durchschleifen


von Rene K. (xdraconix)


Lesenswert?

Ich habe ein ESP8266 an einem STM32F103... damit ich den ESP zum 
Programmieren nicht jedesmal vom STM abtrennen und umstecken muss, würde 
ich dies gerne so lösen das ich den ESP über den STM32 programmiere.

Am STM ist die USART 2 mit dem PC verbunden, Baudrate 115200. Am USART 
3, ebenfalls mit 115200 Baud, hängt der ESP8266. Beide USART sind 
Interrupt gesteuert. Der GPIO0/2 sowie die RESET und Ch-PD Pins hängen 
ebenfalls am STM32. Der Reset und der Gang in den Bootloader des ESP 
über den STM32 funktioniert wunderbar.

Nun zu meinem eigentlichen Problem:

Da ja die USART nur ein Sende- & Empfangsbuffer haben (USARTn->DR) habe 
ich Schwierigkeiten dies Aufzuteilen, da beides über Interrupt geht.

Wenn ich nun über die USART2 (PC->STM) direkt in der Interrupt auf die 
USART3 (STM-ESP) geht er ja in die Interrupt und schickt ein Byte vom 
PC->STM und dann direkt den Interrupt vom USART3 STM->ESP. Und bei jedem 
lesen und schreiben eines Bytes in USART3->DR wird ja der 
TransmitInterrupt und der ReceiveInterrupt zurückgesetzt.

Wie kann man das am besten umgehen?!?

Jemand einen Tipp für mich?

von Michael (Gast)


Lesenswert?

Nimm einen zweipoligen Kippschalter und schalte die Rs232 direkt um. 
Entweder auf den Controller oder den Esp.

von Längsdenker (Gast)


Lesenswert?

Michael schrieb:
> Nimm einen zweipoligen Kippschalter

Das ist zu einfach, das kann jeder. Wenn schon dann
von hinten durch die Brust ins Auge.

von Rene K. (xdraconix)


Lesenswert?

Längsdenker schrieb:
> Michael schrieb:
>> Nimm einen zweipoligen Kippschalter
>
> Das ist zu einfach, das kann jeder. Wenn schon dann
> von hinten durch die Brust ins Auge.

Ach so "von hinten durch die Brust ins Auge" ist es garnicht ;-) Einfach 
mal richtig lesen hat mich dann zur Erkenntnis gebracht:
1
void USART3_IRQHandler(void)
2
{
3
  if(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET)
4
  {
5
    uint8_t c = (USART3->DR & 0xff);
6
    USART2->DR = c;
7
  }
8
}
9
10
void USART2_IRQHandler(void)
11
{
12
  if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET)
13
  {
14
    uint8_t c = (USART2->DR & 0xff);
15
    USART3->DR = c;
16
  }
17
}

Die Interrupt Flags stehen wirklich ausschließlich dafür da ob extern in 
die UART geschrieben wurde. Sehr schön... funktioniert tadellos!

: Bearbeitet durch User
von Chris (Gast)


Lesenswert?

Also machen die ESP flashtools da keine komischen Sachen auf der UART?
Ich habe nämlich das gleiche vor, allerdings nicht permanent so wie du 
es machst.

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.