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   114 / 176
(#) koverg70 válasza vargham hozzászólására (») Márc 9, 2018 /
 
Szia! Köszi a választ. Próbáltam így is, de nem ment. A VAPP-on (1-es és 2-es láb) vagy pedig a VDD-n (19-es láb) méri a tápfeszt?
(#) koverg70 válasza vargham hozzászólására (») Márc 9, 2018 /
 
Köszönöm, ez volt a megoldás. Mindkettőt be kell kötni!
(#) koverg70 válasza vzoole hozzászólására (») Márc 9, 2018 /
 
Szia! Köszi a segítéget, megoldottad a problémámat!
(#) benjami hozzászólása Márc 10, 2018 /
 
Sziasztok!
Egy stm32f103c8t6 (bluepill board) RTC megszakításával gyűlt meg a bajom. Az a gondom, hogy nem következik be a másodpercenkénti megszakítás. A project STM32CubeMX-ben lett létrehozva, az RTC megszakítás be van pipálva, a hozzáadott kód a main.c-ben a következő (máshol nem nyúltam bele):
  1. /* USER CODE BEGIN PV */
  2. /* Private variables ---------------------------------------------------------*/
  3. volatile uint32_t systickimpulse = 0;
  4. volatile uint32_t rtc1secimpulse = 0;
  5. /* USER CODE END PV */

  1. /* USER CODE BEGIN 0 */
  2. void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc)
  3. {
  4.   rtc1secimpulse++;
  5. }
  6.  
  7. void HAL_SYSTICK_Callback(void)
  8. {
  9.   systickimpulse++;
  10. }
  11. /* USER CODE END 0 */

  1. /* USER CODE BEGIN WHILE */
  2.   uint8_t presec = 0;
  3.   RTC_TimeTypeDef st;
  4.   printf("STM32F103 RTC teszt start\r\n");
  5.   if(HAL_RTCEx_SetSecond_IT(&hrtc) == HAL_OK)
  6.   {
  7.     printf("SetSecond IT Ok!\r\n");
  8.   }
  9.   while (1)
  10.   {
  11.     HAL_RTC_GetTime(&hrtc, &st, RTC_FORMAT_BIN);
  12.     if(presec != st.Seconds)
  13.     {
  14.       presec = st.Seconds;
  15.       printf("GetTime Step:%u, systickimpulse:%u, rtc1secimpulse:%u\r\n", st.Seconds, systickimpulse, rtc1secimpulse);
  16.     }
  17.   /* USER CODE END WHILE */

  1. /* USER CODE BEGIN 4 */
  2. int __io_putchar(int ch)
  3. {
  4.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  5.   return ch;
  6. }
  7.  
  8. //-----------------------------------------------------------------------------
  9. int _write(int file, char *ptr, int len)
  10. {
  11.   int DataIdx;
  12.   for (DataIdx = 0; DataIdx < len; DataIdx++){ __io_putchar( *ptr++ );}
  13.   return len;
  14. }
  15. /* USER CODE END 4 */

Az UART1-re rá vagyok kapcsolódva egy TTLUART/USB átalakítóval, a terminálban szépen látszik a lenti képen látható üzenetsor. A teljes projectet is mellékeltem, valamint a debuggolás közbeni regiszter értékeket is, ahol az látszik, hogy be van kapcsolva a megszakítás engedélyező bit.
A soros porton elküldött üzeneteket is a mellékletbe feltöltöttem.
Szóval: mi az amit kihagytam, vagy rosszul csináltam?
(#) csatti2 válasza benjami hozzászólására (») Márc 10, 2018 /
 
A PRLH és PRLL regiszterek értéke tényleg 0, mint ahogy a képen látszik? Azok a regiszterek adják meg, hány órajel eltelte után generáljon megszakítást az RTC. Fogalmam sincs melyik utasítással lehet őket beírni a HAL esetén (én LL-t használok).
(#) kapu48 válasza benjami hozzászólására (») Márc 10, 2018 / 1
 
Szerintem nem engedélyezted az RTC megszakítást.
Ezt a részt hiányolom:
  1. ...
  2.   MX_USART1_UART_Init();
  3.  
  4.   /* Initialize interrupts  ???*/
  5.   MX_NVIC_Init();
  6. ...
  7.  
  8. ...
  9. /** NVIC Configuration  ???
  10. */
  11. static void MX_NVIC_Init(void)
  12. {
  13.   /* RTC_IRQn interrupt configuration */
  14.   HAL_NVIC_SetPriority(RTC_IRQn, 0, 0);
  15.   HAL_NVIC_EnableIRQ(RTC_IRQn);
  16. }
  17.  
  18. /* RTC init function */
  19. static void MX_RTC_Init(void)
  20. {...
(#) benjami válasza kapu48 hozzászólására (») Márc 10, 2018 /
 
Igen, a HAL_NVIC_EnableIRQ(RTC_IRQn); hiányzott. Csak az a fura, hogy az összes többi periféria esetén automatikusan berakta a Cube, ennél meg kifelejtette valahogy.
csatti: azon regiszterek értékei nem nullák, hanem csak írhatóak (ezért is van kiszürkítve), az ott maradt 0, az a reset utáni értékét mutatja (annak is csak az eleje látszik (0x0000FFFF)).
A hozzászólás módosítva: Márc 10, 2018
(#) hegecsaba78 hozzászólása Márc 23, 2018 /
 
Üdv mindenkinek, STM32F103C8-at szeretném összepárositani a QD320DB16NT9481RA kijelzővel.
Mivel STM32 terén kezdő vagyok ezért szeretném a segitségeteket kérni, eddig még sosem volt dolgom TFT vel csak 16x2 LCD-vel.
Az adatlap szerint ez a kijelző 16bites párhuzamos adatbuszon kommunikál, ILI9481 a kontroller ic rajta, na most mi az egyszerűbb(nem kell nagy sebesség) ILI9481-en keresztül vagy FSMC-n keresztül
meghajtani? Remélem nem kérdeztem hülyeséget
Egy egyszerű példa, kábelezéssel sokat segitene. Köszönöm.
A hozzászólás módosítva: Márc 23, 2018
(#) csatti2 válasza hegecsaba78 hozzászólására (») Márc 23, 2018 /
 
Picit belekeveredtél. A C8-asban még nincsen FSMC periféria, az a 100 lábúaknál jelenik meg először. A kérdés pedig nem úgy merül fel, hogy ILI9481-n keresztül vagy FSMC-n keresztül, hanem hogy FSMC-n kommunikálsz az ILI9481-vel vagy pedig szoftveresen (esetleg SPI-on ha ki lett vezetve a TFT panelen).

Bekötésre pedig nézd meg a mellékelt képeket (STM32F103VET6 esetén).
(#) hegecsaba78 válasza csatti2 hozzászólására (») Márc 23, 2018 /
 
Köszönöm a gyors választ, sajnos csak 16bit-es adatbuszon kommunikál, SPI csak az SD kartya kezelésére szolgál, ha jól értelmeztem az TFT adatlapot.
A bekötés igy kicsit meredek, esetleg egy mintapogram, TFT-STM32 melyik láb? Mint irttam még csak ismerkedek az STM32-vel. Itt tartok: STM32CubeMx-órajel, lábak konfigurálása majd Keil v5 HAL program rész, ST-Link V2 load-debuggolás(led villogtatás, GPIO, LCD16X2).
Mivel érdemes megindulni? HAL vagy LL, kezdőnek is járható legyen, de hogy lehessen tovább fejlődni?(örök téma).
(#) vargham válasza hegecsaba78 hozzászólására (») Márc 23, 2018 /
 
Kezdőknek https://os.mbed.com
(#) icserny válasza hegecsaba78 hozzászólására (») Márc 23, 2018 /
 
Az általad belinkelt dokumentum Arduino Mega és STM32 mintapéldákat emnleget. Azokat begyűjtötted, megnézted már?
(#) Peppe válasza hegecsaba78 hozzászólására (») Márc 23, 2018 /
 
Szia,

A TFT tud menni SPI-vel is csak nem úgy van kofnfigurálva. IM0/IM1/IM2 lábak mondják megy milyen módban menjen. Neked sajnos ez be van nyákozva. De meg lehet oldani(én csináltam), pici nyák vágás itt ott és máris SPI-vel tudsz kommunikálni.
Az alábbi linken találsz libet, átportolod STM32 re és örül
Bővebben: Link
(#) benjami válasza hegecsaba78 hozzászólására (») Márc 23, 2018 /
 
Az STM32-esed milyen panelon van? A bluepill-n sajnos sem az A, sem a B portnál nem hozzáférhető az összes láb, így a 16 bitet sajnos nem tudod egy lépésben kiküldeni rá.
(#) vargham válasza hegecsaba78 hozzászólására (») Márc 23, 2018 /
 
(#) Peppe válasza vargham hozzászólására (») Márc 23, 2018 /
 
Ez SPI-s kommunikációra van. Neki meg 16bitesen van kötve a kijelzője.
A hozzászólás módosítva: Márc 23, 2018
(#) vargham válasza Peppe hozzászólására (») Márc 23, 2018 /
 
Kiindulásnak:
https://os.mbed.com/teams/GraphicsDisplay/code/UniGraphic/
De az ST-től is van práhuzamos TFT, csak 429-re:
https://os.mbed.com/teams/ST/code/DISCO-F429ZI_LCD_demo/?platform=S...F429ZI
Elérhető a teljes forrás is.

Innen is lehet ötleteket meríteni, de ez nem mbed-os:
https://stm32f4-discovery.net/2014/04/library-08-ili9341-lcd-on-stm32f429-discovery-board/
(#) hegecsaba78 válasza icserny hozzászólására (») Márc 23, 2018 /
 
Igen, átnézztem a mintapéldákat, de nincs közöttük egyszerü példa, vagy touch-os, vagy SD-röl olvassa be a képet stb., szóval nekem sok igy kezdésnek.
Huh csak kapkodom a fejem mi lesz ebböl , mbed os, panel vágás, port-olás, jól indul, de nem adom fel.
Blue pill-em van, szóval nekem "csak" annyi kell, hogy a kijelyőn megjelenjen egy karakter, utána már elboldogulok vgyis az már valami lesz. Igy arduino uno után kicsit rázós az út, nincsennek szájbarágós tutorialok, sok layer van hozzá(SPL,HAL, LL, mbed os)-sajat fejlesztésű könyvtárak(Keil meg a többiek), valaki az egyiket dicsőiti valaki a másikat és igy nehéz nekikezdeni, föleg hogy az ismerőseim közül senki sem foglallkozik ilyesmivel(régi motorosok,rádiósok, analogtechnika,erősáram) csak a net és a forumok maradtak.
(#) icserny válasza hegecsaba78 hozzászólására (») Márc 23, 2018 /
 
Az (STM32) Example1 - Simple Test név azt sugallja, hogy ott kellene kezdeni.
Megfontolandó lehetőség egy Arduino Mega kártya beszerzése is (ha már ahhoz való megjelenítőt vettél).
Panelvagdosás helyett egy MCP23S17 portbővítő (vagy két 595) felhasználásával is megoldható a 16 bites vezérlés "sorosítása". Bár a legelegánsabb megoldás mégis egy összeillő mikrovezérlő és kijelző kártya-páros beszerzése lenne.
A hozzászólás módosítva: Márc 23, 2018
(#) benjami válasza hegecsaba78 hozzászólására (») Márc 23, 2018 /
 
Az ILI9488-ast én arduino lib-ből írtam át (igaz az csak 8 bites vezérlésű, bár minimális a különbség a 8bites és a 16bites vezérlés között). A szűk keresztmetszeted az lesz, hogy nem marad másra szabad lábad, mert a nagy részét felemészti a kijelző (bár ezen meg könnyen lehet segíteni SPI vagy I2C buszos portbővítővel).
(#) ha1drp válasza hegecsaba78 hozzászólására (») Márc 23, 2018 /
 
Nem tudom ezt ismered-e. Bár pont 16 bites ILI9481-hez lehet nincs kód. Viszont legalább számodra biztos ismert a felület.
(#) hegecsaba78 válasza benjami hozzászólására (») Márc 23, 2018 /
 
A 8bites vezérlés érdekes lehet mivel 16 helyett csak 8data vonal kell, több port marad szabadon, Stm32duinoval mar megoldották, úgyhogy a hétvégen összekábelozom és kiprobálom.
(#) benjami válasza hegecsaba78 hozzászólására (») Márc 23, 2018 /
 
Ha át lehet állítani nyákvagdosás nélkül, akkor érdemes megpróbálni. Ha mégis 16 bitesként akarod működtetni, akkor meg a perifériáknak kell berakni egy portbővítőt.
(#) benjami hozzászólása Márc 25, 2018 /
 
Sziasztok! Egy chip megismeréséhez gondolom ti is sok példaprogramot szoktatok írni. Ahhoz, hogy ne 'koptassuk' el a flash-t az ilyen (általában) elég kis méretű, de nagyon sokszor módosított programocskákkal, célszerű RAM-ból futtatni ezeket (különösen ha nem a 2dolláros bluepill boardról van szó, hanem nagyobb memóriával rendelkező, drágább fejlesztőpanelről). Hogyan is lehet ezt megoldani? Az alábbi példa egy STM32F429discovery boardról fog szólni. A példában a legegyszerűbb LED villogtatás lesz, fejlesztő eszközként pedig az STM32CubeMX és a System Workbench for STM32-t használtam, a CubeMX-ben a board-hoz tartozó alapbeállításokat választottam.
1. Ahhoz, hogy a chip a RAM területen elhelyezett programot indítsa, a BOOT0 és a BOOT1 lábat is logikai magas szintre kell húzni.
2. A fordító linkere a linker script alapján helyezi el a programkódot. Ez jelen példában a STM32F429ZITx_FLASH.ld nevű fájl. Ha megnyitjuk ezt, akkor a következő részt keressük meg benne:
  1. #/* Specify the memory areas */
  2. MEMORY
  3. {
  4. RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
  5. CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
  6. FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K
  7. }

Ezek tartalmazzák az adat és a kód memória kezdőcímét és a méretét. Módosítsuk ezt az alábbiak szerint:
  1. #/* Specify the memory areas */
  2. MEMORY
  3. {
  4. RAM (xrw) : ORIGIN = 0x20020000, LENGTH = 64K
  5. CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
  6. FLASH (rx) : ORIGIN = 0x20000000, LENGTH = 128K
  7. }

3. A megszakítás vektor táblát is irányítsuk át a RAM területre. Ehhez adjunk hozzá egy definíciót a projecthez: Projekt beállítások / Settings / Preprocessor : VECT_TAB_SRAM
Ezt azt eredményezi, mint ha minden forrásunk elejére beírnánk egy #define VECT_TAB_SRAM sort. A definíció a system_stm32f4xx.c forrásban fogja kifejteni a hatását (ezt nem kell beírni, ezt tartalmazza alapban):
  1. #ifdef VECT_TAB_SRAM
  2. SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
  3. #else
  4. SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
  5. #endif

4. Írjuk meg a prgramunkat a main.c-ben:
  1. while (1)
  2. {
  3. HAL_Delay(200);
  4. HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
  5. HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_SET);
  6. HAL_Delay(200);
  7. HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
  8. HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_RESET);
  9. /* USER CODE END WHILE */

Ezt lefuttatva a két ledünk felváltva fog villogni, lehet korlátlan számban irogatni a kis programocskáinkat.
(#) kapu48 válasza benjami hozzászólására (») Márc 26, 2018 /
 
Más lehetőség, pl. az ingyenes TrueSTUDIO-ban.
Menü: Project > Properties > Build > Settings > Code location : RAM
Kiválasztása. És elkészíti neked a: Debug_xxx_RAM.ld álományt.
(#) benjami válasza kapu48 hozzászólására (») Márc 26, 2018 /
 
Megnéztem az ingyenes TrueSTUDIO-t. Elég nagy a hasonlóság a szintén ingyenes System Workbench for STM32-el, ami nem is csoda, mert mindkettő Eclipse alapú. De tény hogy a TrueSTUDIO sokkal letisztultabb, átláthatóbb. Át is váltottam rá, bár egy ideig még meghagyom a másikat is vésztartaléknak.
(#) ColoradoKid hozzászólása Márc 27, 2018 /
 
Sziasztok!

STM32 + HAL esetén azt tapasztalom, hogy amikor elindítom az időzítőt, azonnal generál egy megszakítást. A cél az lenne, hogy periodikusan ismétlek egy jelet DAC-kal. Tehát timer megszakítás -> DAC konverzió -> konverzió vége megszakításban timer újrakonfigurálás (mivel beállítható on-the-fly a periódus). Jelenleg a konverzió után, amikor újrahúzom a timert (HAL_TIM_Base_Start_IT), azonnal jön is egy megszakítás, így pedig gyakorlatilag folyamatos a konverzió.
Mi lenne a megoldás?
A hozzászólás módosítva: Márc 27, 2018
(#) ColoradoKid válasza ColoradoKid hozzászólására (») Márc 27, 2018 /
 
Közben találtam is valami olyat, hogy __HAL_TIM_SET_AUTORELOAD makró, ami lehet orvosság a problémára. Ezzel mintha lehetne állítani menet közben is a periódust, a nélkül, hogy leállít-beállít-elindít.
Ettől függetlenül, érdekelne, miért generál azonnal megszakítás, ha elindítom a timert.
A hozzászólás módosítva: Márc 27, 2018
(#) cimopata hozzászólása Márc 28, 2018 /
 
üdv.

Kikészülök lassan de nem jövök rá mi a hiba.
Van egy programom ami egy másik típusú elektronikán ugyan az a programrészlet hiba nélkül fut, de az aktuális verzióban valamiért nagyon fura dolgot csinál. A probléma nagyon egyszerű áramot mérek és amikor 2048 nál nagyobb vagy egyenlő akkor az egyik amikor 2048-nál kissebb akkor a másik feladat fusson le. De ehelyett mindig az első rész fut le ha nagyobb ha kissebb akkor is:

  1. kurvaanyad = adc_store[1] + offset1;
  2.                                                                                                        
  3. if(kurvaanyad >= 2048)
  4.         {
  5.         regen=0;
  6.         kurvaanyad = (((kurvaanyad -2048) * current_calibration_value) / 2048) ;       
  7.         kurvaanyad =( kurvaanyad * shunt_temp_correction) /4096;                                                                       
  8.         current = kurvaanyad << 2;
  9.         current_4 = kurvaanyad;
  10.         }
  11. else{
  12.         regen=1;
  13.         kurvaanyad = (((2048-kurvaanyad) * current_calibration_value) / 2048) ;
  14.         kurvaanyad =( kurvaanyad * shunt_temp_correction) /4096;                                                                       
  15.         current = kurvaanyad << 2;
  16.         current_4 = kurvaanyad;
  17.         }


Arra rájöttem hogy a baj a "kurvaanyad" változóval van ugyanis ha uint16_t nek deklarálom akkor tökéletesen megy minden de muszáj a nagyobb változó így uint32_t vel deklarálva meghülyül és ha kissebb ha nagyobb 2048-nál a változó mindig belép az if-be.

Minden egyéb változó uint16_t.

Mi lehet a baj?
A hozzászólás módosítva: Márc 28, 2018
(#) Kovidivi válasza cimopata hozzászólására (») Márc 29, 2018 /
 
Az adc_store(1)-et kiíratod soros porton, akkor változik egyáltalán?
Következő: »»   114 / 176
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