AnsweredAssumed Answered

Reading data from internal flash

Question asked by vnv on May 30, 2016
Hi all,

                                               
           
             
           
           

could someone please give a hint on how to read from flash.             I have tried to set value inside flash and then read it afterwards inside the code but it doesn't work, it reads 0.

Inside ld file I have done following.

           


/* Specify the memory areas */ 
MEMORY 
{ 
FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 2048K 
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 192K 
CCMRAM (rw)      : ORIGIN = 0x10000000, LENGTH = 64K 
DATA (rwx)        : ORIGIN = 0x080E0000, LENGTH = 128k 
} 
 
/* Define output sections */ 
SECTIONS 
{ 
    .user_data : 
    { 
      . = ALIGN(4); 
         *(.user_data) 
      . = ALIGN(4); 
    } > DATA


Inside the code I set memory location to value of 1. Then try to use that value to blink led.



/** 
  ****************************************************************************** 
  * File Name          : main.c 
  * Description        : Main program body 
  ****************************************************************************** 
  * 
  * COPYRIGHT(c) 2016 STMicroelectronics 
  * 
  * Redistribution and use in source and binary forms, with or without modification, 
  * are permitted provided that the following conditions are met: 
  *   1. Redistributions of source code must retain the above copyright notice, 
  *      this list of conditions and the following disclaimer. 
  *   2. Redistributions in binary form must reproduce the above copyright notice, 
  *      this list of conditions and the following disclaimer in the documentation 
  *      and/or other materials provided with the distribution. 
  *   3. Neither the name of STMicroelectronics nor the names of its contributors 
  *      may be used to endorse or promote products derived from this software 
  *      without specific prior written permission. 
  * 
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  * 
  ****************************************************************************** 
  */ 
/* Includes ------------------------------------------------------------------*/ 
#include "stm32f4xx_hal.h" 
#include "gpio.h" 
 
/* USER CODE BEGIN Includes */ 
 
/* USER CODE END Includes */ 
 
/* Private variables ---------------------------------------------------------*/ 
 
/* USER CODE BEGIN PV */ 
/* Private variables ---------------------------------------------------------*/ 
__attribute__((__section__(".user_data"))) const uint8_t userConfig[64]; 
/* USER CODE END PV */ 
 
/* Private function prototypes -----------------------------------------------*/ 
void SystemClock_Config(void); 
 
/* USER CODE BEGIN PFP */ 
/* Private function prototypes -----------------------------------------------*/ 
void write_data_to_flash(uint8_t address, uint32_t data){ 
    HAL_FLASH_Unlock(); 
 
      __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR ); 
 
     FLASH_Erase_Sector(FLASH_SECTOR_11, VOLTAGE_RANGE_3); 
 
 
      HAL_FLASH_Program(TYPEPROGRAM_BYTE, &userConfig[address], 1); 
 
      HAL_FLASH_Lock(); 
} 
 
 
/* USER CODE END PFP */ 
 
/* USER CODE BEGIN 0 */ 
 
/* USER CODE END 0 */ 
 
int main(void) 
{ 
 
  /* USER CODE BEGIN 1 */ 
    uint8_t pause; 
  /* USER CODE END 1 */ 
 
  /* MCU Configuration----------------------------------------------------------*/ 
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ 
  HAL_Init(); 
 
  /* Configure the system clock */ 
  SystemClock_Config(); 
 
  /* Initialize all configured peripherals */ 
  MX_GPIO_Init(); 
 
  /* USER CODE BEGIN 2 */ 
 
 write_data_to_flash(0,0xAABBCCDD); 
//  write_data_to_flash(4,0xBBCCDDEE); 
//  write_data_to_flash(2,0xCC); 
//  write_data_to_flash(3,0xDD); 
 
  pause = userConfig[0]; 
 
  /* USER CODE END 2 */ 
 
  /* Infinite loop */ 
  /* USER CODE BEGIN WHILE */ 
  while (1) 
  { 
  /* USER CODE END WHILE */ 
 
 
  /* USER CODE BEGIN 3 */ 
      HAL_GPIO_TogglePin(LD4_GPIO_Port,LD4_Pin); 
      HAL_Delay(pause*1000); 
 
  } 
  /* USER CODE END 3 */ 
 
} 
 
/** System Clock Configuration 
*/ 
void SystemClock_Config(void) 
{ 
 
  RCC_OscInitTypeDef RCC_OscInitStruct; 
  RCC_ClkInitTypeDef RCC_ClkInitStruct; 
 
  __HAL_RCC_PWR_CLK_ENABLE(); 
 
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); 
 
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; 
  RCC_OscInitStruct.HSIState = RCC_HSI_ON; 
  RCC_OscInitStruct.HSICalibrationValue = 16; 
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; 
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; 
  RCC_OscInitStruct.PLL.PLLM = 8; 
  RCC_OscInitStruct.PLL.PLLN = 50; 
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; 
  RCC_OscInitStruct.PLL.PLLQ = 7; 
  HAL_RCC_OscConfig(&RCC_OscInitStruct); 
 
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK 
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; 
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; 
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; 
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; 
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; 
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1); 
 
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); 
 
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); 
 
  /* SysTick_IRQn interrupt configuration */ 
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); 
} 
 
/* USER CODE BEGIN 4 */ 
 
/* USER CODE END 4 */ 
 
#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 CODE BEGIN 6 */ 
  /* 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) */ 
  /* USER CODE END 6 */ 
 
} 
 
#endif 
 
/** 
  * @} 
  */  
 
/** 
  * @} 
*/  
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/



Outcomes