2016-05-29 98 views
0

有人可能請提供關於如何從閃存讀取的提示。 我試圖在flash中設置值,然後在代碼中讀取它。讀取內部閃存內容

在ld文件裏面我做了以下。

/* 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 

裏面的代碼我設置存儲位置的1 值然後嘗試使用閃爍導致該值。

/** 
    ****************************************************************************** 
    * 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****/ 

回答

1

可能有人請就如何從閃存中讀取的提示。

FLASH_SECTOR_11 F4是位於地址0x080E0000(見表5,RM0090)的128Kb扇區。

沒有必要與所有連接東西打擾,只需將您的userConfig指針等於0x080E0000,並使用它之後正常讀取訪問:

const volatile uint8_t *userConfig=(const volatile uint8_t *)0x080E0000; 

需要注意的是意法半導體的閃存組織器件系列,甚至之間的不同在同一家族的設備之間,所以如果你將代碼移植到F0上,那麼你將不得不重新訪問這些代碼。