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   33 / 177
(#) cpt.zoltan.simon válasza _vl_ hozzászólására (») Jún 3, 2013 /
 
Igaz, jogos. Amit én használok az az STM32F207ZGT6
Adott változó adott helyre:

  1. unsigned short  TFTRAM[384000] __attribute__((at(0x64000000)));
(#) _vl_ válasza cpt.zoltan.simon hozzászólására (») Jún 3, 2013 /
 
Nem egyszerűbb lenne pointerrel csinálni?
(#) ciw válasza _vl_ hozzászólására (») Jún 3, 2013 /
 
Igaz, a tokozásról nem volt szó. Akkor mindenképp be kell újítanom egy I tokozást és akkor fullos a cucc. Egy Ilyenre gondoltam, bár ezen meg nincs SWD. Most akkor JTAGot is vennem kell?
Esetleg a discovery-n lévő STlink-el tudom ezt is programozni?
(#) cpt.zoltan.simon válasza _vl_ hozzászólására (») Jún 3, 2013 /
 
Később már pointer-ként van használva, a DMA-ban memory-memory copy alkalmával már fizikai memória van beírva. A pointer deklarálásához használtam a
  1. pTFTRAM = &TFTRAM[0];

sort.

Persze lehetett volna még sokat finomítani rajta, meg 2D tömb, hogy a sorok, oszlopok könnyebben kezelhetőek legyenek, de első körben csak az volt a lényeg hogy egy 800x480 képet a lehető leggyorsabban tolja ki, a fölötte lévő API meg majd később.
Most az egészet portol-om LPC1788-ra, ebben már van TFT vezérlő, 32Mx32bit SDRAM, szóval sokkal könnyebb lesz a dolgom, DMA pl nem is fog kelleni. Most a NAND Flash-el bajlódok, mert nem minden tiszta még.
(#) _vl_ válasza cpt.zoltan.simon hozzászólására (») Jún 3, 2013 /
 
Szerintem egyszerűbb lett volna a
  1. #define pTFTRAM ((unsigned short *)0x64000000)

megvalósítás...

Idézet:
„Most az egészet portol-om LPC1788-ra, ebben már van TFT vezérlő”

Van már neki utódja, az LPC4088 személyében.
(#) _vl_ válasza ciw hozzászólására (») Jún 3, 2013 /
 
Az STlinkhez nem értek, de rémlik, hogy valami ilyesmi volt írva a doksijába, hogy lehet függetlenül használni a JTAG illesztőjét másik CPU-val is, meg lehet a rajta levő CPU-t is használni másik JTAG illesztővel.
A konkurens cégek ezt odáig fejlesztették, hogy akár ketté is lehet fűrészelni a panel két felét: Bővebben: Link
(#) ciw válasza _vl_ hozzászólására (») Jún 3, 2013 /
 
De akkor a 407ZTG6-os ARM-al már menni fog az SRAM , meg NOR vagy NAND flash mindenféle varázlsat nélkül, meg címvonal nélkül?
Mert akkor megrendelem.

Tehát akkor NOR: CE->NCE2, WE->NWE, RE->NOE jó lesz?

cpt.zoltan.simon: értem, tehát akkor a DMA verziónál már nam a kijelzőt babrálom ha mondjuk egy vonalat akarok rajzolni, hanem a ram területen kiszámolom, hogy hová esik az adott pixelhez tartozó terület és oda írom be az adatot?
A hozzászólás módosítva: Jún 3, 2013
(#) _vl_ válasza ciw hozzászólására (») Jún 3, 2013 /
 
Valószínű menni fog. Legfeljebb nem bírja stabilan a max. adatátviteli sebességet és lejebb kell venni, ha ilyen összedugós megoldásban próbálod összehozni. Ugyanazokra a buszvezetékekre több "fogyasztót" rá lehet kötni, de nagyobb sebességnél (>=30-40-50MHz) lehetnek gondok, ha nem tudod a reflexiókat kiküszöbölni, és azt nehéz az ilyen összedugós cuccoknál. Persze lehet hozzá egy rendes panelt is tervezni.
(#) ciw válasza _vl_ hozzászólására (») Jún 3, 2013 /
 
Lesz rendes panel, de mivel még kezdő vagyok ARM téren,, szeretném kipróbálgatni a dolgokat, és amikor elég biztos vagyok, hogy jó lesz, akkor végleges panel lesz.

Ezzel az összedugós cuccal, csak a taknyolást akarom elkerülni, ne keljen már mondjuk a NORt a levegőben megforrasztani
(#) _vl_ válasza ciw hozzászólására (») Jún 3, 2013 /
 
Teljesen jó az úgy tesztelésre, legfeljebb alacsonyabb frekin járatod.
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Jún 3, 2013 /
 
Címvonal is kell. SSD1963-nak az A0, az SRAM-nak nálam A0...A19-ig.
Az SSD, a NAND meg az SRAM egy és ugyanazon az FSMC buszon van. Az egyetlen totál külön vezeték az az NCEx.
A működést jól látod. A buszterhelés csökkentésére még be akartam játszani hogy ne menjen a DMA folyamatosan hanem egy Timer INT olyan sebességgel csinálja a frissítési folyamatot hogy a teljes frissítés (mely képenként 6 részből áll) 25x jöjjön létre másodpercenként, 40-45 helyett.
A litván srác a 417el 240MHz-es túlhajtással (168 helyett), ugyan azzal a 10ns SRAM-al mint én 65fps-t ért el, igaz CMSIS libeket használva ami ugye lassít.
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Jún 3, 2013 /
 
Hát én is CMSIS-t használok, van így is mit megtanulnom.

És nem kell megvárni a képfrissítés kezdetét (sync) hogy ne jelenjenek meg villódzó részek?
Vagy Framebuffer két ram terület, az egyik a kijelzőre van állítva, a másikat módosítod és ha kész vagy megcseréled a pointert.
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Jún 3, 2013 /
 
Nem fog villogni. Akkor villog ha 20Hz körül van a frissítés.
Másfelől, az SSD az frissíti a képet saját maga, én itt csak arról írtam hogy az MCU milyen sebességgel tolja a képet. Azaz tudja úgy tolni, hogy se az SSD, se az ARM miatt nem fog villogni.
CMSIS nélkül egyszerűbb. Komolyan. FSMC beállítása 3 regiszter, + a portlábak. DMA is 5 sor ha a setupjáról van szó. Interrupt szintén.
Nem kell hasranesni rajta. Ez is csak egy proci mint a többi. Vannak regiszterek, azok meg le vannak írva hogy mi micsoda.
(#) ciw hozzászólása Jún 3, 2013 /
 
Valami mégsem jó:
  1. void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID)
  2. {
  3.   uint32_t data = 0;
  4.  
  5.   /* Send Command to the command area */        
  6.   *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = 0x90;
  7.   *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00; //<- itt vár a végtelenségig
  8.  
  9.    /* Sequence to read ID from NAND flash */   
  10.    data = *(vu32 *)(NAND_FLASH_START_ADDR | DATA_AREA);
  11.  
  12.    NAND_ID->Maker_ID   = ADDR_1st_CYCLE (data);
  13.    NAND_ID->Device_ID  = ADDR_2nd_CYCLE (data);
  14.    NAND_ID->Third_ID   = ADDR_3rd_CYCLE (data);
  15.    NAND_ID->Fourth_ID  = ADDR_4th_CYCLE (data);  
  16. }


A 7. sornál végtelen ciklus.
Bkötés:

D0-D7 -> FSMC D0-D7
ALE -> PD12
CLE -> PD11
NOE ->PD4 (RE)
NWE ->PD5 (WE)
NCE2 -> PD7(CE)
NWAIT ->PD6 (R/B)

Cím képzés:
  1. #define CMD_AREA                   (uint32_t)(1<<17)  /* A17 = CLE  high */
  2. #define ADDR_AREA                  (uint32_t)(1<<16)  /* A16 = ALE high */
  3.  
  4. #define DATA_AREA                  ((uint32_t)0x00000000)
  5. #define NAND_FLASH_START_ADDR     ((uint32_t)0x70000000)
  6.  
  7. #define ROW_ADDRESS (Address.Page + (Address.Block + (Address.Zone * NAND_ZONE_SIZE)) * NAND_BLOCK_SIZE)


FSMC:
  1. /*-- FSMC Configuration ------------------------------------------------------*/
  2.   p.FSMC_SetupTime = 0x01f1;
  3.   p.FSMC_WaitSetupTime = 0x01f2;
  4.   p.FSMC_HoldSetupTime = 0x01f3;
  5.   p.FSMC_HiZSetupTime = 0x01f1;
  6.  
  7.   FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND;
  8.   FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable;
  9.   FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
  10.   FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable;
  11.   FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_512Bytes;
  12.   FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0xa1;
  13.   FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x15;
  14.   FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p;
  15.   FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;
  16.  
  17.   FSMC_NANDInit(&FSMC_NANDInitStructure);
  18.  
  19.   /* FSMC NAND Bank Cmd Test */
  20.   FSMC_NANDCmd(FSMC_Bank2_NAND, ENABLE);

Nem értem miért hal meg, de olyan szinten, hogy SWD vel is csak reset után tudom megszólítani a discovery-t.
A hozzászólás módosítva: Jún 3, 2013
(#) _vl_ válasza ciw hozzászólására (») Jún 3, 2013 /
 
Szerintem az ALE és a CLE definícióját felcserélted.
ALE -> PD12 -> A17 ->
  1. #define ADDR_AREA                  (uint32_t)(1<<17)  /* A17 = ALE high */

kéne legyen.
(#) cpt.zoltan.simon válasza _vl_ hozzászólására (») Jún 3, 2013 /
 
Ez kapcsolás függő lehet. Mi a NAND típusa, hová mi van bekötve? Mert pl nézd meg a mellékelt schematic-ot amit én használok, aztán látható hogy nálam miért:
  1. #define CMD_AREA                   (uint32_t)(1<<20)  /* A20 = CLE  high */
  2. #define ADDR_AREA                  (uint32_t)(1<<19)  /* A19 = ALE high */


4Mega pdf-et nem lehet feltölteni?
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Jún 3, 2013 /
 
Az LCD-m CS lába és a NAND CE lába egyaránt a PD7-re esik. Ez nem lehet gond?

Csak akkor hal meg, ha megszólítom a NAND-ot, ha csak initelem, akkor a kijelző is megy.
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Jún 3, 2013 /
 
Ez baj. Épp ez a láb aminek külön kellene lennie. A CS, CE lábakat külön külön kell kötni az egyes NCEx lábakra, melyek végül az ARM memóriájában mint címtartományok képeződnek le.
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Jún 3, 2013 /
 
Azt hittem az Ax lábakkal választok címet. Most keresek egy másik helyet valamelyik engedélyező lábnak, de nem biztos, hogy lesz.
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Jún 3, 2013 /
 
Félre értettük egymást.
NCEx az a chip-et választja, tehát hogy a DATAx, és Ax meg a többi melyik chip-re vonatkozik.
Tanács: ird le egymás alá hogy NCEx lábak hol lehetnek mert van olyan hogy ugyan azon a port lábon lehet NCE2, és 4 is. Több NCEx lábat használva kavarj egy olyat ahol nincs konfrontáció. Pl nekem:
NE2 = SRAM
NE4 = SSD1963

Init-je a melléklet szerint.
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Jún 3, 2013 /
 
Örök hála, mostmár értem!
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Jún 3, 2013 /
 
Frankó. A DMA-s részt annó töröltem, mert átírom Timer-Driven-re, de az init után DMA nélkül is működik az alábbi formában:

  1. LCD_REG = 0x2A; LCD_RAM = 0x00; LCD_RAM = 0x00; LCD_RAM = 0x03; LCD_RAM = 0x1F;
  2. LCD_REG = 0x2B; LCD_RAM = 0x00; LCD_RAM = 0x00; LCD_RAM = 0x01; LCD_RAM = 0xDF;
  3. LCD_REG = 0x2C;
  4. //és akkor itt do while vagy akármi, ömleszthető a pixeladat. Akár a külső SRAMból, 0x6400 0000-tól.
(#) _vl_ válasza ciw hozzászólására (») Jún 3, 2013 /
 
Nem lesz. Rosszul olvastam, és nem 1 bank NOR/SRAM/TFT ÉS 1 bank NAND, hanem VAGY... Ugyanazon az egy szem fizikai lábon jönne ki a NAND chip select és a NOR/SRAM/TFT chip select is.
Ha kikapcsolható az adott FSMC bank működése, akkor lehet olyat csinálni, hogy kivezetsz két tovább GPIO lábat, az egyik chip selectet úgy állítod elő, hogy az NE1/NCE2 lábat és az egyik GPIO lábat egy OR-kapuba vezeted, a másik chip selectet meg a másik GPIO lábbal, és így a GPIO lábakkal tudod eldönteni, hogy melyik periféria legyen aktív. Persze amíg az egyik üzemel, addig a másikat le kell tiltani. A DMA sem tud menni ezalatt...

Na jó, egy GPIO láb is elég, ha magas, akkor az egyiket választottad, ha alacsony, akkor a másikat.
A hozzászólás módosítva: Jún 3, 2013

f4c.png
    
(#) ciw válasza _vl_ hozzászólására (») Jún 3, 2013 /
 
Ja én is ezt néztem, csak külön külön működik.
A melléklet magáért beszél, azt hiszem ezt hívják szívásnak .
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Jún 3, 2013 /
 
Az SSD paraméterezése kicsit bonyolult-ra sikerült, de igy lehetett olvasmányosra megcsinálni, ráadásul kiszámolósra is.
Tehát ami eddig a táblázatban 81 elem van, azokat így és ebben a sorrendben kell hagyni, mert később az adott TFT típusra számoló a tömb egy adott elemére mutat.
Majd egy külön programrész feltölti az adatokat az SSD-be. Tapasztalatom szerint ennyi adat, paraméter elég ahhoz hogy a TFT rendesen legyen config-olva, de alatta tetszés szeint bővíthető, ha a tömb méretét mutató 0. elemet ami most éppen 81 szépen átírjuk.
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Jún 3, 2013 /
 
Én is kerestem anno az X,Y, Z portokat.
Kipróbáltad a kódot amit küldtem? A system_stm32f.c file-ba ne felejtsd el engedélyezni az EMC-t mert én csak a gyári-n felüli lábakat konfiguráltam, az alapértelmezetteket Keil-re bíztam.
  1. /*!< Uncomment the following line if you need to use external SRAM mounted
  2.      on STM322xG_EVAL board as data memory  */
  3. #define DATA_IN_ExtSRAM
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Jún 4, 2013 /
 
Kösz a kódot, de még nem próbáltam, míg nem tudok SRAMot tenni az ARM-ra addíg nem tudom kipróbálni.
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Jún 4, 2013 /
 
Nekem van egy STM32F207ZGT6, rajta az 512k SRAM (16bites), (800x480hoz 384k kell), gyári panel, csak a NAND flash-t kell rápakolni. Ebay.ről vettem, csak az SRAM volt külön beszerzés, csak az volt 8eFt, mert 10ns-os, gyors típus.
STM32F207ZGT6

Erre csak az SSD-t kell rápakolni, meg tegyél rá egy uSD kártyát, tudja vezérelni SDIO-ba. A NAND-ot leszedtem róla mert nem kellett, igaz később jó lett volna.
Ha érdekel, akkor PM.
(#) Topi hozzászólása Jún 4, 2013 /
 
Egy kis interrupt problémába ütköztem, SysTick-el. (STM32)

Van egy bootloaderem 0x08000000 címen és egy főprogramom 0x08008000 címen.
A saját bootloader olvassa az SD-t és ha talál rajta titkosított firmware.bin állományt, felfrissíti 8000 tól kezdve a főprogramot. Ha talált, ha nem a végén ugrik 8000-re.
Főprogramot csak egy pár kb-os LED ki/bekapcsoló programmá butítottam már.

1. Megnyomom a HW resetet, elindul a bootloader, teszi amit tenni kell.
2. Főprogram indulása előtt MSP (0x08008000), VTOR (0x08008000) és PC (0x08008004) állítva van.
3. Elindul a főprogram és teszi a dolgát rendesen.

A főprogram amit futtat egy startup-ban 0x08008000-ra tolt kód.
Ha ezt debuggeren keresztül indítotom (programozom és run) akkor a főprogram SysTick interruptja nem esik be. Úgy gondoltam, hogy pendig bitek miatt akkor hívódna meg mielőtt a VTOR átállításra kerül. Így néz ki ezért a főprogram eleje:
  1. __disable_irq();
  2.         SysTick->CTRL = 0;
  3.         SCB->ICSR |= SCB_ICSR_PENDSTCLR;
  4.         SystemInit();
  5.         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
  6.         __enable_irq();


Ha debugolás közben HW resetet hívok, azonnal visszaáll minden a helyére és minden működik. De debuggerből indítva nem!

ICF:
  1. define symbol __ICFEDIT_intvec_start__ = 0x08008000;
  2. define symbol __ICFEDIT_region_ROM_start__ = 0x08008000;
  3. define symbol __ICFEDIT_region_ROM_end__   = 0x0807FFFF;


MAP:
  1. "A1":  place at 0x08008000 { ro section .intvec };
  2. "P1":  place in [from 0x08008000 to 0x0807ffff] { ro };
  3. "P2":  place in [from 0x20000000 to 0x2000ffff] { rw, block CSTACK, block HEAP };
  4.  
  5.   Section            Kind        Address    Size  Object
  6.   -------            ----        -------    ----  ------
  7. "A1":                                      0x150
  8.   .intvec            ro code  0x08008000   0x150  startup_stm32f10x_cl.o [1]
  9.                             - 0x08008150   0x150
  10.  
  11. "P1":                                     0x1ff4
  12.   .text              ro code  0x08008150   0xd1e  xprintffull.o [3]
  13.  
  14. ...
  15. ...
  16. SysTick_Handler         0x08009965   0x22  Code  Gb  main.o [1]


Debug macro:
  1. execUserReset()
  2. {
  3.         VTOR = *(int*)0x08008000;
  4.         PC = *(int*)0x08008004;
  5. }


Gondolatok:
- Csak akkor működik, ha a főprogram meghívása előtt a VTOR már 8000-en van, és Systick flag-ek törölve vannak
- Ha debugból indul akkor valamiért induláskor 0x08000000-on van a VTOR (és ekkor már van aktív pending bit)
- Valamiért figyelmen kívül hagyja a debug macrómat.

Az a gyanúm, hogy a főprogram legelső sorának végrehajtása előtt már van aktív pendig bit, és a VTOR is rossz helyre mutat, ezért beragad az IRQ a bootloader területbe, hiába állítom át később a vektor tábla elejét.

Tippek, miért nem hívódik meg debug esetén a Systick?
A hozzászólás módosítva: Jún 4, 2013
(#) Topi válasza Topi hozzászólására (») Jún 4, 2013 /
 
Úgylátom debuggerből hívva ICSR regiszterében már alapból Hard Fault az aktív.

VECTACTIVE = 0x003 (HardFault)
RETTOBASE = 0
VECTPENDING = 0x000
ISRPENDING = 0
ISRPREEMPT = 0
PENDSTCLR = 0
PENDSTSET = 1
PENDSVCLR = 0
PENDSVSET = 0
Következő: »»   33 / 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