<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Storing data in non volatile memory on KL43 in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414388#M23568</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Is there a way to attach a .zip file?&amp;nbsp; Can't find it and 'Advance Editor' is not coming up (Again :-(&amp;nbsp; This system always hoses my code posts. :-( ).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here are the functions you need.&amp;nbsp; It won't compile directly because of missing .h files (from the .zip file).&lt;/P&gt;&lt;P&gt;Mostly add #include &amp;lt;stdint.h&amp;gt; .&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I wrote this for the KL27 a child of the KL43.&amp;nbsp; Add defines for KL43 and it should work with no other changes.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/** @(#)flash_kinetis.h &amp;lt;08-Oct-2013 13:49:11 Bob Paddock&amp;gt;&lt;/P&gt;&lt;P&gt; *&amp;nbsp; Last Time-stamp:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;19-Oct-2015 08:14:41 bob p&amp;gt;&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \file flash_kinetis.h&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \brief&amp;nbsp; Commands to erase/program Flash.&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; * Note!: CCIF: Depending on how quickly the read occurs after reset&lt;/P&gt;&lt;P&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; release, the user may or may not see the 0 [busy] hardware&lt;/P&gt;&lt;P&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reset value.&lt;/P&gt;&lt;P&gt; */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*lint -save -e755 -e756 Disable warning(s), this file only, global macro/typedef 'Symbol' (Location) not referenced */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#ifndef _FLASH_KINETIS_H_&lt;/P&gt;&lt;P&gt;#define _FLASH_KINETIS_H_ (1)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#ifdef&amp;nbsp; DEFINE_SPACE_FLASH_KINETIS_H&lt;/P&gt;&lt;P&gt;#define EXTERN_FLASH_KINETIS&lt;/P&gt;&lt;P&gt;#else&lt;/P&gt;&lt;P&gt;#define EXTERN_FLASH_KINETIS extern&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#if defined(__cplusplus) &amp;amp;&amp;amp; __cplusplus&lt;/P&gt;&lt;P&gt; extern "C" {&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#if( defined (MCU_MKL25Z4) || defined(MCU_MKL26Z4) || defined(MCU_MKL27Z4) )&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#define FLASH_SECTOR_SIZE (1024UL) /* The smallest portion of the program flash memory (consecutive addresses) that can be erased */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; enum FTFA_CMDS{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_OK&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00U, /* Command completed without error */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_READ_1s_SECTION&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x01U, /* Verify that a given number of program flash locations from a starting address are erased */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_PGM_CHECK&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x02U, /* Tests previously-programmed locations at margin read levels */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_READ_RSC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x03U, /* Read 4 bytes from program flash IFR or version ID */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_PGM_U32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x06U, /* Program 4 bytes in a program flash block */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_ERASE_FLASH_SECTOR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x09U, /* Erase all bytes in a program flash sector */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_READ_1s_ALL_BLOCKS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x40U, /* Verify that the program flash block is erased then release MCU security */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_READ_ONCE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x41U, /* Read 4 bytes of a dedicated 64 byte field in the program flash 0 IFR */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_PGM_ONCE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x43U, /* One-time program of 4 bytes of a dedicated 64-byte field in the program flash 0 IFR */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_PGM_ERASE_ALL_BLOCKS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x44U, /* Erase the program flash block, verify-erase and release MCU security.&amp;nbsp; Only possible when all memory locations are unprotected */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_VERIFY_BACKDOOR_ACCES_KEY = 0x45U, /* Release MCU security after comparing a set of user supplied security keys to those stored in the program flash */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_ERROR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0xFFU&amp;nbsp; /* Unknown Error.&amp;nbsp; Indicates some error in flash processing.&amp;nbsp; Used by higher level flash manipulations like valuestore functions */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; enum FTFA_MARGINS{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FMARGIN_NORMAL,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FMARGIN_USER,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FMARGIN_FACTORY&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;&lt;P&gt;#define FCMD_PGM_U32_MARGIN_FAILURE (0x80000000UL)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; enum FTFA_RESOURCES{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FRSC_IFR, /* 256 bytes 0x00_0000 -&amp;gt; 0x00_00FF */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FRSC_ID&amp;nbsp;&amp;nbsp; /*&amp;nbsp;&amp;nbsp; 8 bytes 0x00_0000 -&amp;gt; 0x00_0007 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;&lt;P&gt;#endif /* #if defined( MCU_MKL25Z4 ) */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Push current alignment rules to internal compiler stack then&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * force 1-byte alignment boundary:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;#pragma pack(push,1)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Flash Common Command Object (FCCOB):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * The FCCOB register group uses a Big Endian addressing&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * convention. For all command parameter fields larger than one&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * byte, the most significant data resides in the lowest FCCOB&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * register number.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; typedef union /* MISRA deviation */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB_ary_u8[ 12U ];&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct /* As bytes: */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB3_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0x4 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB2_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0x5 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB1_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0x6 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB0_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0x7 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB7_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0x8 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB6_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0x9 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB5_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0xA */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB4_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0xB */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOBB_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0xC */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOBA_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0xD */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB9_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0xE */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB8_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0xF */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }FTFA_regs_8;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct /* As uint32: */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t FCCOB3210_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t FCCOB7654_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t FCCOBBA98_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }FTFA_regs_32;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; }FLASH_COMMAND_OBJ;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; Command Object is copied directly to hardware via the&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; Flash_CMD_in_RAM therefore the definition of structures&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; requiring tight packing, to match the underlying hardware that&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; will not have possible structure padding:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; EXTERN_FLASH_KINETIS FLASH_COMMAND_OBJ flash_cmd_obj;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; /* Restore original alignment rules from stack: */&lt;/P&gt;&lt;P&gt;#pragma pack(pop)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; uint32_t flash_cmd_in_ram( void ) __attribute__ ((long_call, section (".flash_cmd"))); /* Place in .data section of RAM */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; uint32_t flash_erase_sector(&amp;nbsp; uint32_t const *dst_adr_u32 );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; uint32_t flash_one_u32(&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t const *dst_adr_u32, uint32_t const data_value_u32 );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; uint32_t flash_pgm_block_u32( uint32_t const *dst_adr_u32, uint32_t const *src_adr_u32, uint32_t const size_u32_in );&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * The first four bytes returned are the flash parameter revision,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * and the second four bytes are the flash version ID:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; uint32_t flash_read_id( uint8_t *const id_adr_u8 );&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#if defined(__cplusplus) &amp;amp;&amp;amp; __cplusplus&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#endif /* _FLASH_KINETIS_H_ */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*lint -restore */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/** @(#)flash_kinetis.c&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;08-Oct-2013 14:13:04 Bob Paddock&amp;gt;&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \date Last Time-stamp: &amp;lt;19-Oct-2015 08:14:02 bob p&amp;gt;&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \file flash_kinetis.c&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \brief&amp;nbsp; Commands to erase/program Flash.&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; * Note!: CCIF: Depending on how quickly the read occurs after reset&lt;/P&gt;&lt;P&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; release, the user may or may not see the 0 [busy] hardware&lt;/P&gt;&lt;P&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reset value.&lt;/P&gt;&lt;P&gt; */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*lint -save */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#include "compiler.h"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#define&amp;nbsp; DEFINE_SPACE_FLASH_KINETIS_H (1)&lt;/P&gt;&lt;P&gt;#include "flash_kinetis.h"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;uint32_t flash_read_id( uint8_t *const id_adr_u8 )&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOB3210_u32 = 0UL;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB8_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FRSC_ID;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB0_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FCMD_READ_RSC; /* Read ID resource */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t status_u32 = flash_cmd_in_ram();&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( FCMD_OK != status_u32 )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return( status_u32 ); /* ID read failed */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Flash parameter revision: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[0U] = FTFA_FCCOB4;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[1U] = FTFA_FCCOB5;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[2U] = FTFA_FCCOB6;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[3U] = FTFA_FCCOB7;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOB3210_u32 = 4UL;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB0_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FCMD_READ_RSC; /* Read ID resource */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; status_u32 = flash_cmd_in_ram();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Flash version ID: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[4U] = FTFA_FCCOB4;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[5U] = FTFA_FCCOB5;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[6U] = FTFA_FCCOB6;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[7U] = FTFA_FCCOB7;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return( status_u32 );&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;uint32_t flash_erase_sector( uint32_t const *dst_adr_u32 )&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOB3210_u32 = ((uint32_t) dst_adr_u32 &amp;amp; ~(FLASH_SECTOR_SIZE - 1U)); /* Align requested address to start of sector boundary */&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB0_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FCMD_ERASE_FLASH_SECTOR;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return( flash_cmd_in_ram() );&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*&lt;/P&gt;&lt;P&gt; * The supplied address must be longword aligned (the lowest two bits of the byte address&lt;/P&gt;&lt;P&gt; * must be 00):&lt;/P&gt;&lt;P&gt; *&amp;nbsp; • Byte 3 data is written to the supplied byte address ('start'),&lt;/P&gt;&lt;P&gt; *&amp;nbsp; • Byte 2 data is programmed to byte address start+0b01,&lt;/P&gt;&lt;P&gt; *&amp;nbsp; • Byte 1 data is programmed to byte address start+0b10,&lt;/P&gt;&lt;P&gt; *&amp;nbsp; • Byte 0 data is programmed to byte address start+0b11.&lt;/P&gt;&lt;P&gt; */&lt;/P&gt;&lt;P&gt;uint32_t flash_one_u32( uint32_t const *dst_adr_u32, uint32_t const data_value_u32 )&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOB3210_u32 = (uint32_t) dst_adr_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOB7654_u32 = data_value_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB0_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FCMD_PGM_U32;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t status_u32 = flash_cmd_in_ram();&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( FCMD_OK != status_u32 )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return( status_u32 ); /* Flash write failed */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; /* Verify the written data a user margin levels: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOB3210_u32 = (uint32_t) dst_adr_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOBBA98_u32 = data_value_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB4_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FMARGIN_USER;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB0_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FCMD_PGM_CHECK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; status_u32&amp;nbsp; = flash_cmd_in_ram();&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( FCMD_OK != status_u32 )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status_u32 |= FCMD_PGM_U32_MARGIN_FAILURE; /* Indicate this is a verification error not a flash write error */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return( status_u32 );&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/********************************************************&lt;/P&gt;&lt;P&gt;*&lt;/P&gt;&lt;P&gt;* Proram a block of uint32_t's:&lt;/P&gt;&lt;P&gt;*&lt;/P&gt;&lt;P&gt;********************************************************/&lt;/P&gt;&lt;P&gt;uint32_t flash_pgm_block_u32( uint32_t const *dst_adr_u32, uint32_t const *src_adr_u32, uint32_t const size_u32_in )&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t const *d_adr_u32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = dst_adr_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t size_u32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = size_u32_in;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t return_val_u32 = FCMD_OK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; while( 0UL != size_u32-- )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return_val_u32 = flash_one_u32( d_adr_u32, *src_adr_u32++ );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( FCMD_OK != return_val_u32 )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break; /* while() */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; d_adr_u32 += 4UL;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return( return_val_u32 );&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*lint -restore */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/** @(#)flash_kinetis_cmd.c &amp;lt;09-Oct-2013 14:24:33 Bob Paddock&amp;gt;&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \date Last Time-stamp:&amp;nbsp; &amp;lt;19-Oct-2015 08:15:00 bob p&amp;gt;&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \file flash_kinetis_cmd.c&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \brief&amp;nbsp; Command executing in RAM to modify Flash.&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*lint -save */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#include "compiler.h"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#include "flash_kinetis.h"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* Suppress warning of casting &amp;amp;(FTFA_BASE_PTR-&amp;gt;FCCOB3) to uint8_t pointer: */&lt;/P&gt;&lt;P&gt;#pragma GCC diagnostic push&lt;/P&gt;&lt;P&gt;#pragma GCC diagnostic ignored "-Wcast-qual" /* There is a bug in GCC versions less than 4.8.5 giving this bogus error */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*&lt;/P&gt;&lt;P&gt; * 'flash_cmd_in_ram()' is declared long_call and is put in its own RAM&lt;/P&gt;&lt;P&gt; * section via the custom linker script.&amp;nbsp; It is copied there via&lt;/P&gt;&lt;P&gt; * custom code in vectors.c at power up.&lt;/P&gt;&lt;P&gt; */&lt;/P&gt;&lt;P&gt;uint32_t flash_cmd_in_ram( void )&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint8_t *flash_cmd_obj_reg_u8_p = (uint8_t *) &amp;amp;(FTFA_BASE_PTR-&amp;gt;FCCOB3);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Wait while CCIF bit shows busy: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; while( 0U == (FTFA_FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK) )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nop();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Clear RDCOLERR, ACCERR and FPVIOL flag in flash status register: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; FTFA_FSTAT = (FTFA_FSTAT_RDCOLERR_MASK | FTFA_FSTAT_ACCERR_MASK | FTFA_FSTAT_FPVIOL_MASK);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Copy object buffer to real FCCOB registers: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; for( uint_fast16_t idx = 0U; idx &amp;lt; sizeof( flash_cmd_obj ); ++idx )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *flash_cmd_obj_reg_u8_p++ = flash_cmd_obj.FCCOB_ary_u8[ idx ];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; irq_disable(); /* We are about to pull the rug out from under any running IRQs, so disable any IRQs to prevent system crash */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Start the command: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; FTFA_FSTAT |= FTFA_FSTAT_CCIF_MASK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Wait while flash command completes: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; while( 0U == (FTFA_FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK) )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nop();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; irq_enable(); /* Flash command has completed, safe to enable IRQs now */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return( (FTFA_FSTAT &amp;amp; (FTFA_FSTAT_RDCOLERR_MASK | FTFA_FSTAT_ACCERR_MASK | FTFA_FSTAT_FPVIOL_MASK | FTFA_FSTAT_MGSTAT0_MASK) ) );&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#pragma GCC diagnostic pop&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*lint -restore */&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 19 Oct 2015 12:34:06 GMT</pubDate>
    <dc:creator>bobpaddock</dc:creator>
    <dc:date>2015-10-19T12:34:06Z</dc:date>
    <item>
      <title>Storing data in non volatile memory on KL43</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414382#M23562</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I am willing to save some program data in a non volatile memory on the board.&lt;/P&gt;&lt;P&gt;However, as I see KL43 does not have the EEPROM memory.&lt;/P&gt;&lt;P&gt;My question is: &lt;SPAN style="text-decoration: underline;"&gt;What to do if I want my configuration data to remain intact after powering off the device?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;EDIT:&lt;/STRONG&gt; I see that there is something like FlexMemory, however, I can't find if it is available in my board.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 28 Sep 2015 11:55:54 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414382#M23562</guid>
      <dc:creator>piotrcerba</dc:creator>
      <dc:date>2015-09-28T11:55:54Z</dc:date>
    </item>
    <item>
      <title>Re: Storing data in non volatile memory on KL43</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414383#M23563</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You can write to any long word in the Flash so you can save parameters etc. anywhere (within reason) in the chip's Flash memory.&lt;/P&gt;&lt;P&gt;The KL43 doesn't have EEPROM or FlexMemory but this is also not needed for most such usage.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Kinetis: &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="http://www.utasker.com/kinetis.html" rel="nofollow"&gt;http://www.utasker.com/kinetis.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;KL43: &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="http://www.utasker.com/kinetis/FRDM-KL43Z.html" rel="nofollow"&gt;http://www.utasker.com/kinetis/FRDM-KL43Z.html&lt;/A&gt;&lt;SPAN&gt; / &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="http://www.utasker.com/kinetis/TWR-KL43Z48M.html" rel="nofollow"&gt;http://www.utasker.com/kinetis/TWR-KL43Z48M.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;For the complete "out-of-the-box" Kinetis experience and faster time to market&lt;/EM&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 28 Sep 2015 14:56:28 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414383#M23563</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2015-09-28T14:56:28Z</dc:date>
    </item>
    <item>
      <title>Re: Storing data in non volatile memory on KL43</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414384#M23564</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Good to know :smileyhappy:&lt;/P&gt;&lt;P&gt;Can you give me some more information on how to approach this topic? What instructions/keywords do I need to use&amp;nbsp; to program my board so that it stores some data after power-off? What are the limitations?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 28 Sep 2015 16:25:34 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414384#M23564</guid>
      <dc:creator>piotrcerba</dc:creator>
      <dc:date>2015-09-28T16:25:34Z</dc:date>
    </item>
    <item>
      <title>Re: Storing data in non volatile memory on KL43</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414385#M23565</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You can get full information in chapter 46 of the KL43's users manual.&lt;/P&gt;&lt;P&gt;Basically you need to program values as long word - you can only program a long word once without erasing the 2k sector that it is in. Maximum 10k cycles with 5 years data retention (see the data sheet 3.4.1.4).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;There are many sources for such code but I have attached the uTasker Flash interface as reference, that realises a fail-safe parameter system in the Flash and supports K, KL and KE Flash types.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Kinetis: &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="http://www.utasker.com/kinetis.html" rel="nofollow"&gt;http://www.utasker.com/kinetis.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;KL43: &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="http://www.utasker.com/kinetis/FRDM-KL43Z.html" rel="nofollow"&gt;http://www.utasker.com/kinetis/FRDM-KL43Z.html&lt;/A&gt;&lt;SPAN&gt; / &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="http://www.utasker.com/kinetis/TWR-KL43Z48M.html" rel="nofollow"&gt;http://www.utasker.com/kinetis/TWR-KL43Z48M.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;For the complete "out-of-the-box" Kinetis experience and faster time to market&lt;/EM&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 28 Sep 2015 21:24:42 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414385#M23565</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2015-09-28T21:24:42Z</dc:date>
    </item>
    <item>
      <title>Re: Storing data in non volatile memory on KL43</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414386#M23566</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Piotr Cerba:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You can also download KSDK and use the available flash driver: &lt;A href="http://www.freescale.com/tools/embedded-software-and-tools/run-time-software/kinetis-software-and-tools/development-platforms-with-mbed/software-development-kit-for-kinetis-mcus:KINETIS-SDK?tid=redKINETIS_SDK" title="http://www.freescale.com/tools/embedded-software-and-tools/run-time-software/kinetis-software-and-tools/development-platforms-with-mbed/software-development-kit-for-kinetis-mcus:KINETIS-SDK?tid=redKINETIS_SDK"&gt;Software Development Kit for Kinetis MCUs|Freescale&lt;/A&gt; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Once installed you would find project examples for the flash routines in these paths:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;C:\Freescale\KSDK_1.2.0\examples\frdmkl43z\demo_apps\flash_demo&lt;/P&gt;&lt;P&gt;C:\Freescale\KSDK_1.2.0\examples\frdmkl43z\driver_examples\flash&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards!&lt;/P&gt;&lt;P&gt;Jorge Gonzalez&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 Sep 2015 16:55:00 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414386#M23566</guid>
      <dc:creator>Jorge_Gonzalez</dc:creator>
      <dc:date>2015-09-29T16:55:00Z</dc:date>
    </item>
    <item>
      <title>Re: Storing data in non volatile memory on KL43</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414387#M23567</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Despite looking into both KDSK projects - I can't find a proper function to write/program longword what Mark has mentioned.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Am I missing something?&lt;/P&gt;&lt;P&gt;Which of the functions from those example apps can be used for storing data in non-volatile part of Flash?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 18 Oct 2015 21:26:26 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414387#M23567</guid>
      <dc:creator>piotrcerba</dc:creator>
      <dc:date>2015-10-18T21:26:26Z</dc:date>
    </item>
    <item>
      <title>Re: Storing data in non volatile memory on KL43</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414388#M23568</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Is there a way to attach a .zip file?&amp;nbsp; Can't find it and 'Advance Editor' is not coming up (Again :-(&amp;nbsp; This system always hoses my code posts. :-( ).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here are the functions you need.&amp;nbsp; It won't compile directly because of missing .h files (from the .zip file).&lt;/P&gt;&lt;P&gt;Mostly add #include &amp;lt;stdint.h&amp;gt; .&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I wrote this for the KL27 a child of the KL43.&amp;nbsp; Add defines for KL43 and it should work with no other changes.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/** @(#)flash_kinetis.h &amp;lt;08-Oct-2013 13:49:11 Bob Paddock&amp;gt;&lt;/P&gt;&lt;P&gt; *&amp;nbsp; Last Time-stamp:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;19-Oct-2015 08:14:41 bob p&amp;gt;&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \file flash_kinetis.h&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \brief&amp;nbsp; Commands to erase/program Flash.&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; * Note!: CCIF: Depending on how quickly the read occurs after reset&lt;/P&gt;&lt;P&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; release, the user may or may not see the 0 [busy] hardware&lt;/P&gt;&lt;P&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reset value.&lt;/P&gt;&lt;P&gt; */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*lint -save -e755 -e756 Disable warning(s), this file only, global macro/typedef 'Symbol' (Location) not referenced */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#ifndef _FLASH_KINETIS_H_&lt;/P&gt;&lt;P&gt;#define _FLASH_KINETIS_H_ (1)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#ifdef&amp;nbsp; DEFINE_SPACE_FLASH_KINETIS_H&lt;/P&gt;&lt;P&gt;#define EXTERN_FLASH_KINETIS&lt;/P&gt;&lt;P&gt;#else&lt;/P&gt;&lt;P&gt;#define EXTERN_FLASH_KINETIS extern&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#if defined(__cplusplus) &amp;amp;&amp;amp; __cplusplus&lt;/P&gt;&lt;P&gt; extern "C" {&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#if( defined (MCU_MKL25Z4) || defined(MCU_MKL26Z4) || defined(MCU_MKL27Z4) )&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#define FLASH_SECTOR_SIZE (1024UL) /* The smallest portion of the program flash memory (consecutive addresses) that can be erased */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; enum FTFA_CMDS{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_OK&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00U, /* Command completed without error */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_READ_1s_SECTION&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x01U, /* Verify that a given number of program flash locations from a starting address are erased */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_PGM_CHECK&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x02U, /* Tests previously-programmed locations at margin read levels */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_READ_RSC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x03U, /* Read 4 bytes from program flash IFR or version ID */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_PGM_U32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x06U, /* Program 4 bytes in a program flash block */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_ERASE_FLASH_SECTOR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x09U, /* Erase all bytes in a program flash sector */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_READ_1s_ALL_BLOCKS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x40U, /* Verify that the program flash block is erased then release MCU security */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_READ_ONCE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x41U, /* Read 4 bytes of a dedicated 64 byte field in the program flash 0 IFR */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_PGM_ONCE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x43U, /* One-time program of 4 bytes of a dedicated 64-byte field in the program flash 0 IFR */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_PGM_ERASE_ALL_BLOCKS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x44U, /* Erase the program flash block, verify-erase and release MCU security.&amp;nbsp; Only possible when all memory locations are unprotected */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_VERIFY_BACKDOOR_ACCES_KEY = 0x45U, /* Release MCU security after comparing a set of user supplied security keys to those stored in the program flash */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCMD_ERROR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0xFFU&amp;nbsp; /* Unknown Error.&amp;nbsp; Indicates some error in flash processing.&amp;nbsp; Used by higher level flash manipulations like valuestore functions */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; enum FTFA_MARGINS{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FMARGIN_NORMAL,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FMARGIN_USER,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FMARGIN_FACTORY&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;&lt;P&gt;#define FCMD_PGM_U32_MARGIN_FAILURE (0x80000000UL)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; enum FTFA_RESOURCES{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FRSC_IFR, /* 256 bytes 0x00_0000 -&amp;gt; 0x00_00FF */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FRSC_ID&amp;nbsp;&amp;nbsp; /*&amp;nbsp;&amp;nbsp; 8 bytes 0x00_0000 -&amp;gt; 0x00_0007 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;&lt;P&gt;#endif /* #if defined( MCU_MKL25Z4 ) */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Push current alignment rules to internal compiler stack then&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * force 1-byte alignment boundary:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;#pragma pack(push,1)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Flash Common Command Object (FCCOB):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * The FCCOB register group uses a Big Endian addressing&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * convention. For all command parameter fields larger than one&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * byte, the most significant data resides in the lowest FCCOB&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * register number.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; typedef union /* MISRA deviation */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB_ary_u8[ 12U ];&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct /* As bytes: */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB3_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0x4 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB2_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0x5 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB1_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0x6 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB0_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0x7 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB7_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0x8 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB6_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0x9 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB5_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0xA */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB4_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0xB */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOBB_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0xC */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOBA_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0xD */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB9_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0xE */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t FCCOB8_u8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&amp;lt; Flash Common Command Object Registers, offset: 0xF */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }FTFA_regs_8;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct /* As uint32: */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t FCCOB3210_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t FCCOB7654_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t FCCOBBA98_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }FTFA_regs_32;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; }FLASH_COMMAND_OBJ;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; Command Object is copied directly to hardware via the&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; Flash_CMD_in_RAM therefore the definition of structures&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; requiring tight packing, to match the underlying hardware that&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp; will not have possible structure padding:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; EXTERN_FLASH_KINETIS FLASH_COMMAND_OBJ flash_cmd_obj;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; /* Restore original alignment rules from stack: */&lt;/P&gt;&lt;P&gt;#pragma pack(pop)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; uint32_t flash_cmd_in_ram( void ) __attribute__ ((long_call, section (".flash_cmd"))); /* Place in .data section of RAM */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; uint32_t flash_erase_sector(&amp;nbsp; uint32_t const *dst_adr_u32 );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; uint32_t flash_one_u32(&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t const *dst_adr_u32, uint32_t const data_value_u32 );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; uint32_t flash_pgm_block_u32( uint32_t const *dst_adr_u32, uint32_t const *src_adr_u32, uint32_t const size_u32_in );&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * The first four bytes returned are the flash parameter revision,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * and the second four bytes are the flash version ID:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; uint32_t flash_read_id( uint8_t *const id_adr_u8 );&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#if defined(__cplusplus) &amp;amp;&amp;amp; __cplusplus&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#endif /* _FLASH_KINETIS_H_ */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*lint -restore */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/** @(#)flash_kinetis.c&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;08-Oct-2013 14:13:04 Bob Paddock&amp;gt;&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \date Last Time-stamp: &amp;lt;19-Oct-2015 08:14:02 bob p&amp;gt;&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \file flash_kinetis.c&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \brief&amp;nbsp; Commands to erase/program Flash.&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; * Note!: CCIF: Depending on how quickly the read occurs after reset&lt;/P&gt;&lt;P&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; release, the user may or may not see the 0 [busy] hardware&lt;/P&gt;&lt;P&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reset value.&lt;/P&gt;&lt;P&gt; */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*lint -save */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#include "compiler.h"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#define&amp;nbsp; DEFINE_SPACE_FLASH_KINETIS_H (1)&lt;/P&gt;&lt;P&gt;#include "flash_kinetis.h"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;uint32_t flash_read_id( uint8_t *const id_adr_u8 )&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOB3210_u32 = 0UL;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB8_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FRSC_ID;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB0_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FCMD_READ_RSC; /* Read ID resource */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t status_u32 = flash_cmd_in_ram();&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( FCMD_OK != status_u32 )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return( status_u32 ); /* ID read failed */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Flash parameter revision: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[0U] = FTFA_FCCOB4;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[1U] = FTFA_FCCOB5;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[2U] = FTFA_FCCOB6;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[3U] = FTFA_FCCOB7;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOB3210_u32 = 4UL;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB0_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FCMD_READ_RSC; /* Read ID resource */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; status_u32 = flash_cmd_in_ram();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Flash version ID: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[4U] = FTFA_FCCOB4;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[5U] = FTFA_FCCOB5;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[6U] = FTFA_FCCOB6;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id_adr_u8[7U] = FTFA_FCCOB7;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return( status_u32 );&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;uint32_t flash_erase_sector( uint32_t const *dst_adr_u32 )&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOB3210_u32 = ((uint32_t) dst_adr_u32 &amp;amp; ~(FLASH_SECTOR_SIZE - 1U)); /* Align requested address to start of sector boundary */&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB0_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FCMD_ERASE_FLASH_SECTOR;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return( flash_cmd_in_ram() );&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*&lt;/P&gt;&lt;P&gt; * The supplied address must be longword aligned (the lowest two bits of the byte address&lt;/P&gt;&lt;P&gt; * must be 00):&lt;/P&gt;&lt;P&gt; *&amp;nbsp; • Byte 3 data is written to the supplied byte address ('start'),&lt;/P&gt;&lt;P&gt; *&amp;nbsp; • Byte 2 data is programmed to byte address start+0b01,&lt;/P&gt;&lt;P&gt; *&amp;nbsp; • Byte 1 data is programmed to byte address start+0b10,&lt;/P&gt;&lt;P&gt; *&amp;nbsp; • Byte 0 data is programmed to byte address start+0b11.&lt;/P&gt;&lt;P&gt; */&lt;/P&gt;&lt;P&gt;uint32_t flash_one_u32( uint32_t const *dst_adr_u32, uint32_t const data_value_u32 )&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOB3210_u32 = (uint32_t) dst_adr_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOB7654_u32 = data_value_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB0_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FCMD_PGM_U32;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t status_u32 = flash_cmd_in_ram();&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( FCMD_OK != status_u32 )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return( status_u32 ); /* Flash write failed */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; /* Verify the written data a user margin levels: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOB3210_u32 = (uint32_t) dst_adr_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_32.FCCOBBA98_u32 = data_value_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB4_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FMARGIN_USER;&lt;/P&gt;&lt;P&gt;&amp;nbsp; flash_cmd_obj.FTFA_regs_8.FCCOB0_u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint8_t) FCMD_PGM_CHECK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; status_u32&amp;nbsp; = flash_cmd_in_ram();&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( FCMD_OK != status_u32 )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status_u32 |= FCMD_PGM_U32_MARGIN_FAILURE; /* Indicate this is a verification error not a flash write error */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return( status_u32 );&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/********************************************************&lt;/P&gt;&lt;P&gt;*&lt;/P&gt;&lt;P&gt;* Proram a block of uint32_t's:&lt;/P&gt;&lt;P&gt;*&lt;/P&gt;&lt;P&gt;********************************************************/&lt;/P&gt;&lt;P&gt;uint32_t flash_pgm_block_u32( uint32_t const *dst_adr_u32, uint32_t const *src_adr_u32, uint32_t const size_u32_in )&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t const *d_adr_u32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = dst_adr_u32;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t size_u32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = size_u32_in;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t return_val_u32 = FCMD_OK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; while( 0UL != size_u32-- )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return_val_u32 = flash_one_u32( d_adr_u32, *src_adr_u32++ );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( FCMD_OK != return_val_u32 )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break; /* while() */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; d_adr_u32 += 4UL;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return( return_val_u32 );&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*lint -restore */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/** @(#)flash_kinetis_cmd.c &amp;lt;09-Oct-2013 14:24:33 Bob Paddock&amp;gt;&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \date Last Time-stamp:&amp;nbsp; &amp;lt;19-Oct-2015 08:15:00 bob p&amp;gt;&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \file flash_kinetis_cmd.c&lt;/P&gt;&lt;P&gt; *&amp;nbsp; \brief&amp;nbsp; Command executing in RAM to modify Flash.&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*lint -save */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#include "compiler.h"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#include "flash_kinetis.h"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* Suppress warning of casting &amp;amp;(FTFA_BASE_PTR-&amp;gt;FCCOB3) to uint8_t pointer: */&lt;/P&gt;&lt;P&gt;#pragma GCC diagnostic push&lt;/P&gt;&lt;P&gt;#pragma GCC diagnostic ignored "-Wcast-qual" /* There is a bug in GCC versions less than 4.8.5 giving this bogus error */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*&lt;/P&gt;&lt;P&gt; * 'flash_cmd_in_ram()' is declared long_call and is put in its own RAM&lt;/P&gt;&lt;P&gt; * section via the custom linker script.&amp;nbsp; It is copied there via&lt;/P&gt;&lt;P&gt; * custom code in vectors.c at power up.&lt;/P&gt;&lt;P&gt; */&lt;/P&gt;&lt;P&gt;uint32_t flash_cmd_in_ram( void )&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint8_t *flash_cmd_obj_reg_u8_p = (uint8_t *) &amp;amp;(FTFA_BASE_PTR-&amp;gt;FCCOB3);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Wait while CCIF bit shows busy: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; while( 0U == (FTFA_FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK) )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nop();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Clear RDCOLERR, ACCERR and FPVIOL flag in flash status register: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; FTFA_FSTAT = (FTFA_FSTAT_RDCOLERR_MASK | FTFA_FSTAT_ACCERR_MASK | FTFA_FSTAT_FPVIOL_MASK);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Copy object buffer to real FCCOB registers: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; for( uint_fast16_t idx = 0U; idx &amp;lt; sizeof( flash_cmd_obj ); ++idx )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *flash_cmd_obj_reg_u8_p++ = flash_cmd_obj.FCCOB_ary_u8[ idx ];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; irq_disable(); /* We are about to pull the rug out from under any running IRQs, so disable any IRQs to prevent system crash */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Start the command: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; FTFA_FSTAT |= FTFA_FSTAT_CCIF_MASK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Wait while flash command completes: */&lt;/P&gt;&lt;P&gt;&amp;nbsp; while( 0U == (FTFA_FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK) )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nop();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; irq_enable(); /* Flash command has completed, safe to enable IRQs now */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return( (FTFA_FSTAT &amp;amp; (FTFA_FSTAT_RDCOLERR_MASK | FTFA_FSTAT_ACCERR_MASK | FTFA_FSTAT_FPVIOL_MASK | FTFA_FSTAT_MGSTAT0_MASK) ) );&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#pragma GCC diagnostic pop&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*lint -restore */&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 19 Oct 2015 12:34:06 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Storing-data-in-non-volatile-memory-on-KL43/m-p/414388#M23568</guid>
      <dc:creator>bobpaddock</dc:creator>
      <dc:date>2015-10-19T12:34:06Z</dc:date>
    </item>
  </channel>
</rss>

