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   98 / 175
(#) cimopata válasza kapu48 hozzászólására (») Júl 9, 2017 /
 
Azért mert utána azokra a címekre mentem az adatot,de nem feltétlenül van lementve adat az FFFF érték pedig problémát okoz.
(#) kapu48 válasza cimopata hozzászólására (») Júl 10, 2017 /
 
Még próbáld ezt a megoldást:
  1. uint32_t Address = 0x08007C00;
  2. uint16_t Data = 0x1234;
  3.        
  4. *(__IO uint16_t*)Address = Data;
(#) kapu48 válasza cimopata hozzászólására (») Júl 10, 2017 /
 
Még próbáld ezt a megoldást:
  1. uint32_t Address = 0x08007C00;
  2. uint16_t Data = 0x1234;
  3.        
  4. *(__IO uint16_t*)Address = Data;


Itt találsz komplet megoldást rá:
EEPROM emulation in STM32F40x/
A hozzászólás módosítva: Júl 10, 2017
(#) SBahadurD válasza cimopata hozzászólására (») Júl 10, 2017 /
 
Sima C nyelvi elemekkel való trükközéssel ez nem fog menni. Vagy támogat a fordító valamilyen direktívát, amivel egyből adott címre tudsz fordíttatni változót, vagy a linker fájlban kell megmondani a linkernek.
(#) kapu48 válasza SBahadurD hozzászólására (») Júl 10, 2017 /
 
Olvasni való a témában: EEPROM emulation in STM32F40x.pdf
Bővebben: Link
(#) SBahadurD válasza kapu48 hozzászólására (») Júl 10, 2017 /
 
Én ezt értem. De ez nem arról szól, hogy fordításkor a linkert utasítsuk egy adott változó adott területen való elhelyezésére.

Egyébként a Keil fordítónál elvileg az "at" módosító kulcsszóval lehet fix területre tenni változót de akkor nem lehet neki kezdőértéket adni. (Ez érthető is, eléggé elbonyolíthatná és kódfüggő startup kódot kéne generálni hozzá.) Tudom, ez így kezdőérték nélkül nem megoldás...
(#) kapu48 válasza SBahadurD hozzászólására (») Júl 10, 2017 /
 
Azért linkeltem, hogy Cimopata olvassa el!

Ebből rájön, hogy másképpen kel ezt csinálni.
(#) csatti2 hozzászólása Júl 10, 2017 /
 
Én nem használok uVision-t, de valahogy így fog működni.

Ezt nézd át.
Majd módosítsd úgy az átmásolt linker scriptet, hogy a .data szekció elé beszúrod a kivánt fix címeket.
pl.:
  1. .image 0x08060000:
  2.         {
  3.         } > ROM
  4.  
  5.         .font 0x0806B000:
  6.         {
  7.         } > ROM
  8.  
  9.         .patch 0x08074000:
  10.         {
  11.         } > ROM
  12.  
  13.         .str 0x0807B000:
  14.         {
  15.         } > ROM

Ezután a kódodhoz add hozzá pl. ezeket:
  1. #define FONT                              __attribute__((section(".font")))
  2. #define IMAGE                             __attribute__((section(".image")))
  3. #define PATCH                             __attribute__((section(".patch")))

Majd a változókat így deklaráld pl.:
  1. static const unsigned char seriffont[] FONT = {
  2.   0x00, 0x20, 0xFF, 0x08, 0x10, // Data mode, min char, max char, width, height
  3.   0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char
  4.   0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char !
  5. .
  6. .
  7. .
(#) kapu48 válasza csatti2 hozzászólására (») Júl 10, 2017 /
 
Sajnos ilyenkor derül ki, hogy milyen keveset tudok!

Az Keil-be nem tudom hova rakjam a linker részt?

Ezt találtam, amit ír linkernek:
STM324xG_EVAL.sct
  1. ; *************************************************************
  2. ; *** Scatter-Loading Description File generated by uVision ***
  3. ; *************************************************************
  4.  
  5. LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  6.   ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
  7.    *.o (RESET, +First)
  8.    *(InRoot$$Sections)
  9.    .ANY (+RO)
  10.    }
  11.                                  
  12.   RW_IRAM1 0x20000000 0x00020000  {  ; RW data
  13.    .ANY (+RW +ZI)
  14.   }
  15. }

Ez van benne. De ide nem fogadja el a fenti sorokat.
Ezt nem ismeri fel: > ROM
(#) csatti2 válasza kapu48 hozzászólására (») Júl 10, 2017 /
 
Mert ez egy scatter file és nem egy linker script. Mint mondtam én nem használok uVision-t, de ha jól értettem, amit olvastam a GNU-ARM fordítója linker scriptet használ, az MDK-ARM pedig scatter file-t. Keress példát a scatter file-ra.
(#) kapu48 válasza csatti2 hozzászólására (») Júl 11, 2017 /
 
Próbálkoztam, kerestem útmutatást.

GNU ARM Linker

De csak RAM foglalásra találtam megoldást, a fix ROM terület foglalásba mindenkinek beletört a bicskája.
CODE Linker Directive
Az a baj, hogy mintát nem találok, ezt meg nem igazán értem!

Configuring Linker Options
Itt próbálkoztam. Felosztottam a FLASHT, a végéből levágtam 2*64KBytet.
Ez lett az IROM2. Így automatikusan generálta a linkert:
  1. ; *************************************************************
  2. ; *** Scatter-Loading Description File generated by uVision ***
  3. ; *************************************************************
  4.  
  5. LR_IROM1 0x08000000 0x000F8000  {    ; load region size_region
  6.   ER_IROM1 0x08000000 0x000F8000  {  ; load address = execution address
  7.    *.o (RESET, +First)
  8.    *(InRoot$$Sections)
  9.    .ANY (+RO)
  10.   }
  11.   RW_IRAM1 0x20000000 0x00020000  {  ; RW data
  12.    .ANY (+RW +ZI)
  13.   }
  14. }
  15.  
  16. LR_IROM2 0x080F8000 0x00008000  {
  17.   ER_IROM2 0x080F8000 0x00008000  {  ; load address = execution address
  18.    .ANY (+RO)
  19.   }
  20. }


Most kellene ötlet, hogyan használjam ezt a ER_IROM2 területet?

Köszi minden segítséget!
(#) kapu48 válasza kapu48 hozzászólására (») Júl 11, 2017 /
 
Próbálkoztam fix cím megadásával:
  1. ; *************************************************************
  2. ; *** Scatter-Loading Description File generated by uVision ***
  3. ; *************************************************************
  4.  
  5. LR_IROM1 0x08000000 0x000F8000  {    ; load region size_region
  6.   ER_IROM1 0x08000000 0x000F8000  {  ; load address = execution address
  7.    *.o (RESET, +First)
  8.    *(InRoot$$Sections)
  9.    .ANY (+RO)
  10.   }
  11.   RW_IRAM1 0x20000000 0x00020000  {  ; RW data
  12.    .ANY (+RW +ZI)
  13.   }
  14. }
  15.  
  16. LR_IROM2 0x080F8000 0x00008000  {
  17.   ER_IROM2 0x080F8000 0x00008000  {  ; load address = execution address
  18.   *.data    (0x080F8000)
  19.  
  20.    .ANY (+RO)
  21.   }
  22. }

De valamit hiányol még!:
Idézet:
„*** Using Compiler 'V5.06 update 3 (build 300)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Discover-More'
linking...
.\Discover-More\Project.sct(18): warning: L6314W: No section matches pattern *.data(0x080F8000).
Program Size: Code=51964 RO-data=14432 RW-data=2924 ZI-data=37532
Finished: 0 information, 1 warning and 0 error messages.
FromELF: creating hex file...
".\Discover-More\Project.axf" - 0 Error(s), 1 Warning(s).
Build Time Elapsed: 00:00:02


???
(#) cimopata válasza kapu48 hozzászólására (») Júl 11, 2017 /
 
Egyenlőre ezzel a megoldással feladom én is használom azt amit írtam az elején aztán ha ha élet úgy hozza kísérletezem ezzel is. Köszönöm azért a segítséget.
(#) kapu48 válasza cimopata hozzászólására (») Júl 11, 2017 /
 
Én is megvoltam eddig nélküle. Csak a kíváncsiságból próbálkoztam megoldani.
(#) SBahadurD válasza cimopata hozzászólására (») Júl 12, 2017 /
 
Tudom, hogy ez nem Keil fordító, hanem GCC, de nekem működött.
Bővebben: Link

Kipróbáltam és a Flash végébe szépen beletettem egy konkrét értéket egy konkrét címre. Arra figyelni kell, hogy más szekcióba ne lógjon bele, különben hibát fog dobni a program (ami teljesen érthető és jogos felháborodás részéről ).
(#) kapu48 válasza SBahadurD hozzászólására (») Júl 12, 2017 /
 
Ez RAM-ban foglal területet. Ez működik nekünk is.

Mi viszont a ROM-ban akartunk fix címre rakni adatokat.
Mert akkor szektor határra tudnánk igazítani, hogy később manipulálni tudjuk.
(#) kapu48 válasza SBahadurD hozzászólására (») Júl 12, 2017 /
 
Ez is hasonlóan nézki:
Bővebben: Link

Csak nem tudom lefordítani, mert mindig hibát jelez.
(#) SBahadurD válasza kapu48 hozzászólására (») Júl 12, 2017 /
 
Igen, bocsi. Ez alapján indultam el, de a címet és a memóriablokkot átírtam úgy benne, hogy a Flash-be foglaljon területet. A generált bináris fájlban a várt helyen ott is volt az érték.
(#) kapu48 válasza kapu48 hozzászólására (») Júl 12, 2017 /
 
Aludtam a problémára egyet.

És felhagytam a linker babrálásával!
Csináltam egyszerűen ezt: (STM32F407VGT)
  1. static __I unsigned int variable2[] __attribute__((section(".ARM.__at_0x08078000"))) = {0x11111111, 0x22222222, 0x33333333, 0x44444444, 0x55555555, 0x66666666, 0x77777777, 0x88888888, 0x99999999, 0x00000000};


És feltöltés után lás csodát, a megadot címen helyén voltak az értékeim.
A hozzászólás módosítva: Júl 12, 2017
(#) cimopata hozzászólása Júl 23, 2017 /
 
üdv.

Az új 1.8 as F030 as driver-ben eléggé megválzotztak a dolgok és csomószor nem tudom értelmezni mi hogy van amit még korábban az 1.4 es driverrel egyértelmű volt számomra.

Bemásolnék 1 példát a TIMER3 egyik regisztere ami beállítja milyen polarítással billenjen a bemeneti impulzusnál.

1.4 driver:
  1. #define  TIM_CCER_CC1E                       ((uint32_t)0x00000001)            /*!<Capture/Compare 1 output enable */
  2. #define  TIM_CCER_CC1P                       ((uint32_t)0x00000002)            /*!<Capture/Compare 1 output Polarity */
  3. #define  TIM_CCER_CC1NE                      ((uint32_t)0x00000004)            /*!<Capture/Compare 1 Complementary output enable */
  4. #define  TIM_CCER_CC1NP                      ((uint32_t)0x00000008)            /*!<Capture/Compare 1 Complementary output Polarity */
  5. #define  TIM_CCER_CC2E                       ((uint32_t)0x00000010)            /*!<Capture/Compare 2 output enable */
  6. #define  TIM_CCER_CC2P                       ((uint32_t)0x00000020)            /*!<Capture/Compare 2 output Polarity */
  7. #define  TIM_CCER_CC2NE                      ((uint32_t)0x00000040)            /*!<Capture/Compare 2 Complementary output enable */
  8. #define  TIM_CCER_CC2NP                      ((uint32_t)0x00000080)            /*!<Capture/Compare 2 Complementary output Polarity */
  9. #define  TIM_CCER_CC3E                       ((uint32_t)0x00000100)            /*!<Capture/Compare 3 output enable */
  10. #define  TIM_CCER_CC3P                       ((uint32_t)0x00000200)            /*!<Capture/Compare 3 output Polarity */
  11. #define  TIM_CCER_CC3NE                      ((uint32_t)0x00000400)            /*!<Capture/Compare 3 Complementary output enable */
  12. #define  TIM_CCER_CC3NP                      ((uint32_t)0x00000800)            /*!<Capture/Compare 3 Complementary output Polarity */
  13. #define  TIM_CCER_CC4E                       ((uint32_t)0x00001000)            /*!<Capture/Compare 4 output enable */
  14. #define  TIM_CCER_CC4P                       ((uint32_t)0x00002000)            /*!<Capture/Compare 4 output Polarity */
  15. #define  TIM_CCER_CC4NP                      ((uint32_t)0x00008000)            /*!<Capture/Compare 4 Complementary output Polarity */


Ez egyértelmű nincs mit hozzáfűzni csak megszámolom hogy melyik bitre esik az adott hexa de itt van az új 1.8-as driver aminél teljesen másképp van:

  1. #define TIM_CCER_CC1E_Pos         (0U)                                        
  2. #define TIM_CCER_CC1E_Msk         (0x1U << TIM_CCER_CC1E_Pos)                  /*!< 0x00000001 */
  3. #define TIM_CCER_CC1E             TIM_CCER_CC1E_Msk                            /*!<Capture/Compare 1 output enable */
  4. #define TIM_CCER_CC1P_Pos         (1U)                                        
  5. #define TIM_CCER_CC1P_Msk         (0x1U << TIM_CCER_CC1P_Pos)                  /*!< 0x00000002 */
  6. #define TIM_CCER_CC1P             TIM_CCER_CC1P_Msk                            /*!<Capture/Compare 1 output Polarity */
  7. #define TIM_CCER_CC1NE_Pos        (2U)                                        
  8. #define TIM_CCER_CC1NE_Msk        (0x1U << TIM_CCER_CC1NE_Pos)                 /*!< 0x00000004 */
  9. #define TIM_CCER_CC1NE            TIM_CCER_CC1NE_Msk                           /*!<Capture/Compare 1 Complementary output enable */
  10. #define TIM_CCER_CC1NP_Pos        (3U)                                        
  11. #define TIM_CCER_CC1NP_Msk        (0x1U << TIM_CCER_CC1NP_Pos)                 /*!< 0x00000008 */
  12. #define TIM_CCER_CC1NP            TIM_CCER_CC1NP_Msk                           /*!<Capture/Compare 1 Complementary output Polarity */
  13. #define TIM_CCER_CC2E_Pos         (4U)                                        
  14. #define TIM_CCER_CC2E_Msk         (0x1U << TIM_CCER_CC2E_Pos)                  /*!< 0x00000010 */
  15. #define TIM_CCER_CC2E             TIM_CCER_CC2E_Msk                            /*!<Capture/Compare 2 output enable */
  16. #define TIM_CCER_CC2P_Pos         (5U)                                        
  17. #define TIM_CCER_CC2P_Msk         (0x1U << TIM_CCER_CC2P_Pos)                  /*!< 0x00000020 */
  18. #define TIM_CCER_CC2P             TIM_CCER_CC2P_Msk                            /*!<Capture/Compare 2 output Polarity */
  19. #define TIM_CCER_CC2NE_Pos        (6U)                                        
  20. #define TIM_CCER_CC2NE_Msk        (0x1U << TIM_CCER_CC2NE_Pos)                 /*!< 0x00000040 */
  21. #define TIM_CCER_CC2NE            TIM_CCER_CC2NE_Msk                           /*!<Capture/Compare 2 Complementary output enable */
  22. #define TIM_CCER_CC2NP_Pos        (7U)                                        
  23. #define TIM_CCER_CC2NP_Msk        (0x1U << TIM_CCER_CC2NP_Pos)                 /*!< 0x00000080 */
  24. #define TIM_CCER_CC2NP            TIM_CCER_CC2NP_Msk                           /*!<Capture/Compare 2 Complementary output Polarity */
  25. #define TIM_CCER_CC3E_Pos         (8U)                                        
  26. #define TIM_CCER_CC3E_Msk         (0x1U << TIM_CCER_CC3E_Pos)                  /*!< 0x00000100 */
  27. #define TIM_CCER_CC3E             TIM_CCER_CC3E_Msk                            /*!<Capture/Compare 3 output enable */
  28. #define TIM_CCER_CC3P_Pos         (9U)                                        
  29. #define TIM_CCER_CC3P_Msk         (0x1U << TIM_CCER_CC3P_Pos)                  /*!< 0x00000200 */
  30. #define TIM_CCER_CC3P             TIM_CCER_CC3P_Msk                            /*!<Capture/Compare 3 output Polarity */
  31. #define TIM_CCER_CC3NE_Pos        (10U)                                        
  32. #define TIM_CCER_CC3NE_Msk        (0x1U << TIM_CCER_CC3NE_Pos)                 /*!< 0x00000400 */
  33. #define TIM_CCER_CC3NE            TIM_CCER_CC3NE_Msk                           /*!<Capture/Compare 3 Complementary output enable */
  34. #define TIM_CCER_CC3NP_Pos        (11U)                                        
  35. #define TIM_CCER_CC3NP_Msk        (0x1U << TIM_CCER_CC3NP_Pos)                 /*!< 0x00000800 */
  36. #define TIM_CCER_CC3NP            TIM_CCER_CC3NP_Msk                           /*!<Capture/Compare 3 Complementary output Polarity */
  37. #define TIM_CCER_CC4E_Pos         (12U)                                        
  38. #define TIM_CCER_CC4E_Msk         (0x1U << TIM_CCER_CC4E_Pos)                  /*!< 0x00001000 */
  39. #define TIM_CCER_CC4E             TIM_CCER_CC4E_Msk                            /*!<Capture/Compare 4 output enable */
  40. #define TIM_CCER_CC4P_Pos         (13U)                                        
  41. #define TIM_CCER_CC4P_Msk         (0x1U << TIM_CCER_CC4P_Pos)                  /*!< 0x00002000 */
  42. #define TIM_CCER_CC4P             TIM_CCER_CC4P_Msk                            /*!<Capture/Compare 4 output Polarity */
  43. #define TIM_CCER_CC4NP_Pos        (15U)                                        
  44. #define TIM_CCER_CC4NP_Msk        (0x1U << TIM_CCER_CC4NP_Pos)                 /*!< 0x00008000 */
  45. #define TIM_CCER_CC4NP            TIM_CCER_CC4NP_Msk                           /*!<Capture/Compare 4 Complementary output Polarity */


Esetemben ezt a 3-at használom de nem vagyok biztos hogy a régi és az új driverrel ugyan azt álítja e be. TIM3->CCER |= TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC1P;

Mik ezek az (1U) (0x1U) stb a kódban hogy kell ezt értelmezni?
A hozzászólás módosítva: Júl 23, 2017
(#) csatti2 válasza cimopata hozzászólására (») Júl 23, 2017 /
 
Természetesen ugyanazt állítja be. Nem hülyék, hogy elrontsák a visszafelé kompatibilitást, ha nem muszáj.
Az új Pos és Msk pedig hasznos lehet olvashatóbb kód írásakor (hasonlóan néz ki az Atmelnél is az ATXMega család kódja).
(#) cimopata válasza csatti2 hozzászólására (») Júl 23, 2017 /
 
Értem és hogyan értelmezzem ezeket az 1U 0x1U dolgokat?
(#) csatti2 válasza cimopata hozzászólására (») Júl 23, 2017 /
 
Az U-val tipizálja a konstanst unsigned int-ként, így egyértelmű lesz a műveletek végeredménye.
(#) rolandgw hozzászólása Aug 5, 2017 /
 
Üdv!
Egy rövid leírást kérhetnék valakitől a DMA ping-pong mód működéséről? Nem regiszter szinten, csak a lényegét illetően. Utána olvastam, de kifog rajtam, a manual pedig pár mondatos ez ügyben.(LPC)
(#) csabeszq válasza david10 hozzászólására (») Aug 8, 2017 /
 
Kezdőként én is mindenáron bootloader-t akartam az ARM-ra rakni, azóta nem akarok.

Van 4 tüsid, arra simán rákötheted az OpenOCD-t és tudsz vele debuggolni is. Még a legegyszerűbb kínai utángyártott klón is tudja 700 HUF-ért. Igen, két USB kábel fog lógni a cuccról egy helyett (táp és programozó), de inkább két kábel lógjon, mint hogy Serial.println-nel szórakozzak 256KB-os kódban.

Elvileg az AVR-t is lehet debuggolni, de messze nem annyira pofon egyszerű és magától értetődő, mint ARM-on.

Egy eset lehet, ha mondjuk Wifi-n akarod az ARM chipjeidet webszerverrel felprogramozni, de igazából ehhez sem kell bootloader, mert a megfelelő pinek állításával UART segítségével a legtöbb ARM programozható bootloader nélkül is.

A bootloader AVR alatt megkerülhetetlen, de ST alatt simán megvagy nélküle is. Legalábbis szerintem.
A hozzászólás módosítva: Aug 8, 2017
(#) csatti2 válasza csabeszq hozzászólására (») Aug 8, 2017 /
 
Nincs mindenben igazad. Én pl. arra használom a bootloadert a fejlesztői kártyáimon, hogy átirányíthassam a programom kezdő címét és így kíméljem a flasht.
A debuggolás pont ugyanolyan jól megoldható AVR-nél is mint az ARM-oknál, csak normális programozóra van szükség, nem ilyen USBASP féle borzalmakra. Rendes programozóval látszanak a regiszter állapotok, a live értéke a változóknak stb., pont úgy mint mondjuk egy STMicro-nál, lásd képen. Annyi nehezítés valóban van, hogy nem ugyanoda tették minden chipnél a debug-ot, illetve nincs mindig debugWire (ATMega esetén, ATXmega-nál már más van, az jobb).
(#) csatti2 hozzászólása Aug 8, 2017 /
 
Ugyanez ARM-nál.
(#) david10 válasza csabeszq hozzászólására (») Aug 9, 2017 /
 
Csatti2 ajánlotta az STM32F103-at, ehhez fogok venni egy fejlesztői panelt és kiprobálom, hogy mit tud.
Majd a kész projektre, (ami kb. 1 éve készül, de még a tervek sincsenek meg), egy USB3-as dugaszt terveztem tenni, a sima USB felébe (ahova talál a sima microUSB is) bekötném az USB lábait(+5V, D+,D-, GND, így megoldódna a töltés+a memókártyáról a fájlok átmásolása gépre), míg a másik felébe tennék két UART-ot (RX1, TX1, RST, RX2, TX2), az egyik UART-ra rákötném a külső wifi/ 433mhz/ RFID modult míg a másikkal használnám az UART bootlodert.
Vagy tegyek még egy dugaszt a debuggolásra és ne legyen bootloader?
(#) Moderátor hozzászólása csatti2 hozzászólására (») Aug 9, 2017
 
Kérésre az AVR topikból áthelyeztük ide azt a pár OFF hozzászólást.
(#) csatti2 válasza david10 hozzászólására (») Aug 9, 2017 /
 
Ha majd megnézed az STM32-es fejlesztői kártyádat, észre fogod venni hogy van rajta két állítható kapcsoló vagy jumper BOOT0 és BOOT1 néven. Az eszköz ugyanis gyárilag tartalmaz egy kitörölhetetlen bootloader-t, amely a használt mikrokontrollertől függően lehetővé teszi a firmware update-t USART-on, USB-n illetve CAN buszon keresztül és neked ehhez nem kell külön szoftvert írnod.
Éppen ezért használhatod az USART1-et mind debug üzenetek írására (vagy fogadására), mind pedig a BOOT lábak beállításával bootloaderes firmware frissítésre.
Következő: »»   98 / 175
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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