<?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:  LPC4357 IAP bootloader - working only with ULink Pro in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-IAP-bootloader-working-only-with-ULink-Pro/m-p/590538#M22080</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by daysacha on Thu Aug 14 10:11:10 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;You need to issue the IAP initialisation command before doing anything with the LPC43xx flash. It seems that a lot of the newer devices do not need it though, so NXP left this out of their example code. See the user manual and this bug report... &lt;/SPAN&gt;&lt;A href="http://http://www.lpcware.com/content/bugtrackerissue/lpc43xx-and-lpc18xx-flash-programming-functions-incomplete"&gt;LPC43xx and LPC18xx Flash programming functions incomplete&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The ULINK uses IAP so will have issued this command for you. Flashmagic uses ISP so will not have(probably). This may be why it only works after programming with the ULINK. I'm guessing that once it is issued the flash remains 'prepared' until the device is reset. Don't rely on this though.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I hope this helps.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Sacha.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 19:16:01 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T19:16:01Z</dc:date>
    <item>
      <title>LPC4357 IAP bootloader - working only with ULink Pro</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-IAP-bootloader-working-only-with-ULink-Pro/m-p/590536#M22078</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by TP on Thu Aug 14 02:24:21 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm writing bootloader for LPC4357. Bootloader is located at address 0x1A000000 and application binary image resides in external SPIFI FLASH.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;After MCU finishes copying image into internal FLASH at address 0x1A010000, jump command is executed and application starts. This is only true if I use Ulink Pro for code download and testing. If i use Flash Magic, bootloader hangs at first IAP write operation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm using Keil MDK ARM 4.73. LPC4537 is running at 204 MHz. I'm not using RAM reserved for IAP operations. All IAP operations are completed successfully if I use Ulink Pro for download &amp;amp; run.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If I don't use IAP commands, code is working fine, regardless of programming tool used.I don't have any special code inside UlinkPro INI script, just issuing reset. I've tried adding equivalent code inside SystemInit() function but there is no difference in code behavior.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Is there any special requirement before using IAP on LPC43xx platform?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I've build bootloader for LPC1768 platform and everything works as it should. I don't have ULink Pro on that board.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;

