<?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: Erasing a flash sector puts directs CPU into &amp;quot;unhandled interrupt code&amp;quot; section in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Erasing-a-flash-sector-puts-directs-CPU-into-quot-unhandled/m-p/370173#M19159</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Abdullah Kahraman,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;the problem on your side should be caused by the statement "fnRAM_code((&lt;SPAN class="keyword"&gt;volatile unsigned &lt;SPAN class="datatypes"&gt;char&lt;/SPAN&gt; *) FTMRE_BASE_PTR );".&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;When calling a function by using the function pointer, the value of function pointer should be added by 1 before calling.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;suppose the address of a function in RAM is 0x1000, then, when calling this function pointer, the function pointer should point to address 0x1001.&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;I hope it helps!&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 25 Dec 2014 07:36:35 GMT</pubDate>
    <dc:creator>Rick_Li</dc:creator>
    <dc:date>2014-12-25T07:36:35Z</dc:date>
    <item>
      <title>Erasing a flash sector puts directs CPU into "unhandled interrupt code" section</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Erasing-a-flash-sector-puts-directs-CPU-into-quot-unhandled/m-p/370172#M19158</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 have asked the question in &lt;A _jive_internal="true" href="https://community.nxp.com/message/463836" rel="noopener noreferrer" target="_blank"&gt;this link&lt;/A&gt; before.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am working with a MKE04Z8VFK4. Below code worked before, when there were no optimizations. However, now that my flash is about to be used, I have to optimize to fit all of my code in.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am trying to erase a flash sector however, in the debugger, the CPU goes into the function for "unhandled interrupt code". Below is my code and optimization settings.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="lia-inline-image-display-wrapper" image-alt="opt.png"&gt;&lt;IMG alt="opt.png" src="https://community.nxp.com/t5/image/serverpage/image-id/48706i49FDAE497ABCE51D/image-size/large?v=v2&amp;amp;px=999" title="opt.png" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="_jivemacro_uid_14194078895179046 jive_text_macro jive_macro_code" jivemacro_uid="_14194078895179046"&gt;
&lt;P&gt;#define PROG_WORD_SIZE&amp;nbsp;&amp;nbsp; 30&lt;/P&gt;
&lt;P&gt;#define CAST_POINTER_ARITHMETIC&amp;nbsp;&amp;nbsp; unsigned long&lt;/P&gt;



&lt;/PRE&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_14194078894592382" jivemacro_uid="_14194078894592382"&gt;
&lt;P&gt;void __attribute__((optimize("O0"))) 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;&amp;nbsp;&amp;nbsp;&amp;nbsp; static unsigned short fnFlashRoutine[] =&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 0x2180, 0x7001, 0x7801, 0x0609, 0xd5fc, 0x4770 };&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;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 = 0x0A; // 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 = 0x1F; // Global address [15:0] of longwords location to be programmed&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTMRE_FCCOBLO = 0xE0; // 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 *) FTMRE_BASE_PTR ); // execute the command from SRAM&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;



&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here are the last steps before crash. It crashes after it processes "blx r3".&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="lia-inline-image-display-wrapper" image-alt="asm.png"&gt;&lt;IMG alt="asm.png" src="https://community.nxp.com/t5/image/serverpage/image-id/48707i6DB77190265FAFC5/image-size/large?v=v2&amp;amp;px=999" title="asm.png" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 02 Nov 2020 13:14:02 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Erasing-a-flash-sector-puts-directs-CPU-into-quot-unhandled/m-p/370172#M19158</guid>
      <dc:creator>abdullahkahrama</dc:creator>
      <dc:date>2020-11-02T13:14:02Z</dc:date>
    </item>
    <item>
      <title>Re: Erasing a flash sector puts directs CPU into "unhandled interrupt code" section</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Erasing-a-flash-sector-puts-directs-CPU-into-quot-unhandled/m-p/370173#M19159</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Abdullah Kahraman,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;the problem on your side should be caused by the statement "fnRAM_code((&lt;SPAN class="keyword"&gt;volatile unsigned &lt;SPAN class="datatypes"&gt;char&lt;/SPAN&gt; *) FTMRE_BASE_PTR );".&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;When calling a function by using the function pointer, the value of function pointer should be added by 1 before calling.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="keyword"&gt;suppose the address of a function in RAM is 0x1000, then, when calling this function pointer, the function pointer should point to address 0x1001.&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;I hope it helps!&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 25 Dec 2014 07:36:35 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Erasing-a-flash-sector-puts-directs-CPU-into-quot-unhandled/m-p/370173#M19159</guid>
      <dc:creator>Rick_Li</dc:creator>
      <dc:date>2014-12-25T07:36:35Z</dc:date>
    </item>
    <item>
      <title>Re: Erasing a flash sector puts directs CPU into "unhandled interrupt code" section</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Erasing-a-flash-sector-puts-directs-CPU-into-quot-unhandled/m-p/370174#M19160</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Yong,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have just solved my problem. Actually, yes, some of the problem was because of "FTRME_BASE_PTR" which is 0x40020000. However, it should have been 0x40020005. Also, I have deleted some sections of the arm_startup file to save some code space and it seems like I have messed something up. It is now working &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;Seems like removing following from __arm_start.c keeps the flash routine from working:&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_14194946829033814" jivemacro_uid="_14194946829033814" modifiedtitle="true"&gt;
&lt;P&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; zero-fill the .bss section&lt;/P&gt;
&lt;P&gt;zero_fill_bss();&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;#if SUPPORT_ROM_TO_RAM&lt;/P&gt;
&lt;P&gt;if (__S_romp != 0L)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __copy_rom_sections_to_ram();&lt;/P&gt;
&lt;P&gt;#endif&lt;/P&gt;
&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 02 Nov 2020 13:14:04 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Erasing-a-flash-sector-puts-directs-CPU-into-quot-unhandled/m-p/370174#M19160</guid>
      <dc:creator>abdullahkahrama</dc:creator>
      <dc:date>2020-11-02T13:14:04Z</dc:date>
    </item>
  </channel>
</rss>

