<?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: Activating the swap flag creates a reboot</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Activating-the-swap-flag-creates-a-reboot/m-p/420449#M24042</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Samuel Boi​vineau:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You are calling the functions with a macro called "FLASH_SWAP_INDICATOR_ADDR". Could you tell me what address is that?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For instructions on what address to use please check the application note &lt;A href="http://cache.freescale.com/files/microcontrollers/doc/app_note/AN4533.pdf"&gt;&lt;STRONG&gt;AN4533&lt;/STRONG&gt;&lt;/A&gt;, in particular the chapter &lt;STRONG&gt;5.1 Flash Swap Indicators&lt;/STRONG&gt;. In your case for K64 the address must be 128-bit aligned and usually it is placed in the last sector of each flash block.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards!&lt;/P&gt;&lt;P&gt;Jorge Gonzalez&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 28 Oct 2015 18:59:26 GMT</pubDate>
    <dc:creator>Jorge_Gonzalez</dc:creator>
    <dc:date>2015-10-28T18:59:26Z</dc:date>
    <item>
      <title>Activating the swap flag creates a reboot</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Activating-the-swap-flag-creates-a-reboot/m-p/420448#M24041</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 trying to implement a flash over the air, and most of it is ok. The issue is when initializing the flag of swap.&lt;/P&gt;&lt;P&gt;Here are my steps, based on the driver C90TFS in KSDK 1.2.0 over a K64F120M with 1MB flash :&lt;/P&gt;&lt;P&gt;- call the relocate function :&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_macro_code _jivemacro_uid_14455254183853352 jive_text_macro" data-renderedposition="134_8_1232_16" jivemacro_uid="_14455254183853352"&gt;&lt;P&gt;g_FlashLaunchCommand = (pFLASHCOMMANDSEQUENCE)RelocateFunction((uint32_t)ramFunc , LAUNCH_CMD_SIZE ,(uint32_t)FlashCommandSequence);&lt;/P&gt;&lt;/PRE&gt;&lt;P&gt;Then get the current swap status :&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="_jivemacro_uid_14455254724534329 jive_macro_code jive_text_macro" data-renderedposition="171_8_1232_32" jivemacro_uid="_14455254724534329"&gt;&lt;P&gt;result = PFlashSwapCtl(&amp;amp;flashSSDConfig,FLASH_SWAP_INDICATOR_ADDR,FTFx_SWAP_REPORT_STATUS,&amp;amp;currentSwapMode, \&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;currentSwapBlockStatus, &amp;amp;nextSwapBlockStatus ,g_FlashLaunchCommand);&lt;/P&gt;&lt;/PRE&gt;&lt;P&gt;I can then see that the currentSwapMode is FTFx_SWAP_UNINIT.&lt;/P&gt;&lt;P&gt;Then I call the flash function :&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_macro_code jive_text_macro _jivemacro_uid_144552555587368" data-renderedposition="245_8_1232_16" jivemacro_uid="_144552555587368"&gt;&lt;P&gt;result = PFlashSwap(&amp;amp;flashSSDConfig, FLASH_SWAP_INDICATOR_ADDR, SwapCallback, g_FlashLaunchCommand);&lt;/P&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Unfortunately, this function creates a reboot (or more exactly, a jump to the startup...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The flash function is the one of the driver :&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_macro_code _jivemacro_uid_14455257567151350 jive_text_macro" data-renderedposition="345_8_1232_448" jivemacro_uid="_14455257567151350"&gt;&lt;P&gt;uint32_t SIZE_OPTIMIZATION PFlashSwap(PFLASH_SSD_CONFIG pSSDConfig, \&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;nbsp;&amp;nbsp; uint32_t addr, \&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;nbsp;&amp;nbsp; PFLASH_SWAP_CALLBACK pSwapCallback, \&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;nbsp;&amp;nbsp; pFLASHCOMMANDSEQUENCE pFlashCommandSequence)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t ret = FTFx_OK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Return code */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t currentSwapMode , currentSwapBlockStatus , nextSwapBlockStatus;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool swapContinue;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; currentSwapMode = currentSwapBlockStatus = nextSwapBlockStatus = 0xFFU;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; swapContinue = FALSE;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Report current swap state */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = PFlashSwapCtl(pSSDConfig,addr,FTFx_SWAP_REPORT_STATUS,&amp;amp;currentSwapMode, \&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;currentSwapBlockStatus, &amp;amp;nextSwapBlockStatus ,pFlashCommandSequence);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FTFx_OK == ret)&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 ((FTFx_SWAP_UNINIT == currentSwapMode) || (FTFx_SWAP_READY == currentSwapMode) || \&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; (FTFx_SWAP_UPDATE == currentSwapMode))&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* If current swap mode is Uninitialized */&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; if (FTFx_SWAP_UNINIT == currentSwapMode)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Initialize Swap to Initialized/READY state */&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; ret = PFlashSwapCtl(pSSDConfig, addr, FTFx_SWAP_SET_INDICATOR_ADDR,&amp;amp;currentSwapMode, \&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;currentSwapBlockStatus, &amp;amp;nextSwapBlockStatus , pFlashCommandSequence);&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;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;and what is really curious is, it calls PFlashSwapCtl() a first time (line 14) then a second time (line 26) but only the second time, there is a failure. And if I follow until it fails, it's in the call to pFlashCommandSequence here :&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_macro_code _jivemacro_uid_14455260020629682 jive_text_macro" data-renderedposition="877_8_1232_576" jivemacro_uid="_14455260020629682"&gt;&lt;P&gt;uint32_t SIZE_OPTIMIZATION PFlashSwapCtl(PFLASH_SSD_CONFIG pSSDConfig,uint32_t addr, uint8_t swapcmd,uint8_t* pCurrentSwapMode, \&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t* pCurrentSwapBlockStatus, \&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t* pNextSwapBlockStatus, \&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pFLASHCOMMANDSEQUENCE pFlashCommandSequence)&lt;/P&gt;&lt;P&gt; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t ret;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Return code variable */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t temp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* temporary variable */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addr = WORD2BYTE(addr - pSSDConfig-&amp;gt;PFlashBase);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* clear RDCOLERR &amp;amp; ACCERR &amp;amp; FPVIOL flag in flash status register. Write 1 to clear*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = pSSDConfig-&amp;gt;ftfxRegBase + FTFx_SSD_FSTAT_OFFSET;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REG_WRITE(temp, FTFx_SSD_FSTAT_ERROR_BITS);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* passing parameter to the command */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = pSSDConfig-&amp;gt;ftfxRegBase + FTFx_SSD_FCCOB0_OFFSET;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REG_WRITE(temp, FTFx_PFLASH_SWAP);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = pSSDConfig-&amp;gt;ftfxRegBase + FTFx_SSD_FCCOB1_OFFSET;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REG_WRITE(temp, GET_BIT_16_23(addr));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = pSSDConfig-&amp;gt;ftfxRegBase + FTFx_SSD_FCCOB2_OFFSET;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REG_WRITE(temp, GET_BIT_8_15(addr));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = pSSDConfig-&amp;gt;ftfxRegBase + FTFx_SSD_FCCOB3_OFFSET;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REG_WRITE(temp, GET_BIT_0_7(addr));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = pSSDConfig-&amp;gt;ftfxRegBase + FTFx_SSD_FCCOB4_OFFSET;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REG_WRITE(temp, swapcmd);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = pSSDConfig-&amp;gt;ftfxRegBase + FTFx_SSD_FCCOB5_OFFSET;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REG_WRITE(temp, 0xFFU);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = pSSDConfig-&amp;gt;ftfxRegBase + FTFx_SSD_FCCOB6_OFFSET;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REG_WRITE(temp, 0xFFU);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = pSSDConfig-&amp;gt;ftfxRegBase + FTFx_SSD_FCCOB7_OFFSET;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REG_WRITE(temp, 0xFFU);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* calling flash command sequence function to execute the command */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = pFlashCommandSequence(pSSDConfig);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FTFx_OK == ret) [...]&lt;/P&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;By looking into it with the debugger, I can see that g_FlashLaunchCommand is still pointing to the same adress in ram. I am using a multilink, but should I supposed to be able to follow step by step the execution in the ram function ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Does anyone has any idea about why this command FTFx_SWAP_INDICATOR_ADDR fails ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 22 Oct 2015 15:03:35 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Activating-the-swap-flag-creates-a-reboot/m-p/420448#M24041</guid>
      <dc:creator>samuelboivineau</dc:creator>
      <dc:date>2015-10-22T15:03:35Z</dc:date>
    </item>
    <item>
      <title>Re: Activating the swap flag creates a reboot</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Activating-the-swap-flag-creates-a-reboot/m-p/420449#M24042</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Samuel Boi​vineau:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You are calling the functions with a macro called "FLASH_SWAP_INDICATOR_ADDR". Could you tell me what address is that?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For instructions on what address to use please check the application note &lt;A href="http://cache.freescale.com/files/microcontrollers/doc/app_note/AN4533.pdf"&gt;&lt;STRONG&gt;AN4533&lt;/STRONG&gt;&lt;/A&gt;, in particular the chapter &lt;STRONG&gt;5.1 Flash Swap Indicators&lt;/STRONG&gt;. In your case for K64 the address must be 128-bit aligned and usually it is placed in the last sector of each flash block.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards!&lt;/P&gt;&lt;P&gt;Jorge Gonzalez&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 28 Oct 2015 18:59:26 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Activating-the-swap-flag-creates-a-reboot/m-p/420449#M24042</guid>
      <dc:creator>Jorge_Gonzalez</dc:creator>
      <dc:date>2015-10-28T18:59:26Z</dc:date>
    </item>
    <item>
      <title>Re: Activating the swap flag creates a reboot</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Activating-the-swap-flag-creates-a-reboot/m-p/420450#M24043</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Jorge,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;the adress is defined as below :&lt;/P&gt;&lt;P&gt;#define FLASH_SWAP_INDICATOR_ADDR 0x7F000&amp;nbsp; //last sector of lower half&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Actually I have solved this issue but by putting _time_delay(50) after each call to PFlashSwapCtl. And I have been able to flash many times without any failure. But I am still curious about it, because I am evaluating the board for industrial purpose, and adding some delays is not a good sign by experience :-)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 30 Oct 2015 14:17:00 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Activating-the-swap-flag-creates-a-reboot/m-p/420450#M24043</guid>
      <dc:creator>samuelboivineau</dc:creator>
      <dc:date>2015-10-30T14:17:00Z</dc:date>
    </item>
    <item>
      <title>Re: Activating the swap flag creates a reboot</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Activating-the-swap-flag-creates-a-reboot/m-p/420451#M24044</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello samuel:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Good to know it is solved.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This may be a data synchronization issue. See the next interesting article about it:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/docs/DOC-95210" rel="nofollow noopener noreferrer" target="_blank"&gt;Serialization of memory operations and events&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Actually I found this code in the flash driver from MQX:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="plain" __jive_macro_name="code" class="jive_macro_code jive_text_macro _jivemacro_uid_14462285701091231" data-renderedposition="218_8_1050_560" jivemacro_uid="_14462285701091231"&gt;&lt;P&gt;/********************************************************************&lt;/P&gt;&lt;P&gt;*&lt;/P&gt;&lt;P&gt;* Code required to run in SRAM to perform flash commands.&lt;/P&gt;&lt;P&gt;* All else can be run in flash.&lt;/P&gt;&lt;P&gt;* Parameter is an address of flash status register and function to invalidate cache.&lt;/P&gt;&lt;P&gt;*&lt;/P&gt;&lt;P&gt;********************************************************************/&lt;/P&gt;&lt;P&gt;static void ftfe_ram_function&lt;/P&gt;&lt;P&gt;(&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [IN] Flash info structure */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile uint8_t *ftfe_fstat_ptr,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [IN] Pointer to function of invalidate cache*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void (* invalidate_cache)(volatile uint32_t)&lt;/P&gt;&lt;P&gt;)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* start flash write */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ftfe_fstat_ptr |= FTFE_FSTAT_CCIF_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* wait until execution complete */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (0 == ((*ftfe_fstat_ptr) &amp;amp; FTFE_FSTAT_CCIF_MASK))&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;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(invalidate_cache != NULL)&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; invalidate_cache((uint32_t)FLASHX_INVALIDATE_CACHE_ALL);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Flush the pipeline and ensures that all previous instructions are completed&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * before executing new instructions in flash */&lt;/P&gt;&lt;P&gt;#ifdef ISB&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISB();&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;#ifdef DSB&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DSB();&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;And the macros are defined like this:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="plain" __jive_macro_name="code" class="_jivemacro_uid_14462285836282647 jive_macro_code jive_text_macro" data-renderedposition="841_8_1050_32" jivemacro_uid="_14462285836282647"&gt;&lt;P&gt;#define ISB()&amp;nbsp;&amp;nbsp;&amp;nbsp; __asm volatile ("isb")&lt;/P&gt;&lt;P&gt;#define DSB()&amp;nbsp; __asm volatile ("dsb")&lt;/P&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;isb&lt;/STRONG&gt; and &lt;STRONG&gt;dsb&lt;/STRONG&gt; are instructions of the ARM core which help to synchronize code execution and data accesses to avoid undesired behaviors.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards!&lt;/P&gt;&lt;P&gt;Jorge Gonzalez&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 30 Oct 2015 18:09:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Activating-the-swap-flag-creates-a-reboot/m-p/420451#M24044</guid>
      <dc:creator>Jorge_Gonzalez</dc:creator>
      <dc:date>2015-10-30T18:09:45Z</dc:date>
    </item>
  </channel>
</rss>