uint32_t write_data (uint32_t cclk, uint32_t flash_address, uint32_t *flash_data_buf, uint32_t count)
{
&amp;nbsp;&amp;nbsp; uint32_t i, ret, interrupts;

&amp;nbsp;&amp;nbsp; disable_interrupts(interrupts);

&amp;nbsp;&amp;nbsp; for (i = USER_START_SECTOR; i &amp;lt;= MAX_USER_SECTOR; i++)
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (flash_address &amp;lt; sector_end_map&lt;I&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; if (flash_address == sector_start_map&lt;I&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; if ((ret = prepare_sector(i,i,cclk)) != 0)
&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; printf("prepare for erase failed (%d)\n", ret);
&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; while(1);
&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; WaitUs(1000 * 250); // not needed

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((ret = erase_sector(i,i,cclk)) != 0)
&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; printf("erase sector failed (%d)\n", ret);
&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; while(1);
&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; if ((ret = prepare_sector(i,i,cclk)) != 0)
&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; printf("prepare for write failed (%d)\n", ret);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1);
&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; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp; param_table[0] = COPY_RAM_TO_FLASH;
&amp;nbsp;&amp;nbsp; param_table[1] = flash_address;
&amp;nbsp;&amp;nbsp; param_table[2] = (uint32_t) flash_data_buf;
&amp;nbsp;&amp;nbsp; param_table[3] = count;
&amp;nbsp;&amp;nbsp; param_table[4] = cclk;

&amp;nbsp;&amp;nbsp; iap_entry(param_table,result_table);

&amp;nbsp;&amp;nbsp; enable_interrupts(interrupts);

&amp;nbsp;&amp;nbsp; return result_table[0];
}

uint32_t erase_sector (uint32_t start_sector,uint32_t end_sector,uint32_t cclk)
{
&amp;nbsp;&amp;nbsp; param_table[0] = ERASE_SECTOR;
&amp;nbsp;&amp;nbsp; param_table[1] = start_sector;
&amp;nbsp;&amp;nbsp; param_table[2] = end_sector;
&amp;nbsp;&amp;nbsp; param_table[3] = cclk;
&amp;nbsp;&amp;nbsp; param_table[4] = FLASH_BANK;
&amp;nbsp;&amp;nbsp; iap_entry(param_table,result_table);

&amp;nbsp;&amp;nbsp; return result_table[0];
}

uint32_t prepare_sector (uint32_t start_sector,uint32_t end_sector,uint32_t cclk)
{
&amp;nbsp;&amp;nbsp; disable_interrupts(0);

&amp;nbsp;&amp;nbsp; param_table[0] = PREPARE_SECTOR_FOR_WRITE;
&amp;nbsp;&amp;nbsp; param_table[1] = start_sector;
&amp;nbsp;&amp;nbsp; param_table[2] = end_sector;
&amp;nbsp;&amp;nbsp; param_table[3] = FLASH_BANK;
&amp;nbsp;&amp;nbsp; iap_entry(param_table,result_table);

&amp;nbsp;&amp;nbsp; enable_interrupts(0);

&amp;nbsp;&amp;nbsp; return result_table[0];
}

&lt;/I&gt;&lt;/I&gt;&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
// UlinkPro INI script

FUNC void Setup (void)
{
&amp;nbsp; // Reset peripherals: LCD, USB0, USB1, DMA, SDIO, ETHERNET
&amp;nbsp; _WDWORD(0x40053100, 0x005F0000);&amp;nbsp;&amp;nbsp; // Issue reset
&amp;nbsp; _sleep_(1);
}

Setup();&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; // Setup for Running
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:15:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-IAP-bootloader-working-only-with-ULink-Pro/m-p/590536#M22078</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:15:59Z</dc:date>
    </item>
    <item>
      <title>Re:  LPC4357 IAP bootloader - working only with ULink Pro</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-IAP-bootloader-working-only-with-ULink-Pro/m-p/590537#M22079</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by otscherw on Thu Aug 14 08:01:11 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Just a guess: as far as I know the COPY_RAM_TO_FLASH call expects that the data buffer (here flash_data_buf) is located in internal RAM. If this is not the case, you have to copy the data chuck to internal RAM before.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Oliver&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:16:00 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-IAP-bootloader-working-only-with-ULink-Pro/m-p/590537#M22079</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:16:00Z</dc:date>
    </item>
    <item>
      <title>Re:  LPC4357 IAP bootloader - working only with ULink Pro</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-IAP-bootloader-working-only-with-ULink-Pro/m-p/590538#M22080</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by daysacha on Thu Aug 14 10:11:10 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;You need to issue the IAP initialisation command before doing anything with the LPC43xx flash. It seems that a lot of the newer devices do not need it though, so NXP left this out of their example code. See the user manual and this bug report... &lt;/SPAN&gt;&lt;A href="http://http://www.lpcware.com/content/bugtrackerissue/lpc43xx-and-lpc18xx-flash-programming-functions-incomplete"&gt;LPC43xx and LPC18xx Flash programming functions incomplete&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The ULINK uses IAP so will have issued this command for you. Flashmagic uses ISP so will not have(probably). This may be why it only works after programming with the ULINK. I'm guessing that once it is issued the flash remains 'prepared' until the device is reset. Don't rely on this though.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I hope this helps.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Sacha.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:16:01 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-IAP-bootloader-working-only-with-ULink-Pro/m-p/590538#M22080</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:16:01Z</dc:date>
    </item>
    <item>
      <title>Re:  LPC4357 IAP bootloader - working only with ULink Pro</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-IAP-bootloader-working-only-with-ULink-Pro/m-p/590539#M22081</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by TP on Fri Aug 15 14:47:45 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Thank you Sacha,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;that was exactly what I needed. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:16:02 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-IAP-bootloader-working-only-with-ULink-Pro/m-p/590539#M22081</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:16:02Z</dc:date>
    </item>
  </channel>
</rss>

