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   120 / 177
(#) rascal válasza don_peter hozzászólására (») Máj 12, 2018 /
 
A WeTransferrel minden regisztráció nélkül 2GB-ig bármit át lehet küldeni. Arra ráadásul nincs korlát, hogy hány ilyen csomagot akarsz átküldeni. A saját és a címzett e-mail címe kell. Te feltöltöd a fájlokat, a címzett kap egy értesítést ami alapján letöltheti. Pár nap múlva törlődik. Ha titkos a dolog, akkor jelszóval tömörítheted, vagy kitalálhatsz valami trükköt, mert elvileg onnan bárki letöltheti, aki valahogy rábukkan.
(#) ngabor0204 hozzászólása Máj 13, 2018 /
 
A flashbe próbálok írni egy STM32F030-on, de nem megy. Ezzel próbálkoztam:

  1. HAL_FLASH_Unlock();
  2. FLASH_PageErase(0x08003800);
  3. HAL_StatusTypeDef stat = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x08003800, 0x55aa);
  4. HAL_FLASH_Lock();


A törlés működik, mert ha az ST-LINK Utilityvel beírok valamit a flashbe, utána ez a kód törli, és FF lesz minden. A végén megnézem a stat változót, és HAL_OK az értéke, tehát elvileg beírja az értéket. Ennek ellenére a 0x08003800-as címen nincs ott a 0x55aa.
(#) Topi válasza ngabor0204 hozzászólására (») Máj 13, 2018 /
 
Így kezdd:

  1. FLASH_Unlock();
  2. FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP| FLASH_FLAG_WRPERR);


Plusz 030 alatt lehet, hogy ezt is törölni kell (FLASH_CR_PER), 042-n nem kell csak a fenti.
(#) ngabor0204 válasza Topi hozzászólására (») Máj 13, 2018 /
 
A FLASH_ClearFlaget nem találja a fordító. STM32CubeMX-szel csináltam a projektet, gondolom, a HAL drivereket belepakolta, ezért azokat elérem. Szóval a következővel próbálkoztam:

  1. HAL_FLASH_Unlock();
  2. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_BSY);
  3. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
  4. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR);
  5. __HAL_FLASH_CLEAR_FLAG(FLASH_CR_PER);


De ugyanúgy nem ír semmit a flashbe.
(#) Topi válasza ngabor0204 hozzászólására (») Máj 13, 2018 / 1
 
És ha programból olvasod vissza, akkor sincs meg?

Próbaként write előtt törölt a PER-t.
  1. FLASH->CR &= ~FLASH_CR_PER;


Szerk: Tehát erase után, write előtt.
A hozzászólás módosítva: Máj 13, 2018
(#) ngabor0204 válasza Topi hozzászólására (») Máj 13, 2018 /
 
És ez volt a megoldás! Köszönöm szépen. (Pedig feltúrtam egy csomó weboldalt, de ezt nem találtam meg.)

Továbbra sem értem, hogy a __HAL_FLASH_CLEAR_FLAG(FLASH_CR_PER); miért nem oldotta meg, a FLASH->CR &= ~FLASH_CR_PER; pedig miért, de egyelőre most örülök, hogy végre működik.
(#) Topi válasza ngabor0204 hozzászólására (») Máj 13, 2018 /
 
Azért, mert a FLASH_CR_PER nem flag bit, hanem control bit (azért van CR-ben).

Erase előtt kell, hogy Page erase módot engedélyezd:
FLASH->CR |= FLASH_CR_PER;

Write előtt kell, hogy a Page erase módot letiltsd mielőtt írsz bele:
FLASH->CR &= ~FLASH_CR_PER;
(#) ngabor0204 válasza Topi hozzászólására (») Máj 13, 2018 /
 
De marha vagyok, erre magamtól is rájöhettem volna, ha jobban megnézem a makrót, hiszen a __HAL_FLASH_CLEAR_FLAG nem is a CR regisztert állítja, hanem az SR-t (gondolom, status register).

Még egyszer köszönöm a segítséget.
(#) don_peter hozzászólása Máj 15, 2018 /
 
Srácok ez nekem még nagyon magas.
Borzasztó szövevényes ez a kód generáló progi. (STMCubeMX)
Legalább is amit generál kódot, nagyon átláthatatlan.
Pl.: most megy az SD, de az istenért nem tudom mellé beizzítani az FSMC-t.

Nincs valakinek egy olyan SD FATFS projektje, amit saját maga rakott össze?
Mármint olyan, amiben csak a normál alap könyvtárakat használta?
STM32F407-et használok.
Eddig minden mást sikerült elég egyszerűen beizzítani, de ez a FATFS elég bonyolultnak tűnik, legalább is a sima könyvtárakat használva. (STM32F4 Standard Peripheral Library) SDIO és DMA-ra is szükségem lenne, 4bit-ben használnám az SD kártyát.
Előre is köszi.
A hozzászólás módosítva: Máj 15, 2018
(#) benjami válasza don_peter hozzászólására (») Máj 15, 2018 /
 
Én anno csináltam egy áttekintő doksit a FAT kezelésről (a mellékletben)

fat.pdf
    
(#) don_peter válasza benjami hozzászólására (») Máj 15, 2018 /
 
Valaki megnézné nekem, hogy ez miért nem működik? : Bővebben: Link
Mindig itt akad el:
  1. SDIO_IRQHandler  
  2.         B SDIO_IRQHandler

Még nem értem pontosan mi hogy működik, és PIC-hez képest kicsit nehezebbnek is tűnik.
STM32F4 Standard Peripheral Library-t használom, a projektben ez látszik is.
IAR-al bütykölgetem, 32F407ZET6

A kártyát már észreveszi és be is tölti, de mikor egy file-t akarok megnyitni, akkor leakad a fent említett sornál, ami a startup_32f4xx.s fájlban van.
Így elsőre vagy a megszakítás vagy a DMA-val lehet gondja..
Előre is köszi..
(#) don_peter válasza benjami hozzászólására (») Máj 15, 2018 /
 
Köszi, a BSP az mire kell?
Az csak akkor kell, ha pl. HDD-t akarok használni?
Nem igen értem még, mi mit jelet.
A HAL-t sem tudom miért kell. (vagy ez csak valami gyűjtő fogalom?)
Lentebb linkeltem a projektem, ha rá tudnál nézni azt megköszönném.
Sajna IAR-hoz van..
(#) csatti2 válasza don_peter hozzászólására (») Máj 15, 2018 / 1
 
A HAL elnevezés kicsit trükkös STM32-nél lévén, hogy egyszerre egy gyűjtőfogalom (ilyen szempontból a HAL, az SPL és az LL is HAL [Hardware Architecture Layer]), illetve az ST egyik megoldásának a neve is.
Az általad perferált SPL már nem támogatott, az új mikrokontrollerekre nem készítik el ezért a kódjaid nem lesznek hordozhatóak.
A HAL egy magasabb szintű réteg, ezt használja alaphelyzetben a CubeMX. A kód jelentős részét elrejtették könyvtárakban (én nem nagyon szeretem).
Az LL (Low Layer) az SPL utódja, egy hardverközeli programozást lehetővé tévő réteg (a nagy része inline függvény, ami direktben a regisztereket piszkálja, ugyanolyan gyors mintha te írnád a regisztereket csak sokkal olvashatóbb a kód).
(#) kapu48 válasza don_peter hozzászólására (») Máj 15, 2018 /
 
Sajnos nem ismerem az általad használt „IARt”.
Ezért a programod fordítása elmaradt. (Javaslat: Tanuld meg inkább az Atolicot használni, az többek előtt ismerős.)

A programodban lefutatva egy keresést nem találtam a definícióját: void SDIO_IRQHandler (void)????
Ezt általában az: „stm32f4xx_it.c”-ben szokták létrehozni.
(#) kapu48 válasza don_peter hozzászólására (») Máj 15, 2018 / 1
 
Próbálj ebböl ötletet meríteni:
A hozzászólás módosítva: Máj 15, 2018

SD_FatFS.zip
    
(#) don_peter válasza kapu48 hozzászólására (») Máj 16, 2018 /
 
Igen valóban nincs.. Egy ilyen részt találtam, ami az eredeti programban szerepel mint hivatkozás:
  1. .section  .text.Default_Handler,"ax",%progbits
  2. Default_Handler:
  3. /*      bl  isrDefaultHandler*/
  4.   TST LR, #4
  5.   ITE EQ
  6.   MRSEQ R0, MSP
  7.   MRSNE R0, PSP
  8.   B default_handler_c

Majd a hivatkozás:
  1. .weak      SDIO_IRQHandler            
  2.    .thumb_set SDIO_IRQHandler,Default_Handler

Csatoltam a fájlt amiben megtaláltam.
Át lehetne ezt tenni az én kódomba valahogy, hogy meglegyen a kiszolgálás?
Csatoltam az eredeti projektet is amiből építkeztem.
(#) kapu48 válasza don_peter hozzászólására (») Máj 16, 2018 /
 
Sajnos részemről passzolom a témát.
Nem ismerem ezt a firmvaret, hátha lesz szerencséd és erre jár valaki hozzáértő.

(Mondjuk, nekem eszembe se jutna kezdőként rögtön SD botloadert írni!)
(#) don_peter válasza kapu48 hozzászólására (») Máj 16, 2018 /
 
Ja nem, dehogy írok bootloader-t. Még..
SD kártya kezelését puskáztam belőle, SPL-t használ, ezért választottam ezt, egyelőre beállítottam a gyári a SD kezelő-t, remélem jó lesz, ha nem, akkor vagyok gondban. Később tudom csak kipróbálni.
Már ez is sok segítség volt, hogy rávezettél, hogy hol lehet a hiba. (első hiba)
(#) don_peter válasza csatti2 hozzászólására (») Máj 16, 2018 /
 
Értem, köszi a kifejtést.
Egyelőre maradok még az SPL-nél, tanulásnak szerintem jó lesz és majd lehet agyalni merre tovább, de ezek szerint az LL lesz az irány. HAL és a CubeMX annyira szétszórja a kódot, hogy átláthatatlan számomra. (egyelőre)
Ráadásul tök nem is akart menni elsőre amiket generált, nem is értettem pontosan miért, no mindegy gondolom ezt is meg kell szokni.
(#) kapu48 válasza don_peter hozzászólására (») Máj 16, 2018 /
 
Én inkább a könnyebb utat szoktam választani, gyárilag az Atolicot támogatják!

Abban lehet, hogy te is több segítséget kapnál.
Elsőre talán bonyolultabbnak tűnik, de minden megtanulható.

És a szétszórtságot inkább felfoghatjuk úgy is, hogy mindennek helye van. Így egy idő után könnyebb lesz megtalálni
A hozzászólás módosítva: Máj 16, 2018
(#) don_peter válasza kapu48 hozzászólására (») Máj 16, 2018 /
 
Az a baj, minél összetettebb programot használok, annál nehezebben értem meg a működést és annál felületesebb lesz a tudásom.
PIC esetében is az alap, jó nem assemblerben, de alap C-ben írtam meg mint, mind a programrészeket mind pedig a regiszterek basztatását.
Nem azt állítom, hogy ma már perfekt megy a PIC-ek programozása, de szereztem annyi ismeretet, ha el is akadok és segítséget kérek, tudom értelmezni a válaszokat.
És az adatlapot is elég jól tudom már használni..

Nagyjából ha ezt a szintet el tudom sajátítani ARM esetén is, már örülni fogok.
PIC-re nem olyan rég 3 nap alatt megírtam az SD kezelést, +4 nap alatt pedig a teljes FAT16 kezelést.
Cserébe tudom, hogy működik egy SD kezelés, részleteiben is és, hogy kezeljem egy ismeretlen környezetben is. Tehát van azért ennek is előnye.

Ebben az ARM témában és programozásban viszont végtelen kezdő vagyok, és szeretnék tanulni, de nem úgy, hogy állandóan egy környezet fogja a kezemet, hanem úgy, hogy ha módosítanom kell egy programot, akkor azt megtehessem könnyedén.

Ettől független az IAR nem egy végleges és fix környezet, amelyet miden áron használni szeretnék, de végtelen egyszerű és ez tetszik benne. Remélem azért valaki tud majd így is segíteni nekem..
A hozzászólás módosítva: Máj 16, 2018
(#) csatti2 válasza don_peter hozzászólására (») Máj 16, 2018 /
 
GCC alatt ez szépen működik (a saját kis tanulmány RTOS-omból másoltam). IAR alá nem garantálom, de ahogy mások is írták, IAR specifikus dolgokkal itt jó eséllyel magadra maradsz.

  1. #define NAKED                             __attribute__((naked))
  2.  
  3. // Exception stack frame
  4. typedef struct
  5. {
  6.         uint32_t r0;               // R0
  7.         uint32_t r1;               // R1
  8.         uint32_t r2;               // R2
  9.         uint32_t r3;               // R3
  10.         uint32_t r12;              // R12
  11.         uint32_t lr;               // Link register
  12.         uint32_t pc;               // Program counter
  13.         uint32_t psr;              // Program status register
  14. #ifdef LWOS_FPU
  15.   uint32_t s0;               // S0
  16.   uint32_t s1;               // S1
  17.   uint32_t s2;               // S2
  18.   uint32_t s3;               // S3
  19.   uint32_t s4;               // S4
  20.   uint32_t s5;               // S5
  21.   uint32_t s6;               // S6
  22.   uint32_t s7;               // S7
  23.   uint32_t s8;               // S8
  24.   uint32_t s9;               // S9
  25.   uint32_t s10;              // S10
  26.   uint32_t s11;              // S11
  27.   uint32_t s12;              // S12
  28.   uint32_t s13;              // S13
  29.   uint32_t s14;              // S14
  30.   uint32_t s15;              // S15
  31.   uint32_t fpscr;            // Floating point status and control register
  32. #endif
  33. } StackFrame_t;
  34.  
  35. /** \brief Stop point for hard faults
  36.  *         Registers are available in stack frame for debugging
  37.  *
  38.  * \param stackFrameAddress uint32_t*
  39.  * \return void
  40.  *
  41.  */
  42. #pragma GCC diagnostic push
  43. #pragma GCC diagnostic ignored "-Wunused-but-set-variable"
  44. void __attribute__((optimize("O0"))) _HardFault_HandlerC(uint32_t *stackFrameAddress)
  45. {
  46.     volatile StackFrame_t *stackFrame;
  47.  
  48.     stackFrame = (StackFrame_t*)stackFrameAddress;
  49.  
  50.     __ASM volatile("BKPT #0");
  51.  
  52.     while (1) {}
  53. }
  54. #pragma GCC diagnostic pop
  55.  
  56. /** \brief Handler for hard faults
  57.  *         Checks which stack pointer were used at point of fault (main / process), stores stack pointer as argument for C handler function
  58.  *
  59.  * \param void
  60.  * \return NAKED void
  61.  *
  62.  */
  63. NAKED void HardFault_Handler(void)
  64. {
  65.     __ASM volatile(
  66.       "tst lr, #4             \n\t"     // Test bit 2 of EXC_RETURN code
  67.       "ite eq                 \n\t"
  68.       "mrseq r0, msp          \n\t"     // If 0, stacking used MSP, copy to R0 (main task, IRQ or kernel function)
  69.       "mrsne r0, psp          \n\t"     // If 1, stacking used PSP, copy to R0 (any other task)
  70.       "b _HardFault_HandlerC  \n\t"     // Call C hard fault handler function
  71.     );
  72. }
(#) don_peter válasza kapu48 hozzászólására (») Máj 16, 2018 /
 
Köszi a kapott kódot sikerült beizzítanom 1 óra alatt.
A kérdésem a következő, látom azért hogy miként épül fel, de megkérdezem inkább az a biztos.
A kód az DMA-val kezeli 4bit-en az SD kártyát igaz, jól értelmezem?
A hozzászólás módosítva: Máj 16, 2018
(#) kapu48 válasza don_peter hozzászólására (») Máj 16, 2018 /
 
A 4bit-es mód igaz. De DMA nincsen.
Megszakításban megy az SD kezelése.

Hiszen ezt a hibát kerested: (SDIO_IRQHandler)?
Ezért olyan példát kaptál
A hozzászólás módosítva: Máj 16, 2018
(#) don_peter válasza kapu48 hozzászólására (») Máj 17, 2018 /
 
Igen ez volt az eredeti hiba, de azt nem sikerült megoldanom.
Nem működött egyik változattal sem, kipróbáltam a lehetőségeket, valószínűleg más hiba is van benne.

Amit küldtél kódot azt egy az egyben élesztettem fel, és az működik.
Ahogy nézem a felépítését mint ha kezelné a DMA-t.
Innen gondolom:
SD_Init() -> SD_GPIO_Configuration()
  1. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

Igaz ennél mélyebben nem látom át, de tán ez azt jelenti, hogy DMA-val megy a kezelés.
Illetve még az SD_Inti() függvényben van 2 lényeges rész:
  1. Status = SD_EnableWideBusOperation(SDIO_BusWide_4b);
  2. Status = SD_SetDeviceMode(SD_DMA_MODE);
A hozzászólás módosítva: Máj 17, 2018
(#) kapu48 válasza don_peter hozzászólására (») Máj 17, 2018 /
 
Jobban belegondolv, igazad lehet:
  1. /* Correspondence between physical drive number and physical drive.      */
  2. // diskio.c 15. sor:
  3. #define BlockSize            512 /* Block Size in Bytes */
  4. #define SD_Mode                         0               //Ha: 0 dma, 1 interrupt mode


Én hiányoltam a DMA interupt kidolgozását a programban.
Ha nincs interupt? Csak lekérdezéssel tudjuk meg mikór van kész a DMA átvitel?
(#) don_peter válasza kapu48 hozzászólására (») Máj 17, 2018 /
 
Passz, ezen része még nekem ködös.
Annyit látok, hogy remekül és gyorsan tölti be az 1MB-os fájlt.
Elméletileg pár órán belül lesz egy elfogadhatóan jól működő kódom és akkor lehet tudom tesztelni a sebességét, legalább is 1MB-os fájlok esetében.
Kíváncsi vagyok én is, hogy mit tud a kicsike..
Ez a SPL már sokkal jobban tetszik és átláthatóbb, jól lehet benne dolgozni.
(#) kapu48 válasza don_peter hozzászólására (») Máj 17, 2018 /
 
Indulásnak a KEIL a legjobban támogatott, csak a méretkorlátozás ne lenne a demónál!

Itt találtam igazi DMA átviteles példát:
Bővebben: Link
Koreai oldalra fordítást kellet kérni.
Érdemes átolvasni.
(#) don_peter válasza kapu48 hozzászólására (») Máj 17, 2018 /
 
Ezt az utóbbi kódot, te amúgy használod?
Esetleg azt meg tudod nézni rajta, hogy miképpen lehet fájlba írni?
Próbálgatom, de az írás nem akar sikerülni.
A fájlt már létrehozta, de beleírni valamiért nem akar, azt nem tudom még hogy miért.
Előre is köszi..
(#) kapu48 válasza don_peter hozzászólására (») Máj 17, 2018 /
 
Az eredeti kód STM32F411ret-re van fordítva, ez csak 64 pines Proci.

Újra kellene építeni a projectet F407zet-re, mert az ügye 144 pines.

Ott tartok, hogy csináltam egy állatorvosi ló szerű projectet, beledobálva mindent.
CubeMX-ben, de még kidolgozva nincsen.
A hozzászólás módosítva: Máj 17, 2018
Következő: »»   120 / 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