Fórum témák

» Több friss téma
Fórum » ARM - Miértek hogyanok
 
Témaindító: gtk, idő: Jún 26, 2007
Lapozás: OK   177 / 177
(#) sszasza hozzászólása Aug 21, 2024 /
 
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?
(#) asch válasza sszasza hozzászólására (») Aug 22, 2024 /
 
  1. static const uint32_t base;
  2. static const uint32_t alma;
  3.  
  4. static const char * basePtr=&base;
  5. static const int16_t offset_alma=(int16_t)(((char *)(&alma)) - (char *)&base);
  6.  
  7. void let_alma_be_112()
  8. {
  9.   *(int32_t *)(basePtr+offset_alma) = 112;
  10. }


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
(#) benjami válasza sszasza hozzászólására (») Aug 24, 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.
(#) sszasza hozzászólása Szept 14, 2024 /
 
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)
(#) sszasza válasza asch hozzászólására (») Szept 15, 2024 /
 
Még ha fix cimre rakom is, az 5-ös sorra "initializer element is not a compile-time constant" a forditó reakciója.
(#) cimopata hozzászólása Feb 22, 2025 /
 

MCU folyamatosan újraindul

Sziasztok.

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
(#) vargham válasza cimopata hozzászólására (») Feb 23, 2025 / 2
 
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
(#) cimopata válasza vargham hozzászólására (») Márc 3, 2025 /
 
Értem, köszönöm szépen!
(#) cimopata hozzászólása 18:09 /
 

Stop MODE magas áram fogyasztás

Sziasztok.

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?
(#) vargham válasza cimopata hozzászólására (») 18:26 /
 
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.
(#) cimopata válasza vargham hozzászólására (») 21:55 /
 
Oké köszi olvasgatom folyamatosan de ezt nem tudtam.
Következő: »»   177 / 177
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem