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   147 / 175
(#) cross51 válasza gtk hozzászólására (») Dec 13, 2019 /
 
Én most bele néztem a hal forráskódjába elvileg nem kell írnod semmi custom function-t mert a hal_spi tudja magától a 16 bitet, ha úgy initeled.
Annyit kell tenned, hogy az uint16_t* ptr-et átcastolod uint8_t* ra és HAL_SPI_Transmit size paraméterének a sizeof(uint16Tomb)/sizeof(uint16Tomb[0]) értéket adod meg.
(és persze arra figyelned kell, ha uint8_t* tömböt akarsz átvinni 16 bit-el akkor ennek a tömbnek 2 byte-os align-al kell lennie)

Amúgy én olyan aprócska eltérést találtam a HAL-hoz képest, hogy ott a TXDR-helyett DR-t használnak (de gondolom nem ez a ludas), és nem cast-olják a register-t 16 bites pointer-re hanem 32 bitesként írják, talán ez okozhatja a galibát.
(#) artur60 hozzászólása Feb 5, 2020 /
 
Sziasztok!

Nucleo L031K6-on próbálok am vevőről jeleket feldolgozni timer2 ch1-en.
Tesztnek gondoltam, hogy az egyik lábon csinálok 400us-os négyszög jeleket.
A timer2 ch1-en mérem időt Inputcatpure módban.
Megszakításban mőködik is rendesen, de ha DMA-val szeretném megoldani, akkor nem generálódik megszakítás élváltásra.
A kódot CubeMX-el generáltam.

timer2 init:
  1. TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  2.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  3.   TIM_IC_InitTypeDef sConfigIC = {0};
  4.  
  5.   htim2.Instance = TIM2;
  6.   htim2.Init.Prescaler = 0;
  7.   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  8.   htim2.Init.Period = 0xFFFF;
  9.   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  10.   htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  11.   if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  12.   {
  13.     Error_Handler();
  14.   }
  15.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  16.   if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  17.   {
  18.     Error_Handler();
  19.   }
  20.   if (HAL_TIM_IC_Init(&htim2) != HAL_OK)
  21.   {
  22.     Error_Handler();
  23.   }
  24.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  25.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  26.   if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  27.   {
  28.     Error_Handler();
  29.   }
  30.   sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_BOTHEDGE;
  31.   sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  32.   sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  33.   sConfigIC.ICFilter = 0;
  34.   if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
  35.   {
  36.     Error_Handler();
  37.   }

timer2 gpio és dma init
  1. /**TIM2 GPIO Configuration    
  2.     PA0-CK_IN     ------> TIM2_CH1
  3.     */
  4.     GPIO_InitStruct.Pin = RADIORX_Pin;
  5.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  6.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  7.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  8.     GPIO_InitStruct.Alternate = GPIO_AF2_TIM2;
  9.     HAL_GPIO_Init(RADIORX_GPIO_Port, &GPIO_InitStruct);
  10.  
  11.     /* TIM2 DMA Init */
  12.     /* TIM2_CH1 Init */
  13.     hdma_tim2_ch1.Instance = DMA1_Channel5;
  14.     hdma_tim2_ch1.Init.Request = DMA_REQUEST_8;
  15.     hdma_tim2_ch1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  16.     hdma_tim2_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
  17.     hdma_tim2_ch1.Init.MemInc = DMA_MINC_ENABLE;
  18.     hdma_tim2_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  19.     hdma_tim2_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  20.     hdma_tim2_ch1.Init.Mode = DMA_CIRCULAR;
  21.     hdma_tim2_ch1.Init.Priority = DMA_PRIORITY_LOW;
  22.     if (HAL_DMA_Init(&hdma_tim2_ch1) != HAL_OK)
  23.     {
  24.       Error_Handler();
  25.     }


main-ben dma start:
  1. if(HAL_TIM_IC_Start_DMA(&htim2, TIM_CHANNEL_1, (uint32_t*) captures, 2) != HAL_OK)
  2. {
  3.         Error_Handler();
  4. }


Van valakinek ötlete mi lehet a hiba?
(#) kapu48 válasza artur60 hozzászólására (») Márc 7, 2020 /
 
A látott kódból ötlet nincsen.
De ha a CubeMX-el generált *.ioc kódot ide tennéd, hátha tudnánk ötletelni.
(#) kapu48 hozzászólása Márc 7, 2020 /
 
Sziasztok!

Nekem is kellene kevés segítség!
Az idézet kódrészlet végén, hogyan kapom meg helyesen az SD kártya méretét?
  1. void Get_SD_Card_Info(void)
  2. {
  3.         HAL_SD_CardInfoTypeDef cardInfo;
  4.        
  5.         printf("\nGet SD Card Info:\n");
  6.         uint8_t err = BSP_SD_Init();
  7.     BSP_SD_GetCardInfo(&cardInfo);
  8.  
  9.         printf("cardType        = %u\n", (unsigned int)cardInfo.CardType);
  10.         printf("cardVersion     = %u\n", (unsigned int)cardInfo.CardVersion);
  11.         printf("infoClass       = %u\n", (unsigned int)cardInfo.Class);
  12.         printf("relCardAdd      = %u\n", (unsigned int)cardInfo.RelCardAdd);
  13.         printf("blockNbr        = %u\n", (unsigned int)cardInfo.BlockNbr);
  14.         printf("blockSize       = %u\n", (unsigned int)cardInfo.BlockSize);
  15.         printf("logBlockNbr     = %u\n", (unsigned int)cardInfo.LogBlockNbr);
  16.         printf("logBlockSize = %u\n", (unsigned int)cardInfo.LogBlockSize);
  17.         printf("cardSize        = %u Byte, %u Kbyte\n\n", cardInfo.LogBlockSize * cardInfo.LogBlockNbr, (unsigned int)(cardInfo.LogBlockSize * cardInfo.LogBlockNbr) / 1023);
  18.  
  19. }
(#) benjami válasza kapu48 hozzászólására (») Márc 9, 2020 / 1
 
Hasonlítsd össze valami PC-s program által megmutatott értékkel melyik van összhangban (pl. a WinHex / open disk / phisical storage devices - t megnyitva bájtban kiírja a fizikai kapacitást). Arra is figyelj, hogy ha nagyobb a kártyád 4GB--nál ki fogsz futni a 32 bites értékből. A kByte kiíráshoz miért 1023-al osztottál?
(#) kapu48 válasza benjami hozzászólására (») Márc 13, 2020 /
 
Szia!
Köszi, a választ!
Idézet:
„A kByte kiíráshoz miért 1023-al osztottál?”

Mert nem tudtam eldönteni mi a jó osztó?
1024, vagy 1024-1? Ez volt tulajdonképen a kérdés.

A Total Commander-el próbáltam hasonlítani, de nagyon vad számok jöttek ki.
A hozzászólás módosítva: Márc 13, 2020
(#) benjami válasza kapu48 hozzászólására (») Márc 15, 2020 /
 
A tc nem a fizikai méretet mondja, hanem a rajta levő partíció területén levő felhasználói adattal megtölthető területet. Még arra is lenne lehetőség, hogy több partícióra osszuk az SD kártyát, bár ezt ritkán szokták alkalmazni. Ott akkor mit írton a tc? Azért mondtam a winhex-et, mert az képes fizikai eszközként megnyitni a kártyát, ott meg csak szektorok vannak 0-tól n-ig.
Mivel a váltószám 1024 a bájt és a kilobájt között, annyival kellene osztani (a fordító jó esetben ezt 10 bitnyi shiftelésnek fogja fordítani).
(#) cross51 hozzászólása Márc 31, 2020 /
 
Sziasztok!

Egy kis segítséget szeretnék kérni olyantól aki használ CubeMx-et és altiumot, mert írtam egy software-t ami a Cube adatbázisából tud altium-hoz symbol-t generálni.
Valaki ki próbálná, hogy működik-e nála?
Csatolok egy egyszerű doksit is mi merre van benne. (Magától keresi a Cube-ot a software)

Az altium-os oldal nincs annyira leírva doksiban a program-ban controller kiválaszt->Run Generator->Copy To Clipboard altium-on belül panels->SCH Lib List->Az SCH Lib List-en belül bal felül View-t át kell állítani edit-re->Jobb klikk Smart Grid Insert->A felugró ablakban Automatically Determinate Paste->Ok és a symbol megjelenik.

A kód nyílt forrású lesz meg osztom majd azt is csak először szeretnék egy tesztet, hogy ne kerüljön fel hülyeség.

Bármi észrevételt szívesen veszek a dologgal kapcsolatban.
Köszi a segítséget!
(#) Lucifer válasza cross51 hozzászólására (») Ápr 3, 2020 / 1
 
Hehe, látom más is rá van feszülve a szkriptelgetésre

Én EAGLE-hez csináltam meg, hogy a netneveket át tudjam venni rögtön a CubeMX-es projektekből:
https://raw.githubusercontent.com/martonmiklos/ulps_for_eagle/maste...LE.gif
(#) Peppe válasza Lucifer hozzászólására (») Ápr 3, 2020 /
 
Ilyet Altiumhoz nem lehet csinálni? CubeMX-ből hogy nyered ki a dolgokat?
(#) Lucifer válasza Peppe hozzászólására (») Ápr 3, 2020 / 1
 
A CubeMX projekt egy sima mezei Ini fájl.
Az EAGLE-hez írt szkript forrása itt található, bár elég egyértelmű a fájl formátuma:
https://github.com/martonmiklos/ulps_for_eagle/blob/master/CubeMX2EAGLE.ulp
(#) Rockmenyét hozzászólása Ápr 7, 2020 /
 
Sziasztok!

Tanácsra lenne szükségem STM32 IDE terén!
Kb. másfél éve kezdtem STM32F4 mikrovezérlőkkel foglalkozni jó 15 éves PC-s C/C++ háttérrel.
Elsősorban STM32F429 mcu-val kísérletezem mérésadatgyűjtés/DSP területen.
NUCLEO-F429ZI/439ZI és STM32F429I-DISCOVERY kártyákat használok.
A kártyák debuggerét át flasheltem J-Link-re, illetve van egy J-Link EDU debuggerem is.

IDE terén az Atollic TrueStudio vált be legjobban, viszont manapság már több bajom is van vele:
- a vele adott toolchain kicsit öregecske (ezt mondjuk tudtam orvosolni némi hegesztéssel)
- a projekt elvileg halott, nem fejlesztik tovább
- és hát java alapú, ráadásul Eclipse, amit ki nem állhatok (tudom, egyéni szoc. probléma )

Amit viszont szeretek benne: a debuggere szerintem nagyon jó! Főleg az SWV/ITM funkciók hasznosak számomra: valós időben tudom monitorozni a megszakításokat, a változók (F4 esetén max. 4) értékét; ezeket grafikonon ábrázolni stb. Ehhez a DWT-t használja (data and watchpoint trace unit) ami sokkal hatékonyabb mint más IDE-k esetén a ciklikus lekérdezés.
Kihasználja a Cortex-M4 4db hardware data breakpointját, és automatikusan küldi ki SWO-n az adott memóriaterület értékét előre beállított feltételek esetén. Ez nekem kezdőként nagyon sokat segít, gyakorlatilag látom hogy mi történik a mikrovezérlőben.

Elvileg az ST megvette az Atollic-ot és STM32CubeIDE néven fejlesztik tovább. Jelenleg a legfrissebb verzió az 1.3.0, de sajnos az elődjéhez képest eléggé instabil. Pont az SWV funkciók egy része az ami használhatatlan vagy bugos.

Kipróbáltam a Segger Embedded Studiot, az Ozone debuggert (még a SystemView-t is!), de sajnos nem tudják a fent említett funkciókat; csak a lassú ciklikus memória kiolvasást.

Az IAR és a KEIL tudja, csakhát... kissé drága ugye hobbiprojektekhez, és nem igazán szeretnék kalózkodni...

Raktam össze saját eszközkészletet is: VSCode + Cortex Debug, GNU ARM Toolchain, CMAKE + Ninja build. Teljesen jól működik, de a debugger így nagyon fapados.

Szóval, Ti mit tudnátok ajánlani?
Kinek mi vált be a legjobban?
A hozzászólás módosítva: Ápr 7, 2020
(#) jefflynn válasza Rockmenyét hozzászólására (») Ápr 7, 2020 /
 
Keil. Bármi mást próbáltam, csak a szívás volt vele. Szerencsére amihez használom, ahhoz ingyenes.
(#) cross51 válasza Rockmenyét hozzászólására (») Ápr 8, 2020 / 1
 
Én a Visual Studio mellet tettem le a voksot, kell hozzá egy extension (VisualGDB) fizetős, de nem embertelen ára van, ha érdekel és hobbira kell írj pm-et.
Szerintem software/hardware oldalról is a legjobb, a software nem bugos állandóan (ugye Java?) rengeteg debug feature és csomó software-s apróság ami tök kényelmes.
Ezeket nem írogatnám itt megtalálsz mindent.

Sok egyebet kipróbáltam már, ha KEIL alatt az µVision-t érted őt is próbáltam 2020-ban szerintem nincs helye, a többi Java-s IDE nagyon jó volt addig amíg a kis hello world szintű projektet mentek.

Szerintem vicc ami kontroller szinten megy fejlesztőkörnyezet gyanánt, egyetemen µC gyakszin volt egy srác aki Atmel-el kezdte most falnak megy az MPLAB-tól sokkal használhatatlanabb mint az Atmel Studio (az is VS alapú).
(#) vargham válasza cross51 hozzászólására (») Ápr 8, 2020 /
 
Visual Studio Community Edition + VisualGDB (100 dollár évente)
+1
(#) Peppe válasza Rockmenyét hozzászólására (») Ápr 8, 2020 /
 
CubeIDE az új Atollic Studio.
(#) cross51 válasza vargham hozzászólására (») Ápr 8, 2020 /
 
Ha egyszer megveszed onnan örök licence-t kapsz tudod bármeddig használni.
Ha frissíteni akarod akkor kell az új licence-t kifizetni, de ha 12 hónapon belül frissítesz féláron van.

Persze lehet a 100 dollár is sok, de érdemes kipróbálni szerintem, mert én ezért hagytam ott a Microchip-es világot egy jól használható fejlesztő környezet sokkal fontosabb (nekem) mint az, hogy éppen mi a vas, adott absztrakció fölött úgy is "ugyanaz" mindegyik.
(#) vargham válasza cross51 hozzászólására (») Ápr 8, 2020 /
 
Évek óta használjuk. Azért írtam, hogy +1
(#) Rockmenyét válasza vargham hozzászólására (») Ápr 8, 2020 /
 
Köszi a tippeket!

A Visual Studio Community-t évekig használtam ha Win alá kellett írnom valamit. A VisualGDB-vel is szemeztem de még nem volt lelkierőm kipróbálni.

Egyébként a Segger Embedded Studio jelenleg a legszimpatikusabb (meg az egész Segger ökoszisztéma), csak a debugger ITM-DWT hiányosságai fájnak. Lehet hogy ha tapasztaltabb lennék akkor nem lenne annyira nagy érvágás, de most még nagy hasznát veszem.

C/C++ keresztplatformos (Win/Linux) IDE terén amúgy a VSCode jött be leginkább. Saját cmake szkripttel, jól bekonfigurálva szerintem verhetetlen. Csak MCU-ra nagyon fapados...
(#) Rockmenyét hozzászólása Ápr 11, 2020 /
 
Sziasztok!

Kipróbáltam a VisualGDB-t, és egészen szimpatikus!
Kicsit szokni kell hogy az IAR-EWARM és KEIL-hez hasonlóan "mindent is" egymaga akar megoldani a háttérben, pl. a CubeMX HAL-LL csomagok "átcsomagolása" stb.
De amiket kipróbáltam így 3 nap alatt, az egészen OK; a Visual Studio-t pedig amúgy is a Microsoft kevés tényleg jól sikerült terméke egyikének tartom
(#) Rockmenyét hozzászólása Ápr 20, 2020 /
 
Üdv,

Abban kérném a véleményetek / segítségetek, hogy az STM32F4 család komolyabb tagjaiban található CCM SRAM-ot milyen esetekben célszerű használni?
Az F4-es család CCM használatáról szinte semmit sem találtam az ST-nél.
Az AN4296 is csak az F3-mal és G4-gyel foglalkozik.
Az F3 képes kódot is futtatni CCM-ben (a D-busra és az I-busra is csatlakozik), a G4 DMA-átvitelre is képes CCM-mel, addig az F4-ben csak a D-busra csatlakozik. Csatoltam az egyes családok buszmátrix elrendezését
Azt értem, hogy ez egy wait-state nélkül közvetleül a CPU sebességén pörgő SRAM, de mire jó DMA nélkül?
Én pl. az STM32F429/439-cel szeretnék DSP funkciókat is használó alkalmazást készíteni illetve finomítani, és jól jönne egy ilyen gyors RAM az adatfeldolgozáshoz. Viszont félek tőle, hogy az adatok CPU-val történő másolgatásával elveszítem a sebesség adta előnyöket.
Ha pl. a DSP feldolgozás eredményét etherneten szeretném átküldeni, előbb vissza kell másolnom az SRAM-ba, mert CCM-ből nem tudja DMA-val kiküldeni.
Jól gondolom?
Persze pontos számítások kellenek, érzésre nehéz megmondani az egyes algoritmusok "költségét".
Mi a tapasztalatototk/véleményetek?
(#) benjami válasza Rockmenyét hozzászólására (») Ápr 20, 2020 /
 
A CCM-et sajnos valóban nem fogja elérni a DMA, ezt már próbáltam. Kódot még nem próbáltam onnan futtatni, de a rajz alapján az sem megy onnan. Lehet hogy érdemes lenne a normál DMA képes RAM-ból áttenni olyan adatokat, oda, amiket nem akarsz DMA-val elérni (esetleg a verem is átkerülhet oda), a normál RAM-ban meg azokat tartani, amiket DMA-val szeretnél majd küldözgetni.
(#) csatti2 válasza Rockmenyét hozzászólására (») Ápr 22, 2020 /
 
Én RTOS stacknek használtam legutóbb. Ilyenkor az összes lokális változó itt található, plusz az OS működéséhez szükséges összes többi adat is. Ezeket nem szükséges DMA-ból elérni és így gyorsabb a program működése is. A globális adatokat lehet a hagyományos SRAM-ban tárolni mutexekkel védve ahol szükséges. A DMA-hoz pedig vagy előre lefoglalt buffereket lehet használni vagy pedig implementálni lehet valamilyen memória allokációs mechanizmust az SRAM-ra is. Mivel a CCM és a hagyományos memória között csak a CPU segítségével lehet viszonylag lassan másolni, csak akkor éri meg adatokat mozgatni a kettő között ha tényleg nagyon sok számítási műveletet akarsz rajtuk elvégezni.
(#) Rockmenyét hozzászólása Ápr 22, 2020 /
 
Köszi az ötleteket!
Kicsit csalódott voltam amiatt hogy F4-en még kódfuttatásra sincs lehetőség CCM-ben, de kicsit átgondolva még így is hasznos.
(#) Rockmenyét hozzászólása Ápr 22, 2020 /
 
Közben tegnap óta küzdök a timer rotary encoder üzemmódjával (STM32F4 / TIM4).
A cél az lenne, hogy amikor megmozdítom a tengelyt, a timer megszakítást generáljon; a megszakításkezelőben pedig kiolvasom a TIM4->CNT -t.
Arra hamar rájöttem hogy erre nincs külön IT.
Egyelőre úgy oldottam meg, hogy engedélyeztem a Capture/Compare interruptot; és a CH1 felfutó élére generált megszakításban olvasom ki a számlálót.
Ezzel szerintem az a gond, hogy nem egy teljes inkrement ciklus után hívódik meg, hanem amikor CH1 felfut. Ez ugye forgásirány szempontjából sem egészen OK.
Van erre elegánsabb megoldás?
Az enkóder a szokásos arduino-s, csak pergésmentesítettem 47n+10k kombóval
(#) vargham válasza Rockmenyét hozzászólására (») Ápr 22, 2020 /
 
CubeMX-et használsz?
Ha nem, akkor HAL-t?
(#) Rockmenyét válasza vargham hozzászólására (») Ápr 22, 2020 /
 
CubeMX-et használok, viszont a HAL-t próbálom kerülni.
Nincs vele bajom, bár tudom hogy sokan kritizálják a gyakori bugok meg a lassúsága miatt.
Én inkább az LL-t próbálom használni vagy közvetlen regiszter programozást, mert szeretném megérteni az MCU működését.
Bár ez PC-s fejlesztőként nem olyan egyszerű
(#) benjami válasza Rockmenyét hozzászólására (») Ápr 22, 2020 /
 
Anno csináltam egy kis módosítást a freertos-hoz tartozó heap memória menedzseren, hogy több memória régiót is kezeljen, és meg lehessen adni, hogy melyik memória régióból szeretnék memóriát kérni (na meg azt is megoldottam, hogy freertos nélkül is működjön). Ez az.
(#) icserny válasza Rockmenyét hozzászólására (») Ápr 22, 2020 /
 
A legegyszerűbb, talán, periodikus megszakításban (amit akár a Systick is generálhat) kiolvasni az encoderhez kapcsolódó számláló pillanatnyi értékét.
(#) Rockmenyét válasza benjami hozzászólására (») Ápr 23, 2020 /
 
Köszi mindenkinek, sikerült összehoznom!
@benjami: köszi a linket a repódra, kipróbálom a libraryt!
A fő hobbiprojektem mellett kísérletezem a C++ -szal is MCU-n, hát érdekes a PC-s világhoz képest... Van pár ötletem ahol a C++ konténerek hasznosak lennének, meg az STL egyéb dolgai de azért nagyon oda kell figyelni
Következő: »»   147 / 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