I2C - Arduino STM32 Nucleo L476RG

Tomas Urbanek turbyho na me.com
Středa Prosinec 12 08:34:45 CET 2018


Kde ti zakerni arduinisti udelali chybu ze jim to funguje? :-)

#include "stm32l4xx_ll_rcc.h"

extern "C" {
  int test __attribute__ ((section (".noinit")));
}

void setup() {
  if (LL_RCC_IsActiveFlag_SFTRST() != RESET) {
    test = 0;
  }
  __HAL_RCC_CLEAR_RESET_FLAGS();

  Serial.begin(9600);
  Serial.print("RESET FIRE: ");
  Serial.println(test++);
}

void loop() {
}


vystup:
RESET FIRE: 0
RESET FIRE: 1
RESET FIRE: 2
RESET FIRE: 3
RESET FIRE: 4
RESET FIRE: 5
RESET FIRE: 6
RESET FIRE: 7
RESET FIRE: 8
RESET FIRE: 9
RESET FIRE: 10
RESET FIRE: 11
RESET FIRE: 12

Napsano a kompilovano v Arduino IDE v1.8.7., pouzito https://github.com/stm32duino/Arduino_Core_STM32 <https://github.com/stm32duino/Arduino_Core_STM32> (Nucleo L476RG)

T


> 12. 12. 2018 v 7:07, Jan Waclawek <konfera na efton.sk>:
> 
>> to fakt netusim, ale mohu to zitra zkusit. 
> 
> Super. Doporucujem zacat s preskumanim mapfile - prosim, postnite ho tu.
> 
> Mozno na reprodukciu problemu budeme musiet vyziadat zdrojak od pana kolegu
> Jirku MWW, ale mozno na uvod bude stacit nieco jednoduche len s tou
> premennou s atributom umiestnujucim ho do .noinit. Mozno treba aj dat
> nejake premenne do .data a do .bss aby sa ten efekt prejavil; a mozno ten
> efekt suvisi s nejakou konkretnou arduino kniznicou (alebo cube/hal
> kniznicou).
> 
> Ten .noinit v linker skripte - ak je to tento
> https://github.com/stm32duino/Arduino_Core_STM32/blob/master/variants/NUCLEO_L476RG/ldscript.ld
> - nie je. Ak nie je ta section priradena nejakym inym sposobom - priamo
> niektorym prikazom v command line napr --section-start, pouzitim ineho
> alebo doplnkoveho linker scriptu (*) - tak je ta section pokladana za
> orphan, . V tom pripade nastupuje "cierna magia", t.j. nie prilis
> zdokumentovane pravidla, ktorymi ld odhadne, akeho charakteru ta section
> je, a umiestni ju podla toho do prislusnej output section/memory area.
> Znova, "cierna magia" je ovplyvnena aj command line, napr. - dost
> rukolapne - --orphan-handling. No a na command line samozrejme vplyvaju
> specs, ktore tiez netusim ze ako su nastavene pre prekladac, ktory sa s
> tym stm32duinom pouziva. 
> 
> Skusmo, bez celeho toho arudina/stm32duina ktore si nemienim instalovat, s
> nejaky relativne starsim gcc-based prekladacom z launchpadu (t.j. binarnym
> balikom vyrobenym ARMom) mi tu .noinit section umiestnilo medzi .data a
> .bss a to tak, ze symboly konca .data a zaciatku .bss, ktore pouziva bezny
> startup code, boli pred a za tym .noinit, t.j. startup code by sa toho
> .noinit u mna nedotkol. Inaksie povedane, mne by tam ten problem nenastal.
> 
> Dalej, mozno nieco necakane robia aj init kody jednotlivych arduino
> kniznic, ako aj mozno nieco na uvod pribali samotne arduino. Do toho ja
> vobec nevidim a ani nechcem vidiet.
> 
> Mimochodom, uvedene symptomy by sa asi mohli prejavit aj vtedy, ak umiestni
> linker tu .noinit section do FLASH - napriklad na adresu 0x00000000.
> 
> (*) Toto je jeden z tych problemov s arduinom - princip "nejako som to
> zbastlil a mne to to funguje" - a nie je to prilis transparentne ani
> zdokumentovane. Konkretne, netusim, ako su volane komponenty prekladaca, s
> akymi prepinacmi; ba dokonca ani netusim, ako presne je z .ino generovany
> c, a netusim napriklad ani to, ci a za akych okolnosti sa ten .map
> generuje a ak ano, neviem kde je (t.j. neviem si ho od pana kolegu Jirku
> MWW vypytat, inak by to bola prva a najsamozrejmejsia vec co by som
> urobil; druha by bolo vygenerovat anotovany .disasm). Takze kym sa clovek
> drzi nejakeho blizsie nefinovaneho "vyslapaneho chodnicka", vsetko je OK a
> zivot je krasny; akonahle sa odkloni co i len na krok, tak mozu nastat
> problemy - co by samo osebe ani tak velmi nevadilo, ale v pripade tych
> problemov bohuzial ten netransparentny zlepenec ztazuje bezne postupy
> ktorymi sa taketo problemy riesia.
> 
> Ale to iste plati aj pre cube a podobne "kniznice".
> 
> 
>> nemyslim to na nikoho konkretne, ale nebylo by lepsi snazit se radeji pomoci a poradit nez se povysovat jen proto, ze nejaky hobik s jinym hlavnim zajmem pouziva nejou formu arduina na nejakou trivialni ulohu jednou dvakrat za rok? 
> 
> Presne k tomu sa Vas snazim dotlacit... ;-)
> 
> wek
> 
> 
> 
> 
> 
>>> 11. 12. 2018 v 10:48, Jan Waclawek <konfera na efton.sk>:
>>> 
>>> No dobre, a mozete prosim vysvetlit ten jav co pozoruje pan kolega Jirka
>>> Mww?
>>> 
>>> Preco sa nezachova obsah premennej savedTime pri resete?
>>> 
>>> wek
>>> 
>>> 
>>> ----- Original Message ---------------
>>>> Pokud pouziva stm32duino tak je to nadstavba nad HALem od ST. A kod je zcela otevreny. Startovaci kod je standartni od ST. Je tedy uplne jedno jestli pouzije arduino, hal nebo ll pokud nezna arm a stm32. Tyhle hrabeci rady vychazeji z cire neznalosti. 
>>>> 
>>>> T
>>>> 
>>>> 10. 12. 2018 v 19:53, Jaroslav Buchta <jaroslav.buchta na hascomp.cz>:
>>>> 
>>>>> Nevim, jak to dela arduino ale standardni startovaci kod data v sekci BSS nuluje, heap zustava nepovsimnut ale tezko asi alokujete stejny blok... Hardwarove by snad reset nemel mit na obsah RAM vliv (az asi na oblasti ktere pouziva pevny bootloader)
>>>>> Cistym resenim by IMHO bylo pouzit externi USB/VCP prevodnik na jiny UART a programovadlo nechat na programovani. A nejlip zahodit arduino a mit program pod kontrolou.
>>>>> 
>>>>> 
>>>>> Dne 10.12.2018 v 19:22 Jirka Mww napsal(a):
>>>>>> Vypadek napajeni urcite nenastal, staci stisknout tlacitko reset na desce a data se prepisou.
>>>>>> Je to ale asi opravdu arduinem, hodnota je porad stejna . Prestoze je promenna definovana
>>>>>> jako word tak hodnota vypsana po resetu je asi 10x vyssi. Alespon predpokladam, ze word je
>>>>>> porad jeste 16bitu bez znamenka.
>>>>>> Dnes uz se k tomu nedostanu, zitra budu pokracovat. Podstatne je ale, ze po odstraneni
>>>>>> propojek ST linku to uz neresetuje, tak mi to zatim staci.
>>>>>> 
>>>>>> po 10. 12. 2018 v 18:33 odesílatel Miroslav Mraz <mrazik na volny.cz> napsal:
>>>>>>> No jo, po připojení napájení jsou v RAM náhodná data. Je to trochu 
>>>>>>> složitější, musíte identifikovat zdroj přerušení - asi i v této řadě 
>>>>>>> bude něco jako RCC_CSR registr, ve kterém jsou flagy zdroje přerušení. 
>>>>>>> Na začátku musíte identifikovat připojení napájení - něco jako BOR a 
>>>>>>> pokud je nastaven, příslušnou proměnnou nastavit na potřebnou hodnotu 
>>>>>>> (asi vynulovat). Pokud je zdroj přerušení jiný, neděláte nic. Tedy nic - 
>>>>>>> patrně bude nutné flagy vždy nulovat. Bývá na to speciální bit RMVF. 
>>>>>>> Není to žádná magie.
>>>>>>> 
>>>>>>> Mrazík
>>>>>>> 
>>>>>>> Dne 10. 12. 18 v 18:14 Jirka Mww napsal(a):
>>>>>>>> Zkusil jsem to  SW řešení
>>>>>>>> unsigned long   savedTime __attribute__ ((section (".noinit")));
>>>>>>>> , proměnná se sice neinicializuje na nulu, , ale ani se nezachová obsah  
>>>>>>>> před resetem, jsou tam nesmysly ,  takže budu pokračovat zítra.
>>>>>>>> Zatím díky za pomoc, hodně jsem se dnes naučil.
>>>>>>>> 
>>>>>>>> Zdravi
>>>>>>>> Jirka Sloupenský  OK1MWW
> 
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20181212/47553e1e/attachment-0001.html>


Další informace o konferenci Hw-list