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   130 / 130
(#) jefflynn válasza kapu48 hozzászólására (») Szept 27, 2018 /
 
Beleírtam egy programomba szándékos Hard Fault generálást, és a hatodik elem adja meg a fault előtti PC-t. Így viszont FFFF.FFFE cím jön ki, ami nem lehet. Ez okozná a hard fault-ot, hogy nem létező címre megy a végrehajtás? De hogy kerülhet oda?
(#) vargham válasza david10 hozzászólására (») Szept 27, 2018 / 1
 
Nem. Az STM32 Nucleo-n lévő ST-Link csak SWD (ARM) debug protokollt ismer, ami az STM8-hoz nem jó, mivel az nem ARM.
Vegyél STM8 Nucleo-t. Esetleg külön ST-Linket, azzal STM32-t és STM8-t is lehet programozni, és hibát keresni.

(Ezt az információt a mindenki számára elérhető STM32 Nucleo kézikönyvében olvastam. Te olvastad?)
A hozzászólás módosítva: Szept 27, 2018
(#) kapu48 válasza jefflynn hozzászólására (») Szept 27, 2018 /
 
Ezek szerint nálam van zavar a fejben?

Ha lesz, időm én is csinálok ilyen asm verem tesztet. Mert eddig csak a könyvek alapján volt róla elképzelésem.

Lehet, rossz értéket kap 1 pointer, vagy kioptimalizálta a fordító az üresnek vélt szubrutinodat?
Esetleg valamelyik nem definiált megszakítás beugrik?
A hozzászólás módosítva: Szept 27, 2018
(#) rolandgw hozzászólása Okt 11, 2018 /
 
Pár újdonság:
STLINK-V3
Új Cortex magok: M23, M33.
Bővebben: Link
(#) Lucifer válasza rolandgw hozzászólására (») Okt 18, 2018 /
 
Az új Stlink az penge kis vas, bár a VCP firmware még kicsit bugos: bár 15 Mb/s kijön belőle, de van benne pár buffer túlcsordulásnak kinéző bug.

API még nincs a bridgekhez, pedig tök jó kis USB-GPIO/SPI/I2C/bármi lehetne belőle.
(#) rolandgw hozzászólása Nov 2, 2018 /
 
Portoltam egy jól működő lcd könyvtárat AVR-ből STM32 KEIL-be. Mikor késznek hittem, utolsónak kidobta ezt a hibát. Elfelejtettem, hogy a case 0x80 ... 0xFF: gcc-ben működik. Mit tudok csinálni, írjak 127 case-t?
  1. void lcd_command( uint8_t d )
  2. {
  3.         HAL_GPIO_WritePin( LCD_RS_GPIO_Port,LCD_RS_Pin, GPIO_PIN_RESET);
  4.         lcd_byte( d );
  5.         switch( d ){
  6.     case 0:
  7.     case 1:   // on longer commands
  8.     case 2:
  9.     case 3:
  10.         HAL_Delay( LCD_TIME_CLR );
  11.        d = LCD_LINE1;
  12.     case 0x80 ... 0xFF:                 // set position
  13.       lcd_pos = d;
  14.   }
  15. }
A hozzászólás módosítva: Nov 2, 2018
(#) killbill válasza rolandgw hozzászólására (») Nov 2, 2018 /
 
Írj két if()-et az egész switch helyett. Vagy írj egy if()-e a default switch ágba.
(#) rolandgw válasza killbill hozzászólására (») Nov 2, 2018 /
 
Köszi! Mérgemben erre nem gondoltam.
(#) rolandgw hozzászólása Nov 3, 2018 /
 
Átírtam a HAL_Delay-t us-osra és nem ugrál megszakításba a systick, hanem csak a COUNTFLAG-et használja. A HAL-ba nem is kell belepiszkálni, mert az érintett függvények weak-ként vannak megadva, a főprogramban a függvénytörzs felülírható.Ha valakit érdekel, megosztom. 32MHz-es ST-vel teszteltem.
(#) vargham válasza rolandgw hozzászólására (») Nov 3, 2018 /
 
Kösz, érdekel.
(#) rolandgw válasza vargham hozzászólására (») Nov 3, 2018 /
 
Ezeket a függvényeket kell a főprogramhoz adni:
  1. __STATIC_INLINE void InitTick(uint32_t Frequency, uint32_t Ticks)
  2. {
  3.  
  4.   SysTick->LOAD  = (uint32_t)((Frequency / Ticks) - 1UL)/* set reload register */
  5.   SysTick->VAL   = 0UL;                                       /* Load the SysTick Counter Value */
  6.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
  7.                    SysTick_CTRL_ENABLE_Msk;                   /* Enable the Systick Timer */
  8. }

  1. void Init_usTick(uint32_t Frequency)
  2. {
  3.   /* Use frequency provided in argument */
  4.   InitTick(Frequency, 1000000U);
  5. }
  6.  
  7. HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
  8. {
  9.  
  10.         Init_usTick(SystemCoreClock);
  11.   /*Configure the SysTick IRQ priority */
  12.   HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0U);
  13.    /* Return function status */
  14.   return HAL_OK;
  15. }
  16.  
  17. void HAL_Delay( uint32_t Delay)
  18. {
  19.   __IO uint32_t  tmp = SysTick->CTRL;  /* Clear the COUNTFLAG first */
  20.   /* Add this code to indicate that local variable is not used */
  21.   ((void)tmp);
  22.   /* Add a period to guaranty minimum wait */
  23.   if (Delay < SysTick_LOAD_RELOAD_Msk )
  24.   {
  25.     Delay++;
  26.   }
  27.   while (Delay)
  28.   {
  29.     if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0U)
  30.     {
  31.       Delay--;
  32.     }
  33.   }
  34. }

HAL_InitTick(0U);-al indul, ezután us-ban kell megadni az értéket a HAL_Delay-ben.
(#) Lucifer válasza rolandgw hozzászólására (») Nov 3, 2018 /
 
Ez a switch case range valami újabb C szabványban van, meg kellene keresni és megnézni, hogy a Keil-nek nem-e lehet megmondani, hogy olyan szabvánnyal fordítson.
(#) rolandgw válasza Lucifer hozzászólására (») Nov 3, 2018 /
 
Lehet, hogy van valami beállítás, de nem jöttem rá. Egy if-el megoldottam. Az avr-gcc már régóta kezeli.
(#) Seton válasza rolandgw hozzászólására (») Nov 4, 2018 /
 
Próbálgatva nekem a --gnu opcióval lefordul (uVision 4.6).
Mellesleg jó tudni, hogy van ilyen switch case megoldás is.
(#) Seton válasza Seton hozzászólására (») Nov 4, 2018 /
 
Érdemes viszont megjegyezni, hogy egy ilyen case 0x80 ... 0xFF: var += 10; feltétel -O0 beállítás mellett ~500 byte-tal dobja meg a kódméretet, az optimalizációt rákapcsolva csak 100 byte (-O1, -O2). A --gnu parancsnak nálam nincs hatása a kódméretre amúgy.
(#) rolandgw válasza Seton hozzászólására (») Nov 4, 2018 /
 
Kösz! Van hozzá egy GNU extensions pipa is. Egy kicsit megdobja a kódot nálam is az if-hez képest (V5).
Következő: »»   130 / 130
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu