<?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: How to read flash data in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/How-to-read-flash-data/m-p/794252#M48337</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Xiangjun,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have some error in the code in the email before.&lt;/P&gt;&lt;P&gt;Here again my code, please advise.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//program 1 kbyte 256 longword&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static uint8_t      gCopy1K[1024];   //1K of Flash sector&lt;/P&gt;&lt;P&gt;#define FlashStoreStart  (0x00FC00u)&lt;/P&gt;&lt;P&gt; volatile uint32_t *const FLASH_Addr = (volatile uint32_t *)&amp;amp;(FTFA-&amp;gt;FCCOB3);&lt;/P&gt;&lt;P&gt;#define Program4Byte        0x06&lt;/P&gt;&lt;P&gt;#define Erase1Sector        0x09&lt;/P&gt;&lt;P&gt;#define Read1sSection      0x01&lt;/P&gt;&lt;P&gt;static uint16_t      gFlashOffset;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;status_t flash_write(void)//const void *src, size_t nbytes)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;  // In order to write to flash: system must be in Run mode (not Vlpr) and&lt;/P&gt;&lt;P&gt;  // interrupts must be disabled.&lt;/P&gt;&lt;P&gt;       uint8_t  TestByte;&lt;/P&gt;&lt;P&gt;       uint16_t Offset=0;&lt;/P&gt;&lt;P&gt;       uint8_t status;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;       __disable_irq();&lt;/P&gt;&lt;P&gt;       for(Offset=0; Offset&amp;lt;0x400; Offset+=4)  //1024/4 times&lt;/P&gt;&lt;P&gt;       {&lt;/P&gt;&lt;P&gt;              TestByte =FTFA-&amp;gt;FSTAT;&lt;/P&gt;&lt;P&gt;              while((FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK)==0){};  //CCIF =1?&lt;/P&gt;&lt;P&gt;              if((TestByte &amp;amp; 0x30)&amp;gt;0)FTFA-&amp;gt;FSTAT |=0x30;  //write '1' to clear&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FCCOB0 =Program4Byte;&lt;/P&gt;&lt;P&gt;              *FLASH_Addr = FlashStoreStart+Offset;&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FPROT0=0x80; //highest section 2K byte&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FPROT1=0x00;&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FPROT2=0x00;&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FPROT3=0x00;&lt;/P&gt;&lt;P&gt;              &lt;STRONG&gt;(FLASH_Addr) =&lt;/STRONG&gt;(gCopy1K+Offset);  //copy 4 bytes&lt;/P&gt;&lt;P&gt;              &lt;STRONG&gt;(FLASH_Addr+1) =&lt;/STRONG&gt;(gCopy1K&lt;EM&gt;Offset&lt;/EM&gt;1);&lt;/P&gt;&lt;P&gt;              &lt;STRONG&gt;(FLASH_Addr+2) =&lt;/STRONG&gt;(gCopy1K&lt;EM&gt;Offset&lt;/EM&gt;2);&lt;/P&gt;&lt;P&gt;              &lt;STRONG&gt;(FLASH_Addr+3) =&lt;/STRONG&gt;(gCopy1K&lt;EM&gt;Offset&lt;/EM&gt;3);&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FSTAT |=FTFA_FSTAT_CCIF_MASK; //Start execution&lt;/P&gt;&lt;P&gt;              while((FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK) ==0){};&lt;/P&gt;&lt;P&gt;       }&lt;/P&gt;&lt;P&gt;   FTFA-&amp;gt;FPROT0=0x00; // turn off the highest section 2K byte&lt;/P&gt;&lt;P&gt;   status=(FTFA-&amp;gt;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;  __enable_irq();&lt;/P&gt;&lt;P&gt;  return status;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// and the Erase 1 sector:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;status_t Flash_Erase(void) //const void *sec)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;       uint8_t  TestByte;&lt;/P&gt;&lt;P&gt;       TestByte =FTFA-&amp;gt;FSTAT;&lt;/P&gt;&lt;P&gt;       while((FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK) ==0){};  //CCIF =1?&lt;/P&gt;&lt;P&gt;       if((TestByte &amp;amp; 0x30)&amp;gt;0)FTFA-&amp;gt;FSTAT |=0x30;  //write '1' to clear&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCOB0 =Erase1Sector;&lt;/P&gt;&lt;P&gt;       *FLASH_Addr =FlashStoreStart;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB1 =0x00;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB2 =0xFC;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB3 =0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FPROT0=0x80; //highest section 2K byte&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FPROT1=0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FPROT2=0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FPROT3=0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FSTAT |=FTFA_FSTAT_CCIF_MASK; //Start Erase&lt;/P&gt;&lt;P&gt;       while((FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK) ==0){};&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCOB0 =Read1sSection;&lt;/P&gt;&lt;P&gt;       *FLASH_Addr =FlashStoreStart;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB1 =0x00;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB2 =0xFC;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB3 =0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCOB4 =0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCOB5 =0x01;  // 256 longword&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCOB6 =0x00;   //Norm margin level&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FSTAT |=FTFA_FSTAT_CCIF_MASK; //Start&lt;/P&gt;&lt;P&gt;       while((FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK) ==0);&lt;/P&gt;&lt;P&gt;       if((FTFA-&amp;gt;FSTAT &amp;amp; 0x01)!=0)return 1;&lt;/P&gt;&lt;P&gt;       else return 0;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Than you in advance.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Albert Zhou&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Electronics Engineer&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Sensorex Corp.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 31 Jul 2018 17:12:31 GMT</pubDate>
    <dc:creator>albert_zhou</dc:creator>
    <dc:date>2018-07-31T17:12:31Z</dc:date>
    <item>
      <title>How to read flash data</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/How-to-read-flash-data/m-p/794249#M48334</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I would like to know how to read a flash memory data (NVM) data for KL27 sum-family? what is the FCCOB1-3 Flash Address[23:16] -Address[7:0]?&amp;nbsp;&lt;/P&gt;&lt;P&gt;When write to Flash memory, what is the flash memory address[23:16] -[7:0] should be set to for 64K KL27 chip?&lt;/P&gt;&lt;P&gt;Does the program write could be 4 bytes a time or 1k bytes (whole sector)a time?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 27 Jul 2018 20:56:04 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/How-to-read-flash-data/m-p/794249#M48334</guid>
      <dc:creator>albert_zhou</dc:creator>
      <dc:date>2018-07-27T20:56:04Z</dc:date>
    </item>
    <item>
      <title>Re: How to read flash data</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/How-to-read-flash-data/m-p/794250#M48335</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi, Albert,&lt;/P&gt;&lt;P&gt;Regarding your question to read flash, as you know that the flash reading is the same as SRAM, because the Cortex-M0 uses unified address for program and data, it is okay to read it with an address.&lt;/P&gt;&lt;P&gt;for example,&lt;/P&gt;&lt;P&gt;unsigned int * point=0x2000;&lt;/P&gt;&lt;P&gt;unsigned int temp;&lt;/P&gt;&lt;P&gt;temp=*point;&lt;/P&gt;&lt;P&gt;the 32 bits data in addrss 0x2000 is copied to temp variable.&lt;/P&gt;&lt;P&gt;The FCCOB1-3 is a group of register for the FTFA flash module, for example, you want to program a long words to a specific address, in the case, you can write the specic address to the FCCOB1-3, the long words to FCCOB4-B, write command to FCCOB0, then&amp;nbsp; writing 1 to FSTAT[CCIF] will launch a state machine to write flash.&lt;/P&gt;&lt;P&gt;whether you write two bytes or 4 bytes is dependent on the command type in FCCOB0.&lt;/P&gt;&lt;P&gt;Hope it can help you&lt;/P&gt;&lt;P&gt;BR&lt;/P&gt;&lt;P&gt;Xiangjun Rong&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 31 Jul 2018 08:59:13 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/How-to-read-flash-data/m-p/794250#M48335</guid>
      <dc:creator>xiangjun_rong</dc:creator>
      <dc:date>2018-07-31T08:59:13Z</dc:date>
    </item>
    <item>
      <title>Re: How to read flash data</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/How-to-read-flash-data/m-p/794251#M48336</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Xiangjun,&lt;/P&gt;&lt;P&gt;Thank you for your reply. It helps me a lot.&lt;/P&gt;&lt;P&gt;I have question for program long word:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;1.       Should I erase a sector (1024 bytes) first before program longword? And I need turn on one bit of FPROTx for unlock the protection?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;2.       Should I program whole sector (1024 bytes) at once, Otherwise one address could not program two times?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;3.       For a 64K KL27Z64XX, where a location is better for 1K bytes of Calibration Storage? Low end 0x400 or 0xFC00?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;4.       After complete the program longword, should reset FPROTx register?&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 following is my code for program 1024 bytes, please advise:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#define FlashStoreStart  (0x0000FC00u)  //Highest 1K byte&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#define Program4Byte 0x06&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;volatile uint32_t *const FLASH_Addr = (volatile uint32_t *)&amp;amp;(FTFA-&amp;gt;FCCOB3);  //wake FCC0B1-3 a longword address&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static uint8_t      gCopy1K[1024];&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;       uint8_t  TestByte;&lt;/P&gt;&lt;P&gt;       uint16_t Offset;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;       __disable_irq();&lt;/P&gt;&lt;P&gt;       for(Offset=0; Offset&amp;lt;0x400; Offse+4)  //1024/4 times&lt;/P&gt;&lt;P&gt;       {&lt;/P&gt;&lt;P&gt;              TestByte =FTFA-&amp;gt;FSTAT;&lt;/P&gt;&lt;P&gt;              while(FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK ==0);  //CCIF =1?&lt;/P&gt;&lt;P&gt;              if((TestByte &amp;amp; 0x30)&amp;gt;0)FTFA-&amp;gt;FSTAT |=0x30;  //write '1' to clear&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FCCOB0 =Program4Byte;&lt;/P&gt;&lt;P&gt;              FLASH_Addr =FlashStoreStart+Offset;&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FPROT0=0x80; //highest section 2K byte&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FPROT1=0x00;&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FPROT2=0x00;&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FPROT3=0x00;&lt;/P&gt;&lt;P&gt;              &lt;STRONG&gt;(FLASH_Addr) =&lt;/STRONG&gt;(gCopy1K+Offset);  //copy 4 bytes&lt;/P&gt;&lt;P&gt;              &lt;STRONG&gt;(FLASH_Addr+1) =&lt;/STRONG&gt;(gCopy1K&lt;EM&gt;Offset&lt;/EM&gt;1);&lt;/P&gt;&lt;P&gt;              &lt;STRONG&gt;(FLASH_Addr+2) =&lt;/STRONG&gt;(gCopy1K&lt;EM&gt;Offset&lt;/EM&gt;2);&lt;/P&gt;&lt;P&gt;              &lt;STRONG&gt;(FLASH_Addr+3) =&lt;/STRONG&gt;(gCopy1K&lt;EM&gt;Offset&lt;/EM&gt;3);&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FSTAT |=FTFA_FSTAT_CCIF_MAS; //Start execution&lt;/P&gt;&lt;P&gt;              while(FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK ==0);  //CCIF=1?&lt;/P&gt;&lt;P&gt;       }&lt;/P&gt;&lt;P&gt;   FTFA-&amp;gt;FPROT0=0x00; //Why the line here has a warning?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;  __enable_irq();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//========================================&lt;/P&gt;&lt;P&gt;//Code for erase an sector 0XFC00 -0xFF:&lt;/P&gt;&lt;P&gt;status_t Flash_Erase(void) //const void *sec)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;       uint8_t  TestByte;&lt;/P&gt;&lt;P&gt;       TestByte =FTFA-&amp;gt;FSTAT;&lt;/P&gt;&lt;P&gt;       while(FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK ==0);  //CCIF =1?&lt;/P&gt;&lt;P&gt;       if((TestByte &amp;amp; 0x30)&amp;gt;0)FTFA-&amp;gt;FSTAT |=0x30;  //write '1' to clear&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCOB0 =Erase1Sector;&lt;/P&gt;&lt;P&gt;       FLASH_Addr =FlashStoreStart;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB1 =0x00;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB2 =0xFC;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB3 =0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FPROT0=0x80; //highest section 2K byte&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FPROT1=0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FPROT2=0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FPROT3=0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FSTAT |=FTFA_FSTAT_CCIF_MAS; //Start Erase&lt;/P&gt;&lt;P&gt;       while(FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK ==0);&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCOB0 =Read1sSection;&lt;/P&gt;&lt;P&gt;       FLASH_Addr =FlashStoreStart;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB1 =0x00;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB2 =0xFC;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB3 =0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCB4 =0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCB5 =0x01;   // 256 longword&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCB6 =0x00;   //Norm margin level&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FSTAT |=FTFA_FSTAT_CCIF_MAS; //Start&lt;/P&gt;&lt;P&gt;       while(FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK ==0);&lt;/P&gt;&lt;P&gt;       if((FTFA-&amp;gt;FSTAT &amp;amp; 0x01)!=0)return 1;&lt;/P&gt;&lt;P&gt;       else return 0;&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;Best regards,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Albert Zhou&lt;/P&gt;&lt;P&gt;Electronics Engineer&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Sensorex Corp.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 31 Jul 2018 15:23:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/How-to-read-flash-data/m-p/794251#M48336</guid>
      <dc:creator>albert_zhou</dc:creator>
      <dc:date>2018-07-31T15:23:18Z</dc:date>
    </item>
    <item>
      <title>Re: How to read flash data</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/How-to-read-flash-data/m-p/794252#M48337</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Xiangjun,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have some error in the code in the email before.&lt;/P&gt;&lt;P&gt;Here again my code, please advise.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//program 1 kbyte 256 longword&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static uint8_t      gCopy1K[1024];   //1K of Flash sector&lt;/P&gt;&lt;P&gt;#define FlashStoreStart  (0x00FC00u)&lt;/P&gt;&lt;P&gt; volatile uint32_t *const FLASH_Addr = (volatile uint32_t *)&amp;amp;(FTFA-&amp;gt;FCCOB3);&lt;/P&gt;&lt;P&gt;#define Program4Byte        0x06&lt;/P&gt;&lt;P&gt;#define Erase1Sector        0x09&lt;/P&gt;&lt;P&gt;#define Read1sSection      0x01&lt;/P&gt;&lt;P&gt;static uint16_t      gFlashOffset;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;status_t flash_write(void)//const void *src, size_t nbytes)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;  // In order to write to flash: system must be in Run mode (not Vlpr) and&lt;/P&gt;&lt;P&gt;  // interrupts must be disabled.&lt;/P&gt;&lt;P&gt;       uint8_t  TestByte;&lt;/P&gt;&lt;P&gt;       uint16_t Offset=0;&lt;/P&gt;&lt;P&gt;       uint8_t status;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;       __disable_irq();&lt;/P&gt;&lt;P&gt;       for(Offset=0; Offset&amp;lt;0x400; Offset+=4)  //1024/4 times&lt;/P&gt;&lt;P&gt;       {&lt;/P&gt;&lt;P&gt;              TestByte =FTFA-&amp;gt;FSTAT;&lt;/P&gt;&lt;P&gt;              while((FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK)==0){};  //CCIF =1?&lt;/P&gt;&lt;P&gt;              if((TestByte &amp;amp; 0x30)&amp;gt;0)FTFA-&amp;gt;FSTAT |=0x30;  //write '1' to clear&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FCCOB0 =Program4Byte;&lt;/P&gt;&lt;P&gt;              *FLASH_Addr = FlashStoreStart+Offset;&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FPROT0=0x80; //highest section 2K byte&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FPROT1=0x00;&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FPROT2=0x00;&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FPROT3=0x00;&lt;/P&gt;&lt;P&gt;              &lt;STRONG&gt;(FLASH_Addr) =&lt;/STRONG&gt;(gCopy1K+Offset);  //copy 4 bytes&lt;/P&gt;&lt;P&gt;              &lt;STRONG&gt;(FLASH_Addr+1) =&lt;/STRONG&gt;(gCopy1K&lt;EM&gt;Offset&lt;/EM&gt;1);&lt;/P&gt;&lt;P&gt;              &lt;STRONG&gt;(FLASH_Addr+2) =&lt;/STRONG&gt;(gCopy1K&lt;EM&gt;Offset&lt;/EM&gt;2);&lt;/P&gt;&lt;P&gt;              &lt;STRONG&gt;(FLASH_Addr+3) =&lt;/STRONG&gt;(gCopy1K&lt;EM&gt;Offset&lt;/EM&gt;3);&lt;/P&gt;&lt;P&gt;              FTFA-&amp;gt;FSTAT |=FTFA_FSTAT_CCIF_MASK; //Start execution&lt;/P&gt;&lt;P&gt;              while((FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK) ==0){};&lt;/P&gt;&lt;P&gt;       }&lt;/P&gt;&lt;P&gt;   FTFA-&amp;gt;FPROT0=0x00; // turn off the highest section 2K byte&lt;/P&gt;&lt;P&gt;   status=(FTFA-&amp;gt;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;  __enable_irq();&lt;/P&gt;&lt;P&gt;  return status;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// and the Erase 1 sector:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;status_t Flash_Erase(void) //const void *sec)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;       uint8_t  TestByte;&lt;/P&gt;&lt;P&gt;       TestByte =FTFA-&amp;gt;FSTAT;&lt;/P&gt;&lt;P&gt;       while((FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK) ==0){};  //CCIF =1?&lt;/P&gt;&lt;P&gt;       if((TestByte &amp;amp; 0x30)&amp;gt;0)FTFA-&amp;gt;FSTAT |=0x30;  //write '1' to clear&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCOB0 =Erase1Sector;&lt;/P&gt;&lt;P&gt;       *FLASH_Addr =FlashStoreStart;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB1 =0x00;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB2 =0xFC;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB3 =0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FPROT0=0x80; //highest section 2K byte&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FPROT1=0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FPROT2=0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FPROT3=0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FSTAT |=FTFA_FSTAT_CCIF_MASK; //Start Erase&lt;/P&gt;&lt;P&gt;       while((FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK) ==0){};&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCOB0 =Read1sSection;&lt;/P&gt;&lt;P&gt;       *FLASH_Addr =FlashStoreStart;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB1 =0x00;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB2 =0xFC;&lt;/P&gt;&lt;P&gt;       //FTFA-&amp;gt;FCCB3 =0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCOB4 =0x00;&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCOB5 =0x01;  // 256 longword&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FCCOB6 =0x00;   //Norm margin level&lt;/P&gt;&lt;P&gt;       FTFA-&amp;gt;FSTAT |=FTFA_FSTAT_CCIF_MASK; //Start&lt;/P&gt;&lt;P&gt;       while((FTFA-&amp;gt;FSTAT &amp;amp; FTFA_FSTAT_CCIF_MASK) ==0);&lt;/P&gt;&lt;P&gt;       if((FTFA-&amp;gt;FSTAT &amp;amp; 0x01)!=0)return 1;&lt;/P&gt;&lt;P&gt;       else return 0;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Than you in advance.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Albert Zhou&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Electronics Engineer&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Sensorex Corp.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 31 Jul 2018 17:12:31 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/How-to-read-flash-data/m-p/794252#M48337</guid>
      <dc:creator>albert_zhou</dc:creator>
      <dc:date>2018-07-31T17:12:31Z</dc:date>
    </item>
    <item>
      <title>Re: How to read flash data</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/How-to-read-flash-data/m-p/794253#M48338</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P style="color: #51626f; background-color: #ffffff; border: 0px;"&gt;The KL27 writes 32 bit words.&amp;nbsp;&lt;BR /&gt;The flash write must be executed from RAM, as can not write flash from flash.&lt;BR /&gt;Interrupts must be turned off during the write.&lt;/P&gt;&lt;P style="color: #51626f; background-color: #ffffff; border: 0px;"&gt;&lt;BR /&gt;See the attached code.&amp;nbsp; Linker script and startup must move the required section to RAM at boot or before use.&lt;/P&gt;&lt;P style="color: #51626f; background-color: #ffffff; border: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="color: #51626f; background-color: #ffffff; border: 0px;"&gt;There are no special things that need done to read the normal program flash.&lt;/P&gt;&lt;P style="color: #51626f; background-color: #ffffff; border: 0px;"&gt;The attached code shows how to read the special areas.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Real Soon Now I'm going to write a book with practical examples like this of how to actually use this family of parts.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 31 Jul 2018 19:44:39 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/How-to-read-flash-data/m-p/794253#M48338</guid>
      <dc:creator>bobpaddock</dc:creator>
      <dc:date>2018-07-31T19:44:39Z</dc:date>
    </item>
  </channel>
</rss>

