Fórum témák

» Több friss téma
Fórum » STM32 - Blue Pill
 
Témaindító: Skori, idő: Dec 19, 2019
Témakörök:
Lapozás: OK   13 / 13
(#) benjami válasza cua hozzászólására (») Jún 10, 2024 / 1
 
Csináltam én is egy próbát stm32f401-el. Az ext interrupt forrásjelét a timer 1 PWM-el állítottam elő, összekötve a két lábat egymással. Saját interrupt handlerbe a következő kódot beletéve 6 órajelnyi ideig még a főprogram futott, ezután 33 órajelnyi időtartamra akasztotta meg a főprogram hurokban levő kimeneti láb billegtetését.
  1. void EXTI9_5_IRQHandler(void)
  2. {
  3.   IRQ_WORK_GPIO_Port->BSRR = IRQ_WORK_Pin;
  4.   __HAL_GPIO_EXTI_CLEAR_IT(EXT_IN_Pin);
  5.   IRQ_WORK_GPIO_Port->BSRR = IRQ_WORK_Pin << 16;
  6. }

Ez a két sornyi program volt a főprogramhurokban (sokszor egymás után téve, hogy a hurok elejére visszaugrás ne akassza el):
  1. MAIN_WORK_GPIO_Port->BSRR = MAIN_WORK_Pin;
  2. MAIN_WORK_GPIO_Port->BSRR = MAIN_WORK_Pin << 16;

Mivel most csak egy 24MHz mintavételezésű analizátor állt a rendelkezésemre, a CPU órajele 1MHz, a perifériák órajele 1, illetve 0.5 MHz-re lett beállítva (hogy meg tudjam mérni).
A próbát a CubeIDE alatt csináltam, a fordítót sebesség optimalizációra állítottam be.

logic.png
    
(#) cua válasza benjami hozzászólására (») Jún 10, 2024 /
 
Ez nagyjabol megegyezik az altalam emlitett 3xx ns kiszolgalasi idonek, mivel nalam 80MHz volt az orajel. En is hasonlo modon mertem amugy
(#) benjami válasza cua hozzászólására (») Jún 11, 2024 / 2
 
Ebben a pdf-ben a 47. oldalon elég jól le van írva, hogy mit csinál a proci megszakítás esetén. A proci mikrokódjában benne van PC, xPSR, R0-R3, R12, LR regiszterek verembe történő mentése és visszaállítása. Ez fix dolog, nem tudsz rajta változtatni. Ezért nem lehet megtalálni a kódban a regiszterek mentését és visszaállítását. 12 órajel a regiszterek mentése, majd 12 órajel a visszaállítása. Így nagyjából ki is jön az általam mért 33 órajelnyi végrehajtási idő.
(#) cua válasza benjami hozzászólására (») Jún 11, 2024 /
 
Ezt kerestem, koszonom!
(#) cua hozzászólása Jún 13, 2024 / 2
 
Ezt a megszakitas kezeles kerdest vegul lezavartam brute force modszerrel

A tablazatban feltunt, hogy a 32H743, 450MHz-en (plus cache) 170ns alatt eleri a megszakitast.
Ezen felbatorodva fogtam egy 32H503-at (ez volt elerheto gyorsan es ebbol van elfogadhato labszamu/meretu valtozat), ezzel 250MHz-en ~220ns alatt vagyok ugyanott, plusz ugye mivel tobb, mint haromszor magasabb az orajele, mint az eredeti 32L432-nek, igy meg marad 4-500 oraciklus ami rengeteg utasitasra eleg
Ezen meg mindig lehetne faragni jocskan, mert ami a generalt kodban latszik:
- HAL_GPIO_EXTI_IRQHandler
- HAL_GPIO_EXTI_Rising_Callback
- HAL_GPIO_EXTI_Falling_Callback
- EXTI2_IRQHandler
- EXTI3_IRQHandler
Tobbek kozt ezeken megy vegig a megszakitas kezelese, attol fuggoen hanyadik megszakitasrol van szok, ez eleg sok utasitas (feltetel kezeles) is lehet.
Egyelore jo ez ami van, teszi a dolgat.

A RP2040 PIO-javal meg matekoltam kicsit, ugyes joszag, de sajnos csak 9 utasitast ismer (miert is ismerne tobbet, IO-ra van kihegyezve), az pedig nem eleg, mindekepp vissza kell adnom a fo mcu-nak a vezerles, az pedig ido, es ez mar nem a PIO-tol fugg...
Azert gusztusos kis darab, kesobb meger egy kis discovery-t.
A hozzászólás módosítva: Jún 13, 2024
(#) vargham válasza cua hozzászólására (») Jún 13, 2024 /
 
A PIO-hoz:
Láttam több olyan megoldást, ahol régi rendszerekbe illesztették, például 6502 CPU-hoz. A PIO lekezeli az adott kontroll vonalat, így a 6502 látja, hogy az történik, aminek kell. Az általad fejlesztett cucc nem így csúszik ki az időzítésből. A CPU által már korábban összekészített adatot DMA-val kiküldi. Vagy fogadja, és DMA-val beírja a CPU által korábban lefoglalt helyre. Majd küld megszakításkérelmet a CPU-nak, aminek akkor lesz néhány 6502 órajelnyi ideje foglalkozni a feladattal, és sikerülni is fog neki befejezni, mert annyival gyorsabb.
Érdemes nézegetni a kész projekteket. Például VGA kártya Aplle ][-be vagy DMA memóriabővítés Commodore 64-hez.
(#) cua válasza vargham hozzászólására (») Jún 13, 2024 / 1
 
..de hat epp ezt oldattam meg a gyorsabb orajellel
Mar nem tudok elkesni, mert a megszakitas eleresi ido igy mar elegendoen kicsi, raadasul a megszakitas feldolgozasa kozben mar tobb mint haromszor annyi orajel all a rendelkezesemre.
Megszakitas pedig mindenkepp kell, mert a PIO nem alkalmas a kapott adat feldolgozasara, az mcu viszont elviszi akar a megszakitas kezeloben is.

Mint emlitettem kesobb meg fogom tanulmanyozni az RP2040 lehetosegeit, de ez most egy nagyon kicsi szelete az aktualis projectnek, nincs ra ido.
(#) cua válasza cua hozzászólására (») Jún 15, 2024 / 1
 
Szoval az egy nagyon szep pelda arra, amikor mar a problema megkozelitese is rossz
Ravakultam a megszakitas kiszolgalasanak a felgyorsitasara, pedig en magam is leirtam, hogy nincs foprogram, csak a megszakitas ketyeg, attol fugg mit csinal az mcu. Barmit is csinal be kell fejeznie a kovetkezo interrupt elott.
Ebbol egyenes kovetkezik, hogy egyetlen lab figyeleset ebben az esetben sokkal celszerubb egy poll-ra bizni...
Legrosszabb esetben negy (ot) oraciklus es maris billentem a kivant laba(ka)t, vagy csinalom amit kell.
  1. 800049e:        6919            ldr     r1, [r3, #16]
  2. 80004a0:        070f            lsls    r7, r1, #28
  3. 80004a2:        d4fc            bmi.n   800049e <main+0x17a>
  4. 80004a4:        619d            str     r5, [r3, #24]

Ezt mar egy lassabb proci is elviszi, bar most epp maradt a 32H503, de kiprobaltam levett orajellel is, csak hogy lassam a szkopon...

Ettol meg az RP2040 es az o PIO-ja meg ugyes cucc, sok esetben jol fog jonni
(#) benjami válasza cua hozzászólására (») Jún 15, 2024 /
 
Ez nagyon jól fog működni egészen addig, amíg kizárólag ennyi a teljes program feladata és nem esik be másik megszakítás. Ha viszont éppen beesik, akkor ki fogja várni amíg az befejeződik és csak azután fog reagálni a lábra adott impulzusra. El kell dönteni: lassabb de kiszámítható reakció idő, vagy legtöbb esetben gyors reakció idő, de ha éppen más megszakítás zajlik akkor meg lassú reakció idő. Esetleg magas prioritással meghagyhatod a jelváltozás megszakítást is (akkor az egyéb megszakítást is meg fogja szakítani), de akkor meg gondoskodnod kell az esetleges dupla reakció kivédéséről (ha ez problémát okoz).
(#) cua válasza benjami hozzászólására (») Jún 15, 2024 /
 
Nincs olyan opcio, hogy ne fejezze be idoben. Lenyegeben egy kulso, ketfazisu orajelrol van szo, ami nem fer be ket impuzus koze az nincs
Nem egy feszitett tempo, ~500kHz az orajel, abbol a szinkronjel ugye pont a fele. Az orajel/szinkronjel detektalas/eloallitas kevesebb mint 10 orajel, nagyjabol 2x2uS a hasznos rendelkezesre allo ido, par, szekvencialisan vegrehajtott utasitasra.
Mas megszakitas nincs, sot, most mar egyetlen megszakitas sincs. Tokeletesen mukodik, 'rengeteg' mcu ido maradt szabadon.
Kis tulzassal akar egy atmega is elvinne 16MHz-en, ha nagyon kellene (mondjuk ott a 10 orajelnyi detektalas kicsit tobb idot emeszt fel, az mar talan kicsit tul szoros..).
Majd kiprobalom mennyire tudok lemenni orajelben (most 250MHz-en megy), amig meg biztonsagosan mukodokepes marad.
Vannak kesobbi terveim meg ezzel a kis kapcsolassal, de azt mar talan majd masik eszkozzel (pl RP2040, mint ahogy feljebb beszeltuk)
(#) benjami válasza cua hozzászólására (») Jún 15, 2024 /
 
Főprogram hurkos verzióban olyan procit kell választani, ami 2 magos. Ekkor az egyik mag csak ezzel foglalkozhatna, semmi más dolga nem lenne, nem kellene neki egyéb megszakítással foglalkoznia. Az stm32 között is létezik 2 magos, na meg a már említett RP2040 is az. ESP32 is az.
(#) cua válasza benjami hozzászólására (») Jún 15, 2024 /
 
Jelen esetben a ket mag mar tenyleg agyuval verebre lenne.
Ez egy 50+ eves konstrukcio, egy i8008-al tart lepest az aramkor. Egesz pontosan az i8008 helyett dolgozik.
Ha siman illeszteni kellene (kellett volna) akkor nem foglalkoztam volna idozitessel, arra ott a READY lab.
Következő: »»   13 / 13
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