<?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>Kinetis MicrocontrollersのトピックRe: Writing to flash works in debug but not in run mode</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350912#M17339</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Mark,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you for your answer.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have done a little research on this subject and when I was trying to change the linker file, I have noticed that it is maintained by Processor Expert. I am trying to write my routines for writing to flash and erasing it. I am only using "Init_FTMR" component to initialize it.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have found &lt;A href="http://cache.freescale.com/files/soft_dev_tools/doc/app_note/AN4497.pdf"&gt;AN4497&lt;/A&gt; and also some other threads on this forum but their pragma directives doesn't work and also linker file is altered all the time by processor expert.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have also found out &lt;A href="http://community.arm.com/groups/embedded/blog/2014/04/07/writing-data-to-flash-during-program-execution-with-the-freescale-kl25z-series"&gt;this&lt;/A&gt; tutorial. Quoted from this tutorial is below. I didn't understand where I will right click and do the instructions he mentioned.&lt;/P&gt;&lt;BLOCKQUOTE&gt;
&lt;P&gt;This is achieved by placing the code to execute the flash commands into the on-board RAM for execution. To do this you need to right-hand click on the file you are using to write data to flash, and selecting options.&amp;nbsp; You then need to look at the memory assignment section at the bottom of the page and change the ‘Code / Const’ to a RAM region on your MCU. This will ensure that every time your application starts this section of code is copied into the RAM for execution.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Do you have any idea how can I put a function to RAM when I am using Processor Expert?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 17 Dec 2014 09:13:07 GMT</pubDate>
    <dc:creator>abdullahkahrama</dc:creator>
    <dc:date>2014-12-17T09:13:07Z</dc:date>
    <item>
      <title>Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350910#M17337</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am working with a MKE04Z8M4 microcontroller. I am trying to use FLASH area to store some configuration values. I have a routine to write to a certain FLASH memory address but it works only when I do step by step debug. It doesn't work in run mode. Also, when I debug it and click run, it doesn't work that way, either. There is no compiler optimization. Here is my code:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_1418655886295624" jivemacro_uid="_1418655886295624"&gt;
&lt;P&gt;void FLASH_program(void)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Read FCLKDIV register&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FTMRE_FCLKDIV != 0x17)&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;&amp;nbsp;&amp;nbsp; // If FCLKDIV register not correct,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for any flash command in progress.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_CCIF_MASK) == 0x00)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; // Write FLCKDIV register&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCLKDIV = FTMRE_FCLKDIV_FDIV(0x17);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&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;&amp;nbsp;&amp;nbsp; // If FCLKDIV register is correct,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for any flash command in progress.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_CCIF_MASK) == 0x00)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Access Error and or Protection Violation Check&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_ACCERR_MASK) == 1)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_FPVIOL_MASK) == 1))&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;&amp;nbsp;&amp;nbsp; // Write: FSTAT register: Clear ACCERR and FPVIOL&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FSTAT = 0x30;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write to FCCOBIX register to identify specific command parameter to load&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x00;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write to FCCOB register to load required command parameter&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x06; // Program flash command code&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // Global address [23:16] to identify flash block&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x01;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x1D; // Global address [15:0] of longwords location to be programmed&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0xFC; // Global address [1:0] must be 0x00&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x02;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x00; // Word 0 (longword 0) program value&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // (unsigned char) (PWM_duty_H1);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x03;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x00; // Word 1 (longword 0) program value&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // (unsigned char) (PWM_duty_H2);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x04;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x00; // (unsigned char) (current_limit_FW &amp;gt;&amp;gt; 8); // Word 2 (long3word 1) program value&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // (unsigned char) (current_limit_FW);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x05;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x00; // (unsigned char) (current_limit_BW &amp;gt;&amp;gt; 8); // Word 3 (longword 1) program value&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // (unsigned char) (current_limit_BW);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write: FSTAT register to launch command&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FSTAT = 0x80;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for the flash command in progress.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_CCIF_MASK) == 0x00)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;

&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here is how my memory configured in the Processor Expert:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="lia-inline-image-display-wrapper" image-alt="addr.png"&gt;&lt;IMG alt="addr.png" src="https://community.nxp.com/t5/image/serverpage/image-id/48291iBFC14F488AA7BA25/image-size/large?v=v2&amp;amp;px=999" title="addr.png" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 02 Nov 2020 13:12:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350910#M17337</guid>
      <dc:creator>abdullahkahrama</dc:creator>
      <dc:date>2020-11-02T13:12:18Z</dc:date>
    </item>
    <item>
      <title>Re: Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350911#M17338</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Abdullah&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You need to run the programming part (the bit below) in SRAM (it can't run in Flash since it causes the program to fail when executing it). It is also advisable to disable interrupt while programming too.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_14186651518608033" jivemacro_uid="_14186651518608033"&gt;&lt;OL class="dp-cpp" start="1"&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment"&gt;// Write: FSTAT register to launch command&amp;nbsp; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FSTAT = &lt;SPAN class="number"&gt;0x80;&amp;nbsp; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp; &lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment"&gt;// Wait for the flash command in progress.&amp;nbsp; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword"&gt;while ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_CCIF_MASK) == &lt;SPAN class="number"&gt;0x00&lt;/SPAN&gt;)&amp;nbsp; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp; &lt;/LI&gt;
&lt;/OL&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;There are quite an number of forum threads on the topic - for example: &lt;A href="https://community.nxp.com/message/395090" rel="nofollow noopener noreferrer" target="_blank"&gt;Re: Serial number programming in production - Kinetis K10&lt;/A&gt; (the basics are the same for KE, KL and K devices).&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;EM&gt;P.S. Carefully check that the register FTMRH_FCLKDIV is set correctly for the bus clock when using the KE. If it isn't it may be under or over programnming which can result in unreliability or potential damage. PE probably does it for you but I wouldn't blindly trust it because such tools also can make mistakes.&lt;/EM&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 15 Dec 2014 17:39:49 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350911#M17338</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-15T17:39:49Z</dc:date>
    </item>
    <item>
      <title>Re: Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350912#M17339</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Mark,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you for your answer.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have done a little research on this subject and when I was trying to change the linker file, I have noticed that it is maintained by Processor Expert. I am trying to write my routines for writing to flash and erasing it. I am only using "Init_FTMR" component to initialize it.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have found &lt;A href="http://cache.freescale.com/files/soft_dev_tools/doc/app_note/AN4497.pdf"&gt;AN4497&lt;/A&gt; and also some other threads on this forum but their pragma directives doesn't work and also linker file is altered all the time by processor expert.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have also found out &lt;A href="http://community.arm.com/groups/embedded/blog/2014/04/07/writing-data-to-flash-during-program-execution-with-the-freescale-kl25z-series"&gt;this&lt;/A&gt; tutorial. Quoted from this tutorial is below. I didn't understand where I will right click and do the instructions he mentioned.&lt;/P&gt;&lt;BLOCKQUOTE&gt;
&lt;P&gt;This is achieved by placing the code to execute the flash commands into the on-board RAM for execution. To do this you need to right-hand click on the file you are using to write data to flash, and selecting options.&amp;nbsp; You then need to look at the memory assignment section at the bottom of the page and change the ‘Code / Const’ to a RAM region on your MCU. This will ensure that every time your application starts this section of code is copied into the RAM for execution.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Do you have any idea how can I put a function to RAM when I am using Processor Expert?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 17 Dec 2014 09:13:07 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350912#M17339</guid>
      <dc:creator>abdullahkahrama</dc:creator>
      <dc:date>2014-12-17T09:13:07Z</dc:date>
    </item>
    <item>
      <title>Re: Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350913#M17340</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Abdullah&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I don't use PE so don't know details.&lt;/P&gt;&lt;P&gt;However the link that I gave gives code to do it very simply without needing to do any linker script changes.&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;A href="http://www.utasker.com/kinetis.html" title="http://www.utasker.com/kinetis.html"&gt;µTasker Kinetis support&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 17 Dec 2014 13:10:44 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350913#M17340</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-17T13:10:44Z</dc:date>
    </item>
    <item>
      <title>Re: Re: Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350914#M17341</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Mark,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Yes, I am aware of the code that you have written and I can see that it was helpful to many people. Thank you for your contribution to the community &lt;IMG alt="Smiley Happy" class="emoticon emoticon-smileyhappy" id="smileyhappy" src="https://community.nxp.com/i/smilies/16x16_smiley-happy.png" title="Smiley Happy" /&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;However, I cannot implement your code. When I write below code, in debugger it goes into an endless loop.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro _jivemacro_uid_14188318683711163 jive_macro_code" jivemacro_uid="_14188318683711163" modifiedtitle="true"&gt;
&lt;P&gt;#define PROG_WORD_SIZE 30&amp;nbsp; // adequate space for the small program&lt;/P&gt;
&lt;P&gt;#define CAST_POINTER_ARITHMETIC unsigned long&amp;nbsp;&amp;nbsp; // Kinetis uses 32 bit pointers&lt;/P&gt;
&lt;P&gt;#define FTFL_BLOCK&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x40020000&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; // Flash Memory Module&lt;/P&gt;
&lt;P&gt;static unsigned short fnFlashRoutine[] =&lt;/P&gt;
&lt;P&gt;{ 0x2180, 0x7001, 0x7801, 0x0609, 0xd5fc, 0x4770 };&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;void FLASH_program(void)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void (*fnRAM_code)(volatile unsigned char *) = 0;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!fnRAM_code)&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;&amp;nbsp;&amp;nbsp; // the first time this is used it will load the program to SRAM&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned char *ptrThumb2 = (unsigned char *) fnFlashRoutine;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static unsigned short usProgSpace[PROG_WORD_SIZE]; // make space for the routine on stack (this will have an even boundary)&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptrThumb2 = (unsigned char *) (((CAST_POINTER_ARITHMETIC) ptrThumb2)&lt;/P&gt;
&lt;P&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;amp; ~0x1); // thumb 2 address&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (i &amp;lt; PROG_WORD_SIZE)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { // copy program to SRAM&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usProgSpace[i++] = *(unsigned short *) ptrThumb2;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptrThumb2 += sizeof(unsigned short);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptrThumb2 = (unsigned char *) usProgSpace;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptrThumb2++; // create a thumb 2 call&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fnRAM_code = (void (*)(volatile unsigned char *)) (ptrThumb2);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Read FCLKDIV register&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FTMRE_FCLKDIV != 0x17)&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;&amp;nbsp;&amp;nbsp; // If FCLKDIV register not correct,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for any flash command in progress.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_CCIF_MASK) == 0x00)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; // Write FLCKDIV register&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCLKDIV = FTMRE_FCLKDIV_FDIV(0x17);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&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;&amp;nbsp;&amp;nbsp; // If FCLKDIV register is correct,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for any flash command in progress.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_CCIF_MASK) == 0x00)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Access Error and or Protection Violation Check&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_ACCERR_MASK) == 1)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_FPVIOL_MASK) == 1))&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;&amp;nbsp;&amp;nbsp; // Write: FSTAT register: Clear ACCERR and FPVIOL&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FSTAT = 0x30;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write to FCCOBIX register to identify specific command parameter to load&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x00;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write to FCCOB register to load required command parameter&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x06; // Program flash command code&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // Global address [23:16] to identify flash block&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x01;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x1E; // Global address [15:0] of longwords location to be programmed&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // Global address [1:0] must be 0x00&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x02;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x00; // Word 0 (longword 0) program value&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // (unsigned char) (PWM_duty_H1);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x03;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x00; // Word 1 (longword 0) program value&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // (unsigned char) (PWM_duty_H2);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x04;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x00; // (unsigned char) (current_limit_FW &amp;gt;&amp;gt; 8); // Word 2 (long3word 1) program value&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // (unsigned char) (current_limit_FW);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x05;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x00; // (unsigned char) (current_limit_BW &amp;gt;&amp;gt; 8); // Word 3 (longword 1) program value&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // (unsigned char) (current_limit_BW);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write: FSTAT register to launch command&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FTMRE_FSTAT = 0x80;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fnRAM_code((volatile unsigned char *) FTFL_BLOCK); // execute the command from SRAM&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for the flash command in progress.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_CCIF_MASK) == 0x00);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;

