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   37 / 177
(#) Harry válasza Harry hozzászólására (») Júl 2, 2013 /
 
Sikeresen kiméregettem, és valóban a legtöbb láb lebegő állapotban van, miután Reset módban indítottam, mégis találtam egy két érdekességet.
Mivel ez egy fejlesztő panel, nem csak az IC, így normális dolog ha mérek H vagy L szintet egy bekötött lábon.
Viszont a doksi (STM32F4-Discovery) -ban a PA15 PB4 PC11 PE3 egyértelműen freeI/O -ként van feltüntetve még is 2.94V-ot mértem rajta.
Ezek közül a PE3-as alternatív funkciói között a TRACED0/FSMC_A19 található aminek nincs köze szerintem a BOOT folyamathoz (USART/SPI/I2C).
Valami anomália csak van.
Ráadásul ezen a panelen nincs kivezetve az összes láb, így elképzelhető ilyen probléma akár a H porton is, amire ezen a panelen keresztül nem tudtam rájönni.
Esetleg véleményetek elképzelésetek lenne erről?
(#) Harry válasza Harry hozzászólására (») Júl 2, 2013 /
 
Folytattam a projektet, és írtam a Discovery-re egy kis progit, amivel a PE3-as lábat alacsony szintre állítom indulás után. majd BOOT módban elindítottam és a lábat kíméletlenül felhúzta 2,94V-ra.
(#) Ven hozzászólása Júl 2, 2013 /
 
Sziasztok!

Megint én egy újabb hibával.
Eclipse->project->properties->C/C++ Build->Settings->ARM Windows GCC Assembler, majd jobb oldalon
Command:
arm-none-eabi-as
All options:
-x assembler-with-cpp -DUSE_STDPERIPH_DRIVER -DUSE_STM32F4_DISCOVERY -DSTM32F4XX (és az include-ok)

Erre azt írja ki, hogy:
c:\Program Files\GNU Tools ARM Embedded\4.7 2013q1\bin\arm-none-eabi-as.exe: unrecognized option `-x'
make: *** [src/startup_stm32f4xx.o] Error 1

És tényleg nincs benne -x kapcsoló megnéztem.
Hogy lehet megváltoztatni az All options mezőt, mivel itt csak read only-ban mutatja.
Egyéb ötlet?
(#) Ven hozzászólása Júl 3, 2013 /
 
Melyik startup és system_stm32f4xx.c filet kell használni?
Ahányat használok annyi féle hibát kapok.
(#) Ven válasza Ven hozzászólására (») Júl 3, 2013 /
 
Megkérnék valakit, akinek működő eclipses környezete van, legyen szíves exportáljon ki nekem egy akármilyen projektet a projekt beállításokkal együtt (Windows-ra). Nagyon szépen megköszönném. Szerintem nem én vagyok a béna a google alapján.
Esetleg egy másik ingyenes környezet, ahol C++-ban lehet fejleszteni és nem kell hozzá széthekkelni az egész gépet?
(#) killbill válasza Ven hozzászólására (») Júl 3, 2013 /
 
Hello! az "-x -assembler-with-cpp" opcio letezik, csak nem az as-nak, hanem a gcc-nek kell megadni.
(#) ciw válasza Ven hozzászólására (») Júl 5, 2013 /
 
Üdv!

Nekem ez a leírás bevált: http://www.sectiongo.com/main/setup-eclipse-debug-environment-for-s...board/

Nem tudom mikor kezdted az eclipse arm környezettel való foglalkozást, de nekem kb 1 hónap tömény szívás volt mire sok-sok féle leírás alapján gyakoroltam az összeállítást.
Én egy darabig a CooCox ide-t használtam ezáltal mgszoktam az eclipse környezet beállításait. És utána már könyebb volt összekalapálni.
És legvégül visszatértem a keil-hez, mert a debuggere ennek megy a legjobban (szerintem).
Remélem tudtam segíteni.

Ja: Ha mindenképp színtiszta eclipse-t akarsz(bár mintlejebb írták minden környezet az) akkor ajánlom a Chibi-Studiot. Ez a ChibiOS-hez beállított eclipse, csak felrakod és működik, benne van minden. Annyi, hogy ha nem akarod, akkor nem include-olod be a ChibiOS headereket.(bár ez csak ötlet egy próbát megér).
A hozzászólás módosítva: Júl 5, 2013
(#) ciw hozzászólása Júl 7, 2013 /
 
Üdv!

Ismét STM32F4 kérdés: az mindegy, hogy FSMC <-> RAM átvitelhez melyik DMA melyk stream-ának melyik csatornáját használom?

Pontosabban azt kikukáztam, hogy Memory to Memory copy csak a DMA2-n van.
Azt is megtaláltam, hogy ha perifériával akarok DMA-t használni, akkor az melyik stream melyik csatornáján elérhető(táblázat).
Viszont Mem-Mem copy esetén nem találtam semmi utalást. Vagy ilyen üzemmódban szabadon használható bármelyik stream/csatorna?
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Júl 7, 2013 /
 
Én az FSCM(SRAM) és az FSMC(SSD1963) közti kommunikációra a DMA2Stream0-t használtam.
SRAM: 16bit, post increment, 64000 (PacketNr) elem szuszra
SSD1963: 16bit, no increment, fogadván a 64000-elemet (de már csak a 0x2C, jöhetnek a pixeladatok ömleszve) részhez.
Én ugyan ezt a csatornát használtam tényleges Memory-Memor copy-hoz, legyen szó külső vagy belsőről, bármilyen kombinációban. Úgy tapasztaltam hogy ahol a DMA táblázatban nincs beírva konkrét periféria, az használható a célra amire te szeretnéd.

  1. //DMA configuration:
  2. //CH1(empty), mem/pher single transfer, single buffer,
  3.         RCC->AHB1ENR |= 0x00400000;          //Enable DMA2 system
  4.         DMA2_Stream0->CR = 0x02032A90;     //Configure the DMA
  5.         DMA2_Stream0->NDTR      = PacketNr;     //DMA transfer consist of 64000 transfer
  6.         DMA2_Stream0->PAR = 0x64000000;    //Source Address: SRAM in FSMC Bank0, Setror 2 (NE2)
  7.         DMA2_Stream0->M0AR      = 0x6c000002; //Destination Address:    TFT in FSMC Bank0, Sector 4 (NE4)
  8.                 NVIC->ISER[1] = (1 << 24);           //Enable DMA2Stream0 Interrupt


Aztán ennek az ISR-je:
  1. void    DMA2_Stream0_IRQHandler (void)  __irq
  2.   { DMA2->LIFCR = 0x30;               //Clear DMA2Stream0 Interrupt                                                    
  3.                 //Itt számomra fontos részek voltak, te ide azt írsz amit szeretnél.       
  4.     DMA2_Stream0->CR |= 0x01;      //Enable DMA2Stream0, next part of the TFT can be processed                 
  5.    }
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Júl 7, 2013 /
 
Megjött a nagyobb lábszámú arm, mostmár össze akartam rakni a külső sram-al a kijelzőt.
Valamiért nem megy, pedik a discovery-vel is ugyanezt a kijelzőt használtam.

Mellékeltem a kapcsolást. A kijelző az NE4-en van A23-A24 címvonallal multiplexelve RS az A15 re van kötve. Mellékeltem a kapcsolást.
Alap demó kóddal (csak FSMC semmi framebuffer semmi DMA) a kijelző gyönyörűen megy.
Ahogy bekapcsolom a framebuffer(egyelőre most még itt is belső ram)DMA combo-t a kijeélző össze vissza szivárványosodik, meg csíkozódik.
A kijelzőt a demo program így címzi:
  1. #define LCD_REG              (*((volatile unsigned short *) 0x6F000000)) /* RS = 0 */
  2. #define LCD_RAM              (*((volatile unsigned short *) 0x6F010000)) /* RS = 1 */




Ennél a módnál simán kiszámolható a cím és nem működik.

A framebuffert egyelőre piros színnel töltöttem fel, de a kijelzőt ez nem nagyon érdekli.

A discovery407-en a kijelző az NE1-en csücsült multiplex nélkül RS az A16 volt és ezen a címen ment:
  1. #define LCD_REG              (*((volatile unsigned short *) 0x6001FFFE)) /* RS = 0 */
  2. #define LCD_RAM              (*((volatile unsigned short *) 0x60020000)) /* RS = 1 */


Nem is értem mi alapján jöhetett ki ez a 0x6001FFFE cím, de működött.
Elvileg mivel 16bites adatbuszról beszélünk, így a címtartomány 25-0 bitjei belra shiftelődnek egyet.
Lényeg a lényeg, most visszaértem a kályhához. Azt hittem megértettem a címzést de a kijelző nem erről árulkodik.

Mit nézhettem el?
Hogy érted hogy:
Idézet:
„(de már csak a 0x2C, jöhetnek a pixeladatok ömleszve) részhez.”
?
A hozzászólás módosítva: Júl 7, 2013
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Júl 7, 2013 /
 
Igazából a kijelzőnek ehhez nincs köze, ezt tisztán FSMC.
Nekem A0 az RS, és:
  1. #define LCD_REG       (*((volatile unsigned short *) 0x6C000000)) // RS = 0     Command
  2. #define LCD_RAM       (*((volatile unsigned short *) 0x6C000002)) // RS = 1     Data


DMA nélkül, belső SRAM-ból próbálj egy (akár kissebb), képet kipakolni, amit IMage2LCD-vel csináltál.
Nálam 800x480 kijelzőn, 76800 byte-nyi Picture tömbből (byte-os adatok miatt), a full szoftveres kiküldés így alakul. (MSB fist az Image2LCD beállítása)
  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.  
  5. i = 0;
  6.         do      {       LCD_RAM = ((Picture[i] << 8) + (Picture[i+1]));
  7.                                 i = i +2;
  8.                         }while (i != 768000);


Amíg ez nem működik tökéletesen, addig ne állj át az FSMC-n kívül semmiféle hardveres-DMAs támogatásra.
Azt meg soha nem értettem, hogy minek ilyen magas Address lábra feltenni a kijelzőt...
A hozzászólás módosítva: Júl 7, 2013
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Júl 7, 2013 /
 
Épp ez az, hogy írtam, a normál FSMC meghajtás tökéletesen megy, bármit kirakok, kirajzolok, kiírok. A baj ott kezdődik, ha bekapcsolom a DMA-t akkor nem működik a kijelző. A framebuffer tartalmát nem látom megjelenni, (ami most csupa piros szin). A jelenség, hogy vagy teljesen fehér a kijelző, vagy pixelekből áttűnik színes csíkokba. ( ugyanez a kód működött a discovery-vel hiszena multkor ezt tárgyaltuk végig, most annyi a változás, hogy nagyobb lábszámu arm lett és a kijelző NE1 helyett NE4-re került.
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Júl 7, 2013 /
 
Kipróbáltam, működik.

így:
  1. #define LCD_REG              (*((volatile unsigned short *) 0x6F000000)) /* RS = 0 */
  2. #define LCD_RAM              (*((volatile unsigned short *) 0x6F010000)) /* RS = 1 */


  1. void TileImage(void)
  2. {
  3.         uint16_t tileX=0, tileY=0, p=0, i=0;
  4.         uint16_t tileWidth=21, tileHeight=21;
  5.        
  6.         // Kurzor 0,0 pozícióba
  7.         LCD_REG=0x004E;
  8.         LCD_RAM=0x0000;
  9.         LCD_REG=0x004F;
  10.         LCD_RAM=0x0000;
  11.        
  12.         LCD_REG=0x0022; // Parancs végrehajtás
  13.  
  14.   for(i=0;i<(MAX_X*MAX_Y);i++)
  15.                 {
  16.                         //TFTRAM[i]=bg[tileX+tileY];
  17.                         LCD_RAM=bg[tileX+tileY];
  18.                         if (tileX<(tileWidth-1)) tileX++; else tileX=0;
  19.                         if (p<319)
  20.                         {
  21.                                 p++;
  22.                         }
  23.                         else
  24.                         {
  25.                                 p=0;
  26.                                 tileX=0;
  27.                                 if (tileY<((tileHeight-1)*(tileWidth-1)))
  28.                                         tileY+=(tileWidth-1);
  29.                                 else
  30.                                         tileY=0;
  31.                         }
  32.         }
  33.  
  34. }


Egy kis képből kitöltöttem a kijelzőt. Ezért nemértem DMA miért nem jó.
Ja és én SSD1289 kijelzőzt használok abban nincs 0x2C regiszter.
A hozzászólás módosítva: Júl 7, 2013
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Júl 7, 2013 /
 
DMA már csak 0x2C-vel úgy értem hogy:

Ezt kiküldöd a kijelzőre, mintha nem is lenne DMA. Ilyenkor a DMA ki van kapcsolva, egyébként is a DMA2Stream0 beállítása legyen Single Burst.
  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;


Majd bekapcsolod a DMA-t, megadod a FrameBuffer kezdő értékét amit én onnan tudok hogy így definiáltam, a külső SRAM kezdő pontjára. Persze ha neked a kép most belül van, akkor ezt valahová belülre pozícionáld.
  1. unsigned short  TFTRAM[384000]  __attribute__((at(0x64000000)));


Ha a kijelzőn több pont van mint 65535 amit a DMA tud (francé nem lehetett oda 32bites számlálót tenni?), akkor kell neked egy számláló ami a DMA Interrupt alatt egy switch-case szerkezettel leválogatsz, hogy a kijelző mely szeletét küldöd ki éppen.
Ha pedig az utolsó részét küldted ki akkor a következő komplett képkiküldés előtt, újra ki kell adni hogy 0x2A, 0x2B, 0x2C stb...

Az már külön érdekes, hogy amikor azt kellett számolnom hogy honnan indul a TFTRAM-ból a következő 64000 pixel akkor elsőnek ezt csináltam:
1. 80 sor. kezdőcím: 0x6400 0000, és indulhat a 0xFA00 (64000) mennyiségő pixel.
2. Ebből arra következtettem hogy DMA2_Stream0->PAR = 0x6400FA00; lenne mint 640001 pixel és tovább.
3. HÁT NEM!!! A kijelőzőm 800 széles, case 0: = 0-79, case 1: 80-159, case 3: 160-239 sorokig, stb stb. 6 case alatt jut el 480-ig, teljes képig. Szóval az Nx80 sorok bázis címeit a DMA2Steram0 Source megadásakor kettővel szorozni kellett, mármint azt az értéket amit a 0x6400 000-hoz hozzá adtam.
  1. switch (PachetNr)
  2. { case 0: LCD_REG = 0x2A; LCD_RAM = 0x00; LCD_RAM = 0x00; LCD_RAM = 0x03; LCD_RAM = 0x1F;
  3.               LCD_REG = 0x2B; LCD_RAM = 0x00; LCD_RAM = 0x00; LCD_RAM = 0x01; LCD_RAM = 0xDF;
  4.               LCD_REG = 0x2C;
  5.               DMA2_Stream0->PAR = 0x64000000;  //Első 80 sor
  6.               DMA2_Stream0->NDTR = 0xFA00;      //64000 elem
  7.               PacketNr++;
  8.   case 1,2,3,4: DMA2_Stream0->PAR = 0x64000000 + PacketNr * (0xFA00 <<2);
  9.                      DMA2_Stream0->NDTR = 0xFA00;      //64000 elem
  10.                      PacketNr++;
  11.   case 5: DMA2_Stream0->PAR = 0x64000000 + PacketNr * (0xFA00 <<2);
  12.              DMA2_Stream0->NDTR = 0xFA00;      //64000 elemPacketNr = 0; //Hogy a következő körben az első sortól kezdődjön.
  13. }
  14. //És akkor most lehet indítani a DMA2Steram0-t az új bázis címmel, hogy küldje a következő 80 sort.
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Júl 7, 2013 /
 
Bocsi, mindig elfelejtem!
Használsz valami debugert?
Ha összevissza a kijelző, akkor nem jó a DMA source beállítsa. Próbáld meg amit fentebb írtam, a bázis címhez amit hosszá adsz, szorozd kettővel.
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Júl 7, 2013 /
 
Igen értem, ezt én is hasonlóan csináltam a Discovery-vel, de ott bekapcsoltam a dma-t és működött.

Most ha bekapcsolom a DMA-t, akkor megjelenik a kép, majd a kép kifehéredik szép finoman olyan fehérre, hogy már csak világít a kijelző és a képet elnyomja, mintha a gammát felhúzná. Ha nem kapcsolom be a DMA-t akkor tökéletesen működik a kijelző.

A dma:
  1. /* Configure DMA Stream */
  2.   DMA_InitStructure.DMA_Channel = DMA_CHANNEL;  
  3.   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&TFTRAM[0];
  4.   DMA_InitStructure.DMA_Memory0BaseAddr = 0x6F010000;
  5.   DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
  6.   DMA_InitStructure.DMA_BufferSize = (uint32_t)38400;
  7.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
  8.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  9.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  10.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  11.   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  12.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  13.   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;        
  14.   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  15.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  16.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  17.   DMA_Init(DMA_STREAM, &DMA_InitStructure);
  18.    
  19.   /* Enable DMA Stream Transfer Complete interrupt */
  20.   DMA_ITConfig(DMA_STREAM, DMA_IT_TC, ENABLE);
  21.  
  22.  
  23.   /* DMA Stream enable */
  24.   DMA_Cmd(DMA_STREAM, ENABLE);

Discovery-n ez működött, csak a DMA_InitStructure.DMA_Memory0BaseAddr címet írtam át a jelenlegi kezdőcímre.

A TFTRAM-nak minek adsz kezdőcímet? nem jó neki, hogy oda rakja ahová tudja? vagy azzal csak ráállítod a külső sram területre?

Van stlink2 debuggerem jtag mód, meg valami trace, csak ha az egész tftram-tömböt figyeltetem akkor lassú a debugolás.

Azért kell szorozni kettővel, mert az adatlap azt írja, ha 16bites adatvonalat használsz, akkor a címvonalak alsó 25 bitje balra tolódik és az A0 kiesik. Lásd melléklet.
A hozzászólás módosítva: Júl 7, 2013

FSMC.png
    
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Júl 7, 2013 /
 
Mekkora a kijelző?
Hány X elemű DMA ciklus fut le mire kint a kép?
Ha elsőre a kép jól megjelenik akkor a bibi ott lesz amikor az utolsó szelet után, újra elsővel akarod kezdeni a dolgot. Nézd meg hogy az utolsó szeletről az elsőre lépve, pl a szeleteket számoló nálam PacketNr újra nullázva van e, mert akkor a DMA vezérlő már túlfutva a ScreenBuffer címen a memória más szeleteit küldi.
Aztán azt is nézd meg, hogy utolsó szeletről elsőre lépve, újra megkapja a a 1289 a kép pozícióinak adatait, a kép sarkait.

Nekem volt olyan hogy:
DMA2Stream0-hoz tettem egy Breakpoint-ot. Nyomkodva a RUN-t szépen pakolta ki a 80 soros szeleteket.
Majd az utolsó után kifagyott, az egész képernyő fekete lett.
Soha nem jöttem rá mi volt a baj.
Kitöröltem az egész DMA kezelőt, a fent említett módszerrel, újra írtam és jó lett.
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Júl 7, 2013 /
 
TFTRAM-nak azért adtam címet, hogy egyfelől ott legyen ahol én akarom, a külső SRAM legelején, másfelől, a megadott kezdőcím adatot én utána felhasználtam a DMA2Steream0 SourceAddress címének a kiszámolásakor. Nem akartam egy pointert csak ezért használni.
Nem kell a TFTRAM tömböt nézni, csak a DMA2Steram0 regisztereket.
Nem szeretem CMSIS-t. Itt van neked 22 sor kód, és nem látni a mélyére hogy mi történik...
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Júl 7, 2013 /
 
A kijelzőre egyelőre csak egy 38400-as blokkot rakok ki és utána nullázomk a koordinátákat, így minden kanyarnál előlről kell kezdje a dma a kirakást.

Minden breakpointnál elvileg megcsinálja a koordináta nullázást és a tftram-ban is benne, aminek benne kell legyen.

DMA_PeripheralInc_Enable , hogy a TFTRAM tömbön végig tudjon menni, a
DMA_MemoryInc_Disable, mert ott nincs min lépkedni.

Tovább kísérletezek.

Azért kell szorozni kettővel, mert az adatlap azt írja, ha 16bites adatvonalat használsz, akkor a címvonalak alsó 25 bitje balra tolódik és az A0 kiesik. Lásd melléklet.

FSMC.png
    
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Júl 7, 2013 /
 
Ezt mondom... CMSIS...
Lehet hogy nem SingleShot-on volt a DMA-d?
Ötlet:

Futasd le a CMSIS-es DMA configod.
Utána ne csinálj semmit.
Tedd utána az én konfigom.
És nézd meg mely regiszterek hogy változtak DMA2Stream0-ba.
A hozzászólás módosítva: Júl 7, 2013
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Júl 7, 2013 /
 
Volt egy kitörölt hozzászólásod hogy az én konfigommal megy. Most akkor megy vagy nem?
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Júl 7, 2013 /
 
Nem nem az volt a baj, csak a kijelző befagyott, azért maradt rajta a kép.
A baj az volt, hogy az lcd initet a demo-bol vettem ki és a konfig végén nem volt lezárva a parancs 0x22-vel, így a dma konfigolatlan kijelzőre pakolt.

Most ott tartok, hogy a külső sram-ból a dma átteszi a tartalmat a kijelzőre, de van benne egy luk, amit kihagy. Kb a kijelző 1/4-e.
  1. void DAM_STREAM_IRQHANDLER(void)
  2. {              
  3.  
  4.  
  5.  
  6.         switch(FrameBlock)
  7.         {
  8.                 case 0:
  9.                         LCD_WriteReg(0x004e, 0 );
  10.                         LCD_WriteReg(0x004f, 0 );
  11.                         LCD_WriteIndex(0x22);          
  12.                         DMA2->LIFCR = 0x30;                                                                                     //Clear DMA2Stream0 Interrupt          
  13.                         DMA2_Stream0->PAR=      LCD_FRAMEBUFFER_BASE_ADDRESS+38400;    
  14.                         DMA2_Stream0->NDTR      = 38400;                                //DMA transfer consist of 64000 element (additional)
  15.        
  16.                         DMA2_Stream0->CR                        |= 0x01;                        //Enable DMA2Stream0, next part of the TFT can be processed    
  17.                 //DMA2_Stream0->CR      &=~1;// |= 0x01;                        //Enable DMA2Stream0, next part of the TFT can be processed            
  18.  
  19.                         FrameBlock=1;
  20.                 break;
  21.                
  22.                 case 1:
  23.                        
  24.                         DMA2->LIFCR = 0x30;                                                                                     //Clear DMA2Stream0 Interrupt          
  25.                         DMA2_Stream0->PAR=      LCD_FRAMEBUFFER_BASE_ADDRESS;  
  26.                         DMA2_Stream0->NDTR      = 38400;                                //DMA transfer consist of 64000 element (additional)
  27.        
  28.                         DMA2_Stream0->CR                        |= 0x01;                        //Enable DMA2Stream0, next part of the TFT can be processed    
  29.                 //DMA2_Stream0->CR      &=~1;// |= 0x01;                        //Enable DMA2Stream0, next part of the TFT can be processed    
  30.                         FrameBlock=0;
  31.  
  32.                 break;
  33.         }
A hozzászólás módosítva: Júl 7, 2013
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Júl 7, 2013 /
 
Én 1 hónapot szenvedtem azzal, hogy az SRAM-ot a Keil gyári "use ext sram" rutinjával használtam. A gond csak az volt hogy "fentről" nézve egyel kevesebb volt az Address láb pre-config-olva gyárilag, igy 384k helyett az kép első 256k-ja ment ki, majd újra az SRAM elejéből lett véve adat hogy a képernyő fel legyen töltve... 1 hónap, számos ősz hajszál, + mindenféle tehetségtelennek összehordtam magam.
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Júl 8, 2013 /
 
Egyébként kérdezni akartam, hogy SD-ramot is lehet rápakolni az FSMC-re? Mert a multkor láttam, hogy arról diskuráltak itt, igaz ott LPC-ről volt szó, ha jól emlékszem.
(#) icserny hozzászólása Júl 8, 2013 /
 
Sok kínlódás után Keil alatt is sikerült beüzemelni a semihosting módot Nuvoton Nuc140 és Nulink-Me esetén. Valahol azt olvastam, hogy a Cortex-M0 gyártók közül az NXP és a Nuvoton mikrovezérlői támogatják a semihosting módot.

Sajnos, sehol sincs rendesen leírva, illetve ami a "NuMicro Cortex-M0 Keil ICE driver user manual"-ban le van írva, az már rég nem úgy van.... (nincs is olyan könyvtár/file, amit aszerint másolni kellene).

Pedig alapjában véve egyszerű:
1. A startup_NUC1xx.s állomány legelején a SEMIHOSTED makró értékét át kell írni, hogy ne FALSE, hanem TRUE legyen.
  1. GBLL    SEMIHOSTED
  2. SEMIHOSTED       SETL    {TRUE}


2. A system_NUC1xx.h állomány elején ki kell venni a komment jelet az alábbi definíció elől.
  1. #define DEBUG_ENABLE_SEMIHOST


A projekt újrafordítása és a debug módban történő futtatása során a printf() függvényhívások a Nu-Link emulátoron keresztül a Keil IDE-nek küldi ki az üzeneteket, amelyek a View menü Serial Windows / UART #1 meüpontjában megnyitható ablakban fognak megjelenni, ahogy a képen is látható, a jobb alsó sarokban.
A hozzászólás módosítva: Júl 8, 2013
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Júl 8, 2013 /
 
LPC1788-nak láttam az SDRAM-ra olyan lábakat kötve, amivel az STM-nél nem találkoztam. Ebből arra következtetek, hogy STM32F2xx nem támogatja az SDRAM-ot. És mintha az FSMC leírásában sem láttam volna.
(#) fehrudi válasza cpt.zoltan.simon hozzászólására (») Júl 8, 2013 /
 
STM32F42x/43x szériánál van SDRAM támogatás is. Előbb is bele tehették volna
(#) _vl_ válasza fehrudi hozzászólására (») Júl 8, 2013 /
 
Az egyelőre nem létező termék... annyira, hogy még a részletes doksit se találni az STM weboldalán, csak egy adatlap van, mérsékelt mennyiségű információval.
(#) ciw válasza cpt.zoltan.simon hozzászólására (») Júl 9, 2013 /
 
Értem, most, hogy a kijelző hibátlanul működik a külső sram-mal, mostmár az a kérdés, hogy hagyjam -e full sebességen frissíteni a kijelzőt, vagy egy timerrel inkább időzítsem?

Gondolok itt arra, hogy ha az sram-ot másra is szeretném használni framebuffer-en kívül,(mert hely az van még benne 512kx16), akkor nem e fogja a folytonos LCD<->SRAM DMA művelet megfogni a buszt és esetleg a más sram terület elérését lassítani?
Valami külfldi fórumon olvastam, hogy állítólag a cortexMx ekben a külső sram elérés nincs cache-elve, ezért nagyságrendekkel lassabb a belső sram-nál, bár én eddig meg vagyok elégedve a sebességgel.
(#) cpt.zoltan.simon válasza ciw hozzászólására (») Júl 10, 2013 /
 
Nekem a külső SRAM -> (külső) SSD-re a sebesség 120MHz helyett túlhajtva 158MHz-ig úgy alakult hogy 42fps. Minden teljes képfrissítés után volt a DMA2Stream0 Interrupt rutinba egy bit toggle és azt néztem logikai analizátorral.
Nos ezek után döntöttem el hogy ez sok. Csináltam azt, hogy:
25 kép/s, egy kép 6 szelet => 150 szelet/s kell folyamatosba.
Csináltam 1/150s-os Timer0Interrupt-ot, és mindig az indította a DMA2Stream0-t.
Esetleg azt is meg lehet csinálni, hogy "egyenletesebb" legyen az FSMC terhelése az SRAM irányába hogy nem 6 szelet (nálam a 800x40 kijelzőre így adódott), hanem minden egyes sor egy DMA Burst.
Ez már csak fantázia kérdése, kinek hogy kényelmes.
Következő: »»   37 / 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