Fórum témák
» Több friss téma |
Sok flash memoriaban tárolt és mindig flashre mutató static const char* pointerem van, ami sok helyet foglal, mert 32bitesek a pointerek. A flash maga csak 32kB, tehát 16 bites pointerek is lehetnének. Lehet csökkenteni a méretüket valahogy 16 bitre?
base és alma típusa bármi lehet. Ha tudod mire van mappelve a flash címe, akkor konstans számot is használhatsz a basePtr helyett. És akkor az offset tuti pozitív lesz, lehet uint16_t-re is kasztolni. C-ben a pointerek is csak számok, lehet aritmetikát végezni velük, illetve számmá castolni és vissza, csak ismerni kell az architektúrát, hogy mi működik és mi nem. Ha a pointer nem char típusú, akkor a kivonás és hozzáadás akkora egységekben történik, amire mutat a pointer, erre figyelni kell, ezt el lehet rontani. De nyerni is lehet vele, ha mondjuk 4 bájtos egységeid vannak (pl uint32_t), akkor 2 bájtos címmel 256 kB-ot is tudsz címezni. A hozzászólás módosítva: Aug 22, 2024
Azt azért érdemes megnézni, hogy a pointerenkénti 2 bájt nyereség nem úszik-e el a 16 bites pointer felhasználásához szükséges bonyolultabb (és ez miatt hosszabb) kód miatt.
Ezt a csodálatos hibaüzenetet kapom időnként fordításnál. Majd elmondom miért nem értem, de először is, pontosan mi baja is van a write_RealTime-al?
.\Objects\jcd.axf: Error: L6286E: Relocation #REL:5 in jcd1.o(.text.write_RealTime) with respect to Veneer$$LitPool. Value(0xfffff543) out of range(0 - 0xff) for (R_ARM_THM_PC8)
Még ha fix cimre rakom is, az 5-ös sorra "initializer element is not a compile-time constant" a forditó reakciója.
MCU folyamatosan újraindulSziasztok.Elsőnek fejlesztek egy vezérlőt STM32G474 procival. Nagyon nehezen sikerül még egy ledet is villogtatnom mert sokszor el sem indult a program. Már leszedtem mindent csak egy LED van és azt akarom pörgetni. Sikerült oda eljutnom hogy a program elindul de szabályosan 400msec után újra újra indul. Elszórakoztam vele újabb 3 órát és az megoldotta az folyamatos restartot hogy bekapcsoltam az options byte ben a WWDG_SW és IWDG_SW biteke. A kérdésem annyi lenne hogy mit csinálnak ezek a bitek és miért működik a program ezekkel és nélkülük miért nem? köszi
Azért indul újra, mert ez az elvárt működés.
Bővebben: Datasheet 3.24.6 és 3.24.7 A pipa azt jelenti a kétféle watchdog előtt, hogy szoftverből kapcsolod be őket. Ha nincs pipa, akkor automatikusan indulnak. Mivel nem eteted őket, az idő lejártával újraindítják a mikrokontrollert. Bővebben: Reference manual 42.3.3 és 43.3.2 A hozzászólás módosítva: Feb 23, 2025
Stop MODE magas áram fogyasztásSziasztok.Olyan kérdésem lenne hogy még mindig STM32G474 procis fejlesztéssel bajlódok. A problémám az hogy próbálom a lehető leg alacsonyabb fogyasztás kihozni ehhez Stop módba léptetem a procit. A baj ott van hogy maga a leállítási rutin ránézésre jól megy. Ha a main() ből hívom elő akkor szépen leáll és kb 50uA a fogyasztás ami teljesen OK. Ha viszont bármelyik interrupt megszakítátsból próbálom akkor 1mA. Legyen az TIMER vagy EXTI nyomógomb bemenet megszakítás mindenhol ez van. Jelenleg azt csináltam vészmegoldásnak hogy beraktam egy stop_mode=1; sort a megszításba és amikor kilép a program a megszakításból és folytatja a dolgát a main() részben ott egy if(stop_mode) feltételben indítom a leállítást. Így úgymond működik az interrupt lefutása után main() ből indítva végülis jól leáll a proci csak nem értem tisztán interuptban futtatva miért nem megy jól?
Olvastad a dokumentációt? Nem szabad ISR-ből stopba küldeni, csak a main-ből.
A HAL-os enterStop függvény meghívja a Wait For Interrupt függvényt, aminek nem lesz jó vége, ha már eleve ISR-ben vagy. Szóval jól csinálod: Az ISR-ben beállítasz egy flaget, amit a main loopban figyelsz. |
Bejelentkezés
Hirdetés |