<?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: K64 Programming Flash in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608391#M35929</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Code is working fine.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm using Crossworks for development.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Debug memory view always shows al FF's after a lower flash block write -- even after I ask it to refresh.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;As a debugging aid, I copied the contents of the newly flash memory into a ram array and view it -- and it shows it programmed properly so I have a tool issue - not a code issue.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Tools are meant to help you with problems, NOT be the source of problems.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks for all for help and comments -- Now I have a tool issue to resolve.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Joe&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 14 Sep 2016 15:55:56 GMT</pubDate>
    <dc:creator>JHinkle</dc:creator>
    <dc:date>2016-09-14T15:55:56Z</dc:date>
    <item>
      <title>K64 Programming Flash</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608386#M35924</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;How do you place code in a post? &amp;nbsp;I tried the "code" block selection in the toolbar "&amp;lt;&amp;gt;" but it just garbles things up.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Let me explain my question. &amp;nbsp;If someone can tell me how to post code that shows proper format -- I can then include it for clarity.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have written my own flash programming routines in an attempt to understand the process.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am using a K64 with NO FlexNVM&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If I understand the documentation correctly, you can not execute code from the same flash block you are attempting to program. &amp;nbsp;I read somewhere that code executing in RAM allows you to program and flash block without a collision error.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I believe the the code that needs to run from ram is code that actually read and writes to FTFE_FSTAT.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I wrote a small function that perform 2 functions based on an argument passed to it.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;1. &amp;nbsp;Read FTFE_FSTAT and check that CCIF is not zero which would indicate active flash operation in progress. &amp;nbsp;Once set, clear any of the error flags from the last flash operation. &amp;nbsp;Leave function with only CCIF set.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;2. &amp;nbsp;Enter with&amp;nbsp;&lt;SPAN&gt;FTFE_FSTAT having only CCIF set. &amp;nbsp;Perform&amp;nbsp;FTFE_FSTAT = FTFE_FSTAT_CCIF_MASK; which should start the flash operation. &amp;nbsp;Wait until&amp;nbsp;FTFE_FSTAT -&amp;nbsp;CCIF mis set indicating flash operation is complete. &amp;nbsp;Return&amp;nbsp;FTFE_FSTAT to return any errors that may have&amp;nbsp;occurred.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I acquire 4 byte align space in RAM and copy the function above into that ram space. &amp;nbsp;I assign a ram pointer to that RAM space cast to be my function. &amp;nbsp;Now I can just call the function I described above from its ram image.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I have reserved 16 bytes a flash at address 0x410 to hold my MAC address. &amp;nbsp;When I start, this address range contains all FF's.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I perform the following (I wish I knew how to post code)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt; FTFE_FCCOB0 = 7; // PGM8&lt;BR /&gt; FTFE_FCCOB1 = (byte)(Address &amp;gt;&amp;gt; 16);&lt;BR /&gt; FTFE_FCCOB2 = (byte)(Address &amp;gt;&amp;gt; 8); &lt;BR /&gt; FTFE_FCCOB3 = (byte)(Address); &lt;BR /&gt; FTFE_FCCOB4 = D[0];&lt;BR /&gt; FTFE_FCCOB5 = D[1];&lt;BR /&gt; FTFE_FCCOB6 = D[2];&lt;BR /&gt; FTFE_FCCOB7 = D[3];&lt;BR /&gt; FTFE_FCCOB8 = D[4];&lt;BR /&gt; FTFE_FCCOB9 = D[5];&lt;BR /&gt; FTFE_FCCOBA = D[6];&lt;BR /&gt; FTFE_FCCOBB = D[7]; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Where Address is 0x410 and array D contains my 6 byte MAC and 2 bytes of FF.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I call my ram function and it return zero indicating a successful write .. BUT ... flash has NOT changed.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I set the Address to 0x414 which violates the 64 bit alignment requirement for phase programming as a test and get a return value indicating ACCERR error which is valid and also indicates my ram function is&amp;nbsp;functioning&amp;nbsp;properly.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;This is the Function that is moved from flash into ram .. sorry for the formatting .&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;byte FlashBased_Perform_Flash_Operation(byte Operation)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hwInterruptsDisable();&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch(Operation)&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;STRONG&gt;&amp;nbsp;case Flash_Operation_WaitTilReady:&lt;/STRONG&gt;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(1)&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if((FTFE_FSTAT &amp;amp; FTFE_FSTAT_CCIF_MASK))&lt;BR /&gt;&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; break;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;BR /&gt; &lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FTFE_FSTAT = (FTFE_FSTAT_RDCOLERR_MASK | FTFE_FSTAT_ACCERR_MASK | &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; FTFE_FSTAT_FPVIOL_MASK); // clear any errors;&lt;BR /&gt; &lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hwInterruptsEnable();&lt;BR /&gt; &lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (FTFE_FSTAT &amp;amp; ~FTFE_FSTAT_CCIF_MASK);&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;BR /&gt; &lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;STRONG&gt;case Flash_Operation_PerformWrite:&lt;/STRONG&gt;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FTFE_FSTAT = FTFE_FSTAT_CCIF_MASK; &amp;nbsp;// start flash operation&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(1)&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if((FTFE_FSTAT &amp;amp; FTFE_FSTAT_CCIF_MASK))&lt;BR /&gt;&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; break;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;BR /&gt; &lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hwInterruptsEnable();&lt;BR /&gt; &lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (FTFE_FSTAT &amp;amp; ~FTFE_FSTAT_CCIF_MASK);&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;BR /&gt; &lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;// end of switch&lt;BR /&gt;}&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The process should be simple but I'm not write to flash.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any comment or suggestions?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Joe&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 12 Sep 2016 04:13:24 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608386#M35924</guid>
      <dc:creator>JHinkle</dc:creator>
      <dc:date>2016-09-12T04:13:24Z</dc:date>
    </item>
    <item>
      <title>Re: K64 Programming Flash</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608387#M35925</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Joe&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;To post code you need to :&lt;/P&gt;&lt;P&gt;1. Activate "Use advanced editor"&amp;nbsp;- click the link above right of the input area.&lt;/P&gt;&lt;P&gt;2. Click on the "Expand Toolbar" (&lt;STRONG&gt;...&lt;/STRONG&gt;)&lt;BR /&gt;3. Now click on the "More" drop-down an select "Syntax highlighter"&lt;BR /&gt;4. Choose Language "C" and paste the code into the box.&lt;BR /&gt;5. Close the box and continue with normal typing&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I didn't see the problem with your code but this is how to do it (I stripped out just for phrase programming):&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;&lt;SPAN class="keyword token"&gt;static&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;int&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;fnProgram&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;long&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;ptrWord&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;long&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;ptr_ulWord&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;while&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;FTFL_FSTAT &lt;SPAN class="operator token"&gt;&amp;amp;&lt;/SPAN&gt; FTFL_STAT_CCIF&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;==&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;&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; &lt;SPAN class="comment token"&gt;// wait for previous commands to complete&lt;/SPAN&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;FTFL_FSTAT &lt;SPAN class="operator token"&gt;&amp;amp;&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;FTFL_STAT_ACCERR &lt;SPAN class="operator token"&gt;|&lt;/SPAN&gt; FTFL_STAT_FPVIOL &lt;SPAN class="operator token"&gt;|&lt;/SPAN&gt; FTFL_STAT_RDCOLERR&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;!=&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;// check for errors in previous command &lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTFL_FSTAT &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;FTFL_STAT_ACCERR &lt;SPAN class="operator token"&gt;|&lt;/SPAN&gt; FTFL_STAT_FPVIOL &lt;SPAN class="operator token"&gt;|&lt;/SPAN&gt; FTFL_STAT_RDCOLERR&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;// clear old errors&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; FTFL_FCCOB0 &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; FCMD_PROGRAM&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;// enter the command sequence&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FTFL_FCCOB1 &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;char&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;CAST_POINTER_ARITHMETIC&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;ptrWord&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;&amp;gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;16&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;// set address in flash&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FTFL_FCCOB2 &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;char&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;CAST_POINTER_ARITHMETIC&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;ptrWord&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;&amp;gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;8&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FTFL_FCCOB3 &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;char&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;CAST_POINTER_ARITHMETIC&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;ptrWord&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FTFL_FCCOB7_4 &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;ptr_ulWord&lt;SPAN class="operator token"&gt;++&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;// enter the long word to be programmed&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FTFL_FCCOBB_8 &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;ptr_ulWord&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;// enter the second long word to be programmed&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="token function"&gt;uDisable_Interrupt&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&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;&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; &lt;SPAN class="comment token"&gt;// protect this region from interrupts&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="token function"&gt;fnRAM_code&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;volatile&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;char&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;FLASH_STATUS_REGISTER&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;// execute the command from SRAM&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="token function"&gt;uEnable_Interrupt&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&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;&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; &lt;SPAN class="comment token"&gt;// safe to accept interrupts again&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;return&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;FTFL_FSTAT &lt;SPAN class="operator token"&gt;&amp;amp;&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;FTFL_STAT_ACCERR &lt;SPAN class="operator token"&gt;|&lt;/SPAN&gt; FTFL_STAT_FPVIOL &lt;SPAN class="operator token"&gt;|&lt;/SPAN&gt; FTFL_STAT_MGSTAT0&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;// if there was an error this will be non-zero&lt;/SPAN&gt;
&lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;The only code that needs to be in RAM is this:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;&lt;SPAN class="keyword token"&gt;static&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;void&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;fnFlashRoutineInRam&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;volatile&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;char&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;ptrFTFL_BLOCK&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;ptrFTFL_BLOCK &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; FTFL_STAT_CCIF&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&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;&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; &lt;SPAN class="comment token"&gt;// launch the command - this clears the FTFL_STAT_CCIF flag (register is FTFL_FSTAT)&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;while&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;ptrFTFL_BLOCK &lt;SPAN class="operator token"&gt;&amp;amp;&lt;/SPAN&gt; FTFL_STAT_CCIF&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;==&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;&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; &lt;SPAN class="comment token"&gt;// wait for the command to terminate&lt;/SPAN&gt;
&lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;
‍‍‍‍‍&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Attached is the uTasker flash driver which is compatible with long-word and phrase programing of KE, KEA, KL, KV, KM &amp;nbsp;and K parts, including PROGRAM ONCE (useful for MAC addresses that are programmed once and can't be erased), Flash swap (for K64 for example), FlexData, section programming option and soem other stuff (fail-safe parameter system and mixing external and internal Flash programming into a virtual linear address space).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;A simple method to learn Flash programming is to type in these sequences in the debugger (directly accessing the Flash registers and monitoring the memory content). Once you are familiar with the actual writes to do (and possibly ones to avoid) you can then implement in code in the same sequence.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If you want to speed up your learning and progress you can simply download the uTasker project and use its Kinetis simulator (which also emulates all Flash operations) so that you can see how it works and either directly use the solutions (that have been in operation for a number of years in many varied&amp;nbsp;industrial products&amp;nbsp;based on various Kinetis processors) or copy them to build your own library.&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;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 12 Sep 2016 16:40:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608387#M35925</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2016-09-12T16:40:08Z</dc:date>
    </item>
    <item>
      <title>Re: K64 Programming Flash</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608388#M35926</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Mark:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks for your reply.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I moved my test address to the second flash block so I could test my flash based programming function AND the ram version. &amp;nbsp;Both worked as expected.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I tried writing again to an address in the FIRST flash block and no write occurs.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I know my routines work ... so issue has to be with an interaction with the debugger (JLink) OR my writes to the Lower&amp;nbsp;flash block (where code is running) is blocking it for some reason.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;No errors occur during write attempt, just no write.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Joe&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 13 Sep 2016 18:22:30 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608388#M35926</guid>
      <dc:creator>JHinkle</dc:creator>
      <dc:date>2016-09-13T18:22:30Z</dc:date>
    </item>
    <item>
      <title>Re: K64 Programming Flash</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608389#M35927</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Any help NXP.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Upper flash blocks writes just fine.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Lower flash block does NOT write at all AND&amp;nbsp;does not produce any errors in&amp;nbsp;&lt;SPAN style="color: #51626f; background-color: #ffffff;"&gt;FTFE_FSTAT&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Joe&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 14 Sep 2016 12:01:06 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608389#M35927</guid>
      <dc:creator>JHinkle</dc:creator>
      <dc:date>2016-09-14T12:01:06Z</dc:date>
    </item>
    <item>
      <title>Re: K64 Programming Flash</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608391#M35929</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Code is working fine.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm using Crossworks for development.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Debug memory view always shows al FF's after a lower flash block write -- even after I ask it to refresh.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;As a debugging aid, I copied the contents of the newly flash memory into a ram array and view it -- and it shows it programmed properly so I have a tool issue - not a code issue.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Tools are meant to help you with problems, NOT be the source of problems.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks for all for help and comments -- Now I have a tool issue to resolve.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Joe&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 14 Sep 2016 15:55:56 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608391#M35929</guid>
      <dc:creator>JHinkle</dc:creator>
      <dc:date>2016-09-14T15:55:56Z</dc:date>
    </item>
    <item>
      <title>Re: K64 Programming Flash</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608392#M35930</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Joe&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You always need to question what debugging tools are doing/showing you - always keep a healthy mistrust relationship and double check when in doubt with a second or third tool.&lt;/P&gt;&lt;P&gt;I always have internal code that can double-check things (like in the menu I used) and simulate to cross-check expected with unexpected (possibly compiler or tool influenced) occurances to avoid unnecessary loss of time when developing.&lt;BR /&gt;&lt;BR /&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;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 14 Sep 2016 18:48:24 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/K64-Programming-Flash/m-p/608392#M35930</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2016-09-14T18:48:24Z</dc:date>
    </item>
  </channel>
</rss>

