STM32 - sériový výstup

Odpovědět
AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

STM32 - sériový výstup

Příspěvek od AstroMiK » 27 zář 2018, 13:02

Ahoj.

Zkouším proniknout do trochu výkonějších procesorů a při pokusech s STM32F103 jsem narazil na problém, kterému nerozumím.

Jde o jednoduché odesílání zpráv do tří nezávislých sériových portů.
Testovací program vypadá takto:


Kód: Vybrat vše

byte i = 0;

void setup()
  {
    Serial.begin(9600);         // TX pin .... PA9
    Serial1.begin(9600);        // TX pin .... PA2 
    Serial2.begin(9600);        // TX pin .... PB10
  }


void loop()
  {
    i++;

    Serial.print("SERIAL PA9 ... ");
    Serial.println(i);

    Serial1.print("SERIAL PA2 ... ");
    Serial1.println(i);
    
    Serial2.print("SERIAL PB10 ... ");
    Serial2.println(i);

    delay(1000);
  }


Když ten program do desky nahraju v prostředí Arduino přes obyčejný USB/TTL převodník (převodník s čipem CH340 je při nahrávání připojený na piny PA9 a PA10), tak po spuštění program pracuje podle očekávání. Na výstupech PA9, PA2 a PB10 se objevují zprávy, které odpovídají pinům (viz obrázky níže).

Když ale stejný program nahraju přes programátor ST-LINK V2 (připojený přes piny SWCLK a SWDIO), tak po jeho spuštění jsou na pinu PA9, zprávy, které měly být na pinu PB10.
Pin PA2 odesílá správné zprávy.
A na pinu PB10 není žádná komunikace patrná.


Jak je možné, že se stejný program chová úplně jinak jen tím, že ho do procesoru nahraju různými cestami?

Nebo dělám něco špatně?

Přikládám i obrázky nastavení pro nahrávání přes ST-LINK a pře USB/TTL převodník.

Nastavení pro nahrání programu přes USB/TTL převodník:
nastaveni_serial.gif


Výstupy na pinech PA9, PA2 a PB10 po nahrání programu přes USB/TTL převodník - V POŘÁDKU:
vystup-po_serial.gif


Nastavení pro nahrání programu přes ST-LINK V2:
nastaveni_stlink.gif


Výstupy na pinech PA9, PA2 a PB10 po nahrání programu přes ST-LINK:
vystup-po_stlink.gif

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: STM32 - sériový výstup

Příspěvek od AstroMiK » 27 zář 2018, 19:44

Tak jsem to zkoušel ještě na jiném počítači a chová se to trochu jinak.
Při nahrání přes USB/TTL převodník to pořád funguje dobře.

Při nahrání přes programátor ST-link V2 je tu trochu změna:

Na pinu PA9 mám zprávy, které měly vycházet z pinu PA2.
Na pinu PA2 mám zprávy z PB10.
A pin PB10 je "němý" - nejdou z něj žádné zprávy.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: STM32 - sériový výstup

Příspěvek od AstroMiK » 27 zář 2018, 20:40

Tak už jsem to asi objevil.
Sice mi není jasné proč, ale je to nějaký záměr.

V souboru:
C:\Program Files (x86)\Arduino\hardware\Arduino_STM32-master\STM32F1\variants\generic_stm32f103c\board.cpp

je na konci tato část:

Kód: Vybrat vše


/* 
 * Roger Clark
 * 
 * 2015/05/28
 *
 * Moved definitions for Hardware Serial devices from HardwareSerial.cpp so that each board can define which Arduino "Serial" instance
 * Maps to which hardware serial port on the microprocessor
 */
						
#ifdef SERIAL_USB
	DEFINE_HWSERIAL(Serial1, 1);

	DEFINE_HWSERIAL(Serial2, 2);

	DEFINE_HWSERIAL(Serial3, 3);
#else
	DEFINE_HWSERIAL(Serial, 1);

	DEFINE_HWSERIAL(Serial1, 2);

	DEFINE_HWSERIAL(Serial2, 3);
#endif

Takže předpokládám, že když se nahrává přes ST-link, tak se použijí první 3 definice HWSERIAL.
Takže v programu se pak musí používat označení linek: Serial1, Serial2 a Serial3.

Když se nahrává přes USB/TTL převodník, tak se použijí poslední 3 definice HWSERIAL.
Takže v programu se pak musí použít označení linek: Serial, Serial1 a Serial2.

Vyzkoušel jsem tedy změnit označení sériových linek z původních Serial, Serial1 a Serial2 na nové Serial1, Serial2 a Serial3.
A už to po nahráni programu přes ST-link funguje.
Když se ale pokusím zkompilovat takto upravený program před odesláním do procesoru přes USB/TTL převodník, tak zahlásí překlad chybu:
'Serial3' was not declared in this scope



Takže asi bude nutné programy, které budou používat komunikační linky, psát pro obě varianty nahrávání. Nějak takto:

Kód: Vybrat vše


byte i = 0;

void setup()
  {

#ifdef SERIAL_USB
    Serial1.begin(9600);        // TX pin .... PA9
    Serial2.begin(9600);        // TX pin .... PA2 
    Serial3.begin(9600);        // TX pin .... PB10
#else
    Serial.begin(9600);         // TX pin .... PA9
    Serial1.begin(9600);        // TX pin .... PA2 
    Serial2.begin(9600);        // TX pin .... PB10
#endif

  }


void loop()
  {
    i++;

#ifdef SERIAL_USB
    Serial1.print("SERIAL PA9 ... ");
    Serial1.println(i);

    Serial2.print("SERIAL PA2 ... ");
    Serial2.println(i);
    
    Serial3.print("SERIAL PB10 ... ");
    Serial3.println(i);
#else
    Serial.print("SERIAL PA9 ... ");
    Serial.println(i);

    Serial1.print("SERIAL PA2 ... ");
    Serial1.println(i);
    
    Serial2.print("SERIAL PB10 ... ");
    Serial2.println(i);
#endif


    delay(1000);
  }

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů