Forum: Mikrocontroller und Digitale Elektronik wie int16 zu float umwanden ?


von Ersi (cell85)


Angehängte Dateien:

Lesenswert?

Hallo,

ich verwende auf dem STM32 eine TypConversion die ein int16 zu einem 
float umwandeln soll, leider löst die immer einen hardfault aus und ich 
weiß nicht warum:
1
typedef float real32_T;
2
3
4
real32_T Math_int2single(int16_T v_int)
5
{
6
7
  real32_T Buffer;
8
  Buffer = 0.0;
9
  Buffer = (real32_T) v_int;
10
  
11
  return Buffer;
12
}

Please help ;D

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Lass einfach den Typecast weg.

float x;
int y;

x = y;

von Ersi (cell85)


Lesenswert?

Hi,

das war scheinbar nicht der Fehler.
Ich hab jetzt mal die FPU abgeschaltet und siehe da es geht!!!


hier die for-Schleife wo ich das benutze:
1
// i_col loop
2
for(i_col = 0; i_col < 64; i_col++)
3
{
4
  i_buffer = i_col + (i_frame * 64);
5
  data_cut [i_buffer]=  Math_int2single(Pixvector[i_col]);
6
  ref_cut[i_buffer] = Math_int2single(Refvector[i_col]);
7
  }


Warum ist die FPU so böse zu mir ?
Ich benutze keil als IDE und hatte "Use FPU" angeklickt.

Viele Grüße


Schienbar hat in der system_stm32f4xx.c

in der system init das hier gefehlt:
1
  /* FPU settings ------------------------------------------------------------*/
2
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
3
  SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
4
#endif

von Dr. Sommer (Gast)


Lesenswert?

Ersan G. schrieb:
> Warum ist die FPU so böse zu mir ?
> Ich benutze keil als IDE und hatte "Use FPU" angeklickt.
Weil du keine (eingeschaltet) hast:

UsageFault, No coprocessor
Status bit UFSR.NOCP
Occurs on an attempt to access a coprocessor that does not exist, or to 
which access is denied

Siehe S. 671 im ARMv7M Architecture Reference Manual

von Road R. (mickmack)


Lesenswert?

Ersan,
du bist mein Held des Tages!
Ich hatte dasselbe Problem beim Casten eines Ints zu Float und 
aktivierter FPU (STM32F427ZI).
Ich habe dann auch zuerst (zwar erfolgreich, aber etwas uneffizient) 
versucht ohne FPU zu arbeiten, aber mit der von dir geschilderten 
Anpassung der SystemInit() hat es nun auch mit FPU geklappt.


Herzlichen Dank für den wertvollen Beitrag,

MickMack

von Ersi (cell85)


Lesenswert?

Ja, immmer wieder gerne ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.