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