STM32(BluePill): nefunkční "delayMicroseconds()"

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

STM32(BluePill): nefunkční "delayMicroseconds()"

Příspěvek od AstroMiK » 12 lis 2019, 13:11

Nemůžu nějak rozchodit funkci "delayMicroseconds()" na STM32F103 (BluePill)

Vypadá to, jakoby se program zastavil na poloviční dobu, než by měl.
Krystalem to asi nebude, protože v tom případě by i funkce "micros()" vracela špatné výsledky.
Funkce "micros()" ale funguje správně.

Přikládám velice zjednodušený příklad.
Očekávám, že se alespoň na 10 sekund rozsvítí LED a zahlásí se doba trvání něco přes 10 000 000us.
(Samotné delayMicroseconds by mělo trvat 10 sekund + nějaké zpoždění na ostatních příkazech ve smyčce.)
Ve skutečnosti se ale LED rozsvítí jen asi na 5 sekund.

Co dělám špatně?

Nemusí se ještě někde něco přepnout?

Kód: Vybrat vše

#define pin_LED     PB0                      // signalizacni LED

unsigned long start_cas;
unsigned long stop_cas;




void setup()
  {
    pinMode(pin_LED, OUTPUT);
    Serial.begin (38400);

    digitalWrite(pin_LED, HIGH);             // rozsvitit LED
    
    start_cas = micros();

    for (unsigned int i = 0; i < 10000 ; i++)
      {
        delayMicroseconds(1000);             // ocekavam 10 000 * 1 000us = 10s 
      }

    stop_cas = micros();

    digitalWrite(pin_LED, LOW);              // zhasnout LED
    
    Serial.print("doba trvani [us]: ");      //  skutecny vysledek: 
    Serial.println(stop_cas - start_cas);    //     "doba trvani [us]: 5007297" 
   
  }

void loop(void)
  {
  }




Když místo: "delayMicroseconds(1000)" použiju obyčejné "delay(1)", je výsledek v pořádku: "doba trvani [us]: 10014974"

Zkoušel jsem použít i kratší delayMicroseconds(), abych vyloučil případné přetečení proměnných, ke kterému by ale nemělo dojít ani při těch 10 sekundách.

Výsledky jsou následující:

Kód: Vybrat vše

delayMicroseconds(1000) ..... očekávaný výsledek 10 000 000us ..... doba trvani [us]: 5 007 297
delayMicroseconds( 100) ..... očekávaný výsledek  1 000 000us ..... doba trvani [us]:   503 555
delayMicroseconds(  50) ..... očekávaný výsledek    500 000us ..... doba trvani [us]:   253 376
delayMicroseconds(  10) ..... očekávaný výsledek    100 000us ..... doba trvani [us]:    53 232

Podle výsledků se zdá, že opravdu ta funkce "delayMicroseconds()" vytváří poloviční pauzy, než je zadáno v jejím parametru a že ten zbytek smyčky trvá konstantně něco přes 3ms (tedy kromě toho původního delayMicroseconds(1000), kde je trvání zbytku smyčky dvojnásobné)

Co s tím?
Je ta chyba jen u mně, nebo máte podobné výsledky?

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: STM32(BluePill): nefunkční "delayMicroseconds()"

Příspěvek od KamilV » 12 lis 2019, 13:49

V čem ten kód překládáš a nahráváš? Pokud v ArduinoIDE, máš dobře zvolený procesor, CPU speed, board?

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

Re: STM32(BluePill): nefunkční "delayMicroseconds()"

Příspěvek od AstroMiK » 12 lis 2019, 14:52

Myslím, že mám IDE nastavené správně. Nahrávám přes sériovou linku (piny PA9, PA10)

Obrázek:
nastaveni_IDE.gif
Zkoušel jsem i měnit rychlost sériového portu na Serial.begin(9600) a v nastavení IDE jsem zkoušel měnit "CPU speed" ze 72MHz (Normal) na 42MHz (Slow), ale žádný vliv to nemělo.
Funkce delay() a micros() fungují správně.
Funkce delayMicroseconds() funguje divně.

Ještě to vyzkouším večer doma na jiném počítači a třeba i s jinou deskou BluePill.

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

Re: STM32(BluePill): nefunkční "delayMicroseconds()"

Příspěvek od AstroMiK » 12 lis 2019, 17:55

Tak jsem provedl testování na všech osmi Blue Pillech, které jsem doma našel a zjistil jsem, že 3 z nich se chovají tak, jak jsem popisoval v prvním příspěvku.
Funkce "DelayMicroseconds()" v nich generuje poloviční pauzy, než by měla.

Na zbylých 5 kusech všechno funguje přesně tak, jak jsem očekával.

LED se rozsvítí na 10 sekund a program zahlásí "doba trvani [us]: 10007505".

Když jsem prozkoumal pod lupou procesory, tak ty, které fungují špatně, mají všechny úplně stejný nápis:

STM32
F103C8T6
991KA 93
MYS 807


Desky, které fungují správně, mají nápisy různé:

STM32
F103C8T6
GH246 9U
CHN 552

STM32
F103C8T6
9902Q 93
MYS 628

STM32
F103C8T6
GH208 9U
CHN 411

STM32
F103C8T6
GH525 9U
CHN 604

STM32
F103C8T6
9902Q 93
MYS 628

(vyfotím to zítra v práci pod mikroskopem)


Takže je možné, že celý problém je v tom, že ty nefunkční desky obsahují nějaké nepovedené čínské kopie procesorů.
(tím netvrdím, že ty zbylé jsou originály - mohou to být jen trochu povedenější novější kopie).

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

Re: STM32(BluePill): nefunkční "delayMicroseconds()"

Příspěvek od AstroMiK » 13 lis 2019, 06:51

Přkládám fotografie 3 vadných a 5 dobrých procesorů.

Jak je vidět, tak ty dobré jsou označené každý jiným typem písma. A na tom posledním se dokonce dají rozpoznat rýhy po broušení nějakého starého označení.

Všechny desky BluePill jsem nakupoval přes e-Bay, ale od různých dodavatelů.

Přílohy:
3xvadny.jpg

5xdobry.jpg

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: STM32(BluePill): nefunkční "delayMicroseconds()"

Příspěvek od ondraN » 13 lis 2019, 07:16

Díky za dobrý report a tip čemu se vyhnout. Ta zkratka MYS by mohl být kód pro Malaysii.
Vždycky jsem si myslel, že pokud čip neprojde v testech, ještě v nezapouzdřené fázi, tak je zlikvidován. Asi ten test nedokáže odchytit všechny vady a nebo je za tím zase jen lidská hamižnost.

Odpovědět

Kdo je online

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