Hello I have two question regarding the FLASH_Program from the fsl_flash files. When the memory is 0xFFFFFFFF (empty) the FLASH_Program is able to write it and then as the firmware tries to program it again, it fails. And the function FLASH_Program does not crash and the result is kStatus_Success. Why?
Hello, maybe this example could work for your app.
/*
* Copyright (c) 2016, Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/*******************************************************************************
* Includes
******************************************************************************/
#include "fsl_device_registers.h"
#include "fsl_debug_console.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
#include "fsl_flash.h"
#include "fsl_common.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define BUFFER_LEN 4
/*******************************************************************************
* Prototypes
******************************************************************************/
void error_trap(void);
void app_finalize(void);
/*******************************************************************************
* Variables
******************************************************************************/
/*! @brief Flash driver Structure */
static flash_config_t s_flashDriver;
/*! @brief Buffer for program */
static uint32_t s_buffer[BUFFER_LEN];
/*! @brief Buffer for readback */
static uint32_t s_buffer_rbc[BUFFER_LEN];
/*******************************************************************************
* Code
******************************************************************************/
/*
* @brief Gets called when an error occurs.
*
* @details Print error message and trap forever.
*/
void error_trap(void)
{
PRINTF("\r\n\r\n\r\n\t---- HALTED DUE TO FLASH ERROR! ----");
while (1)
{
}
}
/*
* @brief Gets called when the app is complete.
*
* @details Print finshed message and trap forever.
*/
void app_finalize(void)
{
/* Print finished message. */
PRINTF("\r\n End of PFlash Example \r\n");
while (1)
{
}
}
/*!
* @brief Use Standard Software Drivers (SSD) to modify pflash.
*
* @details This function uses SSD to demonstrate flash mode:
* + Check pflash information.
* + Erase a sector and verify.
* + Program a sector and verify.
*/
int main(void)
{
status_t result; /* Return code from each flash driver function */
uint32_t destAdrss; /* Address of the target location */
uint32_t i;
uint32_t pflashBlockBase = 0;
uint32_t pflashTotalSize = 0;
uint32_t pflashSectorSize = 0;
/* Init hardware */
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
/* Clean up Flash driver Structure*/
memset(&s_flashDriver, 0, sizeof(flash_config_t));
FLASH_SetProperty(&s_flashDriver, kFLASH_PropertyFlashClockFrequency, 20000000U);
/* Setup flash driver structure for device and initialize variables. */
result = FLASH_Init(&s_flashDriver);
if (kStatus_FLASH_Success != result)
{
error_trap();
}
/* Get flash properties*/
pflashBlockBase = s_flashDriver.PFlashBlockBase;
pflashTotalSize = s_flashDriver.PFlashTotalSize;
pflashSectorSize = s_flashDriver.PFlashSectorSize;
/* print welcome message */
PRINTF("\r\n PFlash Example Start \r\n");
/* Print flash information - PFlash. */
PRINTF("\r\n PFlash Information: ");
PRINTF("\r\n Total Program Flash Size:\t%d KB, Hex: (0x%x)", (pflashTotalSize / 1024), pflashTotalSize);
PRINTF("\r\n Program Flash Sector Size:\t%d B, Hex: (0x%x) ", pflashSectorSize, pflashSectorSize);
/* Debug message for user. */
/* Erase several sectors on upper pflash block where there is no code */
PRINTF("\r\n Erase a sector of flash");
/* In case of the protected sectors at the end of the pFlash just select
the block from the end of pFlash to be used for operations
SECTOR_INDEX_FROM_END = 1 means the last sector,
SECTOR_INDEX_FROM_END = 2 means (the last sector - 1) ...
in case of FSL_FEATURE_FLASH_HAS_PFLASH_BLOCK_SWAP it is
SECTOR_INDEX_FROM_END = 1 means the last 2 sectors with width of 2 sectors,
SECTOR_INDEX_FROM_END = 2 means the last 4 sectors back
with width of 2 sectors ...
*/
#ifndef SECTOR_INDEX_FROM_END
#define SECTOR_INDEX_FROM_END 1U
#endif
/* Erase a sector from destAdrss. */
#if defined(FSL_FEATURE_FLASH_HAS_PFLASH_BLOCK_SWAP) && FSL_FEATURE_FLASH_HAS_PFLASH_BLOCK_SWAP
/* Note: we should make sure that the sector shouldn't be swap indicator sector*/
destAdrss = pflashBlockBase + (pflashTotalSize - (SECTOR_INDEX_FROM_END * pflashSectorSize * 2));
#else
destAdrss = pflashBlockBase + (pflashTotalSize - (SECTOR_INDEX_FROM_END * pflashSectorSize));
#endif
result = FLASH_Erase(&s_flashDriver, destAdrss, pflashSectorSize, kFLASH_ApiEraseKey);
if (kStatus_FLASH_Success != result)
{
error_trap();
}
/* Print message for user. */
PRINTF("\r\n Program a buffer to a sector of flash ");
/* Prepare user buffer. */
for (i = 0; i < BUFFER_LEN; i++)
{
s_buffer[i] = i;
}
/* Program user buffer into flash*/
result = FLASH_Program(&s_flashDriver, destAdrss, s_buffer, sizeof(s_buffer));
if (kStatus_FLASH_Success != result)
{
error_trap();
}
#if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT
/* Clean the D-Cache before reading the flash data*/
SCB_CleanInvalidateDCache();
#endif
/* Verify programming by reading back from flash directly*/
for (i = 0; i < BUFFER_LEN; i++)
{
s_buffer_rbc[i] = *(volatile uint32_t *)(destAdrss + i * 4);
if (s_buffer_rbc[i] != s_buffer[i])
{
error_trap();
}
}
PRINTF("\r\n Successfully Programmed and Verified Location 0x%x -> 0x%x \r\n", destAdrss,
(destAdrss + sizeof(s_buffer)));
FLASH_Erase(&s_flashDriver, destAdrss, pflashSectorSize, kFLASH_ApiEraseKey);
app_finalize();
return 0;
}
Best regards,
Pavel
However I am able to erase sectors at the very begining of the application firmware.
I try to increase a value on the memory but to no avail... it writes a '0' instead of a '2'...
I try to write a 64-bit each time but I am not able to do it.
Thanks, Pavel.
I am using the mke04z8vtg4.
I am using no examples... I am merely using the FLASH_Program function.
Hello, my name is Pavel, and I will be supporting your case, could you let me know about the number of your MCU? and What kind of example are you using? is the flash iap?
Best regards,
Pavel