&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In the debugger, it loops between these marked lines:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="lia-inline-image-display-wrapper" image-alt="addr.png"&gt;&lt;IMG alt="addr.png" src="https://community.nxp.com/t5/image/serverpage/image-id/47718i810E045E6BAD7B59/image-size/large?v=v2&amp;amp;px=999" title="addr.png" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 02 Nov 2020 13:12:20 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350914#M17341</guid>
      <dc:creator>abdullahkahrama</dc:creator>
      <dc:date>2020-11-02T13:12:20Z</dc:date>
    </item>
    <item>
      <title>Re: Re: Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350915#M17342</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Abdullah&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You are calling the routine incorrectly for the KE devices&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;fnRAM_code((&lt;SPAN class="keyword"&gt;volatile unsigned &lt;SPAN class="datatypes"&gt;char&lt;/SPAN&gt; *) &lt;STRONG&gt;FTFL_BLOCK&lt;/STRONG&gt;); will work for for K and KL devices because the status register is the first entry and so is equal to the block address.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;For the KE family you can use &lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;fnRAM_code((&lt;SPAN class="keyword"&gt;volatile unsigned &lt;SPAN class="datatypes"&gt;char&lt;/SPAN&gt; *) &lt;STRONG&gt;FLASH_STATUS_REGISTER&lt;/STRONG&gt;);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;where FLASH_STATUS_REGISTER is either (&lt;SPAN class="keyword"&gt;FTFL_BLOCK + 5) or directly&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="preprocessor"&gt;#define &lt;SPAN class="keyword"&gt;FLASH_STATUS_REGISTER&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x40020005&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; // Flash Memory Module&amp;nbsp; Status Register Address&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;&lt;SPAN class="keyword"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;&lt;SPAN class="keyword"&gt;Regards&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;&lt;SPAN class="keyword"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;&lt;SPAN class="keyword"&gt;Mark&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;&lt;SPAN class="keyword"&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 17 Dec 2014 16:55:50 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350915#M17342</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-17T16:55:50Z</dc:date>
    </item>
    <item>
      <title>Re: Re: Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350916#M17343</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;YAY! Thank you very much, it worked :smileyhappy:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;However, I cannot do an "Erase Flash Block" command. The debugger says "ARM transaction fault". Here is my code:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;#define PROG_WORD_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; 10&amp;nbsp; // adequate space for the small program&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;#define CAST_POINTER_ARITHMETIC&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; unsigned long&amp;nbsp;&amp;nbsp; // Kinetis uses 32 bit pointers&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;#define FLASH_STATUS_REGISTER&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; 0x40020005&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;// Flash Memory Module&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;static unsigned short fnFlashRoutine[] =&lt;/P&gt;&lt;P&gt;{ 0x2180, 0x7001, 0x7801, 0x0609, 0xd5fc, 0x4770 };&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void FLASH_erase(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void (*fnRAM_code)(volatile unsigned char *) = 0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!fnRAM_code)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { // the first time this is used it will load the program to SRAM&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; int i = 0;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; unsigned char *ptrThumb2 = (unsigned char *) fnFlashRoutine;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; static unsigned short usProgSpace[PROG_WORD_SIZE]; // make space for the routine on stack (this will have an even boundary)&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; ptrThumb2 = (unsigned char *) (((CAST_POINTER_ARITHMETIC) ptrThumb2)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; &amp;amp; ~0x1); // thumb 2 address&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; while (i &amp;lt; PROG_WORD_SIZE)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; { // copy program to SRAM&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; usProgSpace[i++] = *(unsigned short *) ptrThumb2;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; ptrThumb2 += sizeof(unsigned short);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; }&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; ptrThumb2 = (unsigned char *) usProgSpace;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; ptrThumb2++; // create a thumb 2 call&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; fnRAM_code = (void (*)(volatile unsigned char *)) (ptrThumb2);&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Read FCLKDIV register&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FTMRE_FCLKDIV != 0x17)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; // If FCLKDIV register not correct,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; // Wait for any flash command in progress.&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; while ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_CCIF_MASK) == 0x00)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; ;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; // Write FLCKDIV register&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; FTMRE_FCLKDIV = FTMRE_FCLKDIV_FDIV(0x17);&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; // If FCLKDIV register is correct,&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; // Wait for any flash command in progress.&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; while ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_CCIF_MASK) == 0x00)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; ;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Access Error and or Protection Violation Check&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_ACCERR_MASK) == 1)&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; || ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_FPVIOL_MASK) == 1))&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; // Write: FSTAT register: Clear ACCERR and FPVIOL&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; FTMRE_FSTAT = 0x30;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write to FCCOBIX register to identify specific command parameter to load&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x00;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write to FCCOB register to load required command parameter&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x09; // Erase flash block command code&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // Global address [23:16] to identify flash block&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBIX = 0x01;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBHI = 0x1E; // Global address [15:0] of longwords location to be programmed&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0x00; // Global address [1:0] must be 0x00&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write: FSTAT register to launch command&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FTMRE_FSTAT = 0x80;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fnRAM_code((volatile unsigned char *) FLASH_STATUS_REGISTER); // execute the command from SRAM&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for the flash command in progress.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_CCIF_MASK) == 0x00)&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; ;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 18 Dec 2014 07:20:54 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350916#M17343</guid>
      <dc:creator>abdullahkahrama</dc:creator>
      <dc:date>2014-12-18T07:20:54Z</dc:date>
    </item>
    <item>
      <title>Re: Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350917#M17344</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Abdullah&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Please could you try the command&lt;/P&gt;&lt;P&gt;FTMRE_FCCOBHI = &lt;STRONG&gt;0x0a&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;instead of 0x09?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Note also that you don't need the following code after the flashing operation since it is already performed in the RAM routine:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for the flash command in progress.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((FTMRE_FSTAT &amp;amp; FTMRE_FSTAT_CCIF_MASK) == 0x00)&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;P&gt; ;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&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>Thu, 18 Dec 2014 15:28:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350917#M17344</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-18T15:28:59Z</dc:date>
    </item>
    <item>
      <title>Re: Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350918#M17345</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Mark,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you :smileyhappy:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have tried it with command 0x0A instead of 0x09 and it didn't work either, but then I have disabled the interrupts and 0x0A (Erase Flash Sector) command worked :smileyhappy:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;However, 0x09 (Erase Flash Block) command doesn't still work. I am puzzled why this happens. &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 18 Dec 2014 16:17:03 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350918#M17345</guid>
      <dc:creator>abdullahkahrama</dc:creator>
      <dc:date>2014-12-18T16:17:03Z</dc:date>
    </item>
    <item>
      <title>Re: Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350919#M17346</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Abdullah&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The erase flash block command will erase the complete Flash block (128k) and is not very useful unless you want to completely destroy the code that is operating (it will of course crash once it has deleted itself).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If you however still need this command you can look at the status that it returns because it give details as to why it couldn't be executed:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/48502iFA828B088572E5B3/image-size/large?v=v2&amp;amp;px=999" title="pastedImage_0.png" alt="pastedImage_0.png" /&gt;&lt;/span&gt;&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;A href="http://www.utasker.com/kinetis.html" title="http://www.utasker.com/kinetis.html"&gt;µTasker Kinetis support&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 18 Dec 2014 19:43:32 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350919#M17346</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-18T19:43:32Z</dc:date>
    </item>
    <item>
      <title>Re: Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350920#M17347</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I see, Mark. However, when I try to launch 0x09 command, the CPU goes into a stage and crashes and I cannot even program it without mass erasing, it doesn't accept RESET. The last instruction before it goes mad is "cpy sp,r7". I have added a "while(1)" just after launching the command and just before exiting function, and checked the debugger and FSTAT register is 0x80, meaning the command is completed with success.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Anyways, I will use 0x0A and it will do the trick. Thank you very much for your help.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Dec 2014 13:31:24 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350920#M17347</guid>
      <dc:creator>abdullahkahrama</dc:creator>
      <dc:date>2014-12-19T13:31:24Z</dc:date>
    </item>
    <item>
      <title>Re: Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350921#M17348</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Abdullah&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;As I wrote, the block erase command is not useful for normal programs since it destroys the complete software that is loaded and will immediately crash after the erase.&lt;/P&gt;&lt;P&gt;It is also normal that after a block erase the processor is in the secure state (because the FSEC byte in Flash is set to 0xff). It is then necessary to unlock the processorbefore it can be worked with again (the FSEC byte in a new Fash is not 0xff but 0xfe).&lt;/P&gt;&lt;P&gt;The mass erase that the debuggers do is in fact a block erase (or a mass erase if the chip has more than 2 block - although the erase command actually used is not important) followed by writing the FSEC byte to 0xfe before the chip is reset - this avoids the secure state - or recovers from a secured state, depending on how you look at it.&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>Fri, 19 Dec 2014 14:58:44 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350921#M17348</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-19T14:58:44Z</dc:date>
    </item>
    <item>
      <title>Re: Writing to flash works in debug but not in run mode</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350922#M17349</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Mark,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Oh, I understand now. Then, as you say, the block erase command is useless for me.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you for all your help, I can now read and write to FLASH :smileyhappy:&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Dec 2014 15:22:17 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Writing-to-flash-works-in-debug-but-not-in-run-mode/m-p/350922#M17349</guid>
      <dc:creator>abdullahkahrama</dc:creator>
      <dc:date>2014-12-19T15:22:17Z</dc:date>
    </item>
  </channel>
</rss>

