This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

STM32F407VG RTX, FPU Hard fault

Hi,

I am testing RTX task and I always get hard_fault when I use FPU and float. Please help, what am I missing?

This is my code:

#include <RTL.h>
#include "stm32f4_discovery.h"

#include "stm32f4xx_i2c.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_tim.h"
#include "misc.h"
#include "LED.h"
#include "ssd1308.h"
#include <stdio.h>

__align(8) static U64 stk1[100];


void testOne( float b )
{
        float a = 1.2f;
        char buffer[16];

        sprintf( buffer, "%f", a+b );
        SSD1308_setTextXY( 0, 0 );
        SSD1308_putString( buffer );
}

__task void task1 (void) {
  int a = 0;
  char buffer[8];
        float b = 0.001f;

        for (;;) {

    LED_On (LED_A);

                b += 0.001f;

                testOne( b );

                a++;

                if( a > 128*64 )
                        a = 0;



    LED_Off(LED_A);
  }
}


/*----------------------------------------------------------------------------
 *        Main: Initialize and start RTX Kernel
 *---------------------------------------------------------------------------*/
int main (void) {
        char buffer[16];

  LED_init ();                              /* Initialize the LEDs           */

        SSD1308_Init();


        SSD1308_clearDisplay();
        SSD1308_Send( SSD1308_Command_Mode,  SSD1308_Dectivate_Scroll_Cmd );


  os_sys_init_user (task1, 10, &stk1, sizeof(stk1));                        /* Initialize RTX and start init */

        while(1);
}

/*----------------------------------------------------------------------------
 * end of file
 *---------------------------------------------------------------------------*/




#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

/**
  * @}
  */

/**
  * @}
  */

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

regards.

Parents
  • Make sure SystemInit() in system_stm32f4xx.c is being called, and the correct defines cause the FPU to be enabled.

    void SystemInit(void)
    {
      /* FPU settings ------------------------------------------------------------*/
      #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
        SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
      #endif
    

Reply
  • Make sure SystemInit() in system_stm32f4xx.c is being called, and the correct defines cause the FPU to be enabled.

    void SystemInit(void)
    {
      /* FPU settings ------------------------------------------------------------*/
      #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
        SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
      #endif
    

Children