<?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: Writing 8 bit data on port in fastest way in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525739#M8375</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by mathseng on Thu Nov 07 17:47:24 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi Takashi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;After my earlier post, I reduced my code complexity by using macros (attached). (My other I/O macros are similar.)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Using my 100MHz logic analyzer, I was able to determine that using my macros, data appears on the output as:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;My code works for all port/pin combinations - pins can be consecutive or sparsely mapped, and cover 1 or both ports.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;First IO port changes:&amp;nbsp;&amp;nbsp;&amp;nbsp; port 0&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Second IO port changes:&amp;nbsp;&amp;nbsp; port 1 - displaced by 10nS or 20nS (probably jitter at max resolution of my analyzer)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; all test runs have port 1 displacement at identical times, ie all 10nS or all 20nS.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So, I am confident that only the setup time is the issue, but the PortIO writing times are almost as fast as possible.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ie 2 issues:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;+ data setup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - mine is long but consistent time, using Encode/Decode routine&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;+ I/O bit update&amp;nbsp;&amp;nbsp; - observed output shows effective IO operation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Bill&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My program code consists of essentially 2 lines of code, the first to map the internal data (whatever width) to the 64 bits of the 2 ports. The macro as written works because the ports use consecutive addresses. (Can't use same macro for port setup, since port addressing is 0..23/0..31, and setup bits are different, preventing similar complexity reduction).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The INV section is to support my ActiveLOW and ActiveHIGH outputs - keeping the logic separate from physical.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// LEDs are arranged in a particular order. This is the&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// mapping of the LEDs to the I/O ports in a portable manner&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#defineoLED8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ioBIT(1,31))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#defineoLED9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ioBIT(1,16))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#defineoLEDg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ioBIT(0,22))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#defineoLEDy&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ioBIT(0,21))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MASK_LED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((oLED8 | oLED9 | oLEDg | oLEDy))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MASK_LEDINV&amp;nbsp;&amp;nbsp; (oLEDy)&amp;nbsp;&amp;nbsp; // bits which are inverted on output&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#define ioBIT(port,bit)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( 1ULL &amp;lt;&amp;lt; (((port) ? (32) : (0)) + (bit)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define GPIO_PUT(mask, valu)&amp;nbsp;&amp;nbsp; ((*((uint64_t *)&amp;amp;(LPC_GPIO-&amp;gt;MASK)) = ~(mask)), (*((uint64_t *)&amp;amp;(LPC_GPIO-&amp;gt;MPIN)) = (valu)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Code is&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;uint64_t p01 = Encode(value);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;GPIO_PUT(MASK_LED, p01 ^ MASK_LEDINV);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 16:55:42 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T16:55:42Z</dc:date>
    <item>
      <title>Writing 8 bit data on port in fastest way</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525731#M8367</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by aamir ali on Mon Aug 12 04:48:46 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;What is the fastest way to write 8 bit data on continuous port pins.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Can't I write in one go. I didn't find data register for that.Only way I can find faster is use RMW.&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; temp = PIN&amp;amp; 0x000000ff;
temp = temp | (data &amp;amp; 0x000000ff);
PIN= data;
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;2. Also there is strct for GPIO in LPC13uxx.h&amp;nbsp; Now if I redine PIN[2] as &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;union
{
__IO uint32_t PIN[2]; 

struct
{
__IO uint8_t PIN_byte[8];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* get it in 8 byte format */ 
};
};&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Now write like:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;PIN_byte[0] = (uint8_t)data;&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am not sure if PIN register can be accessed in 8 bits. Is it correct way.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:55:37 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525731#M8367</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:55:37Z</dc:date>
    </item>
    <item>
      <title>Re: Writing 8 bit data on port in fastest way</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525732#M8368</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by mathseng on Tue Aug 13 04:05:26 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Some thoughts:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;a. Look at UM10524, section "9.6.5 Recommended practices".&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;b. Then, go back and look at whether using a MASK, by setting the mask register before writing the 'n' bits is the way you want to go, or if you can assemble bits and use the SET, CLR and NOT functionality.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;This document shows that PIN operations work only on ONE i/o bit, while PORT operations operate on the 32 bits of the port, or some subset if MASKED (9.6.3 Masked I/O).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:55:37 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525732#M8368</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:55:37Z</dc:date>
    </item>
    <item>
      <title>Re: Writing 8 bit data on port in fastest way</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525733#M8369</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by tmune on Tue Aug 13 19:37:02 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;My understanding of ARM addressing is that the processor can address, a word(32-bit), half word(16-bit), and byte.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;If the 8-bit is the least significant byte of GPIO Port0, you can do the followings;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;[list]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; // Setup a byte pointer to GPIO ls byte (of GPIO port pin registers)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;unsigned char *Port0LSByte = (unsigned char *)0x50002100;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*Port0LSByte = (unsigned char)0xFF;// Turn one byte on&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*Port0LSByte = (unsigned char)0x00;// all bits off&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;[/list]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Using LPC1347 xpresso board you'll see the LED turning on and off as you step through the code. GPIO0_4 and 0_5 do not give you high state because they are open drain outputs. The others toggle high and low.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;You have to set the port pins as output at the start.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Takashi&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:55:38 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525733#M8369</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:55:38Z</dc:date>
    </item>
    <item>
      <title>Re: Writing 8 bit data on port in fastest way</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525734#M8370</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by mathseng on Wed Aug 21 16:58:34 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;If your 8 bits are either non-contiguous, or cross the PORT boundary, you can do the following, which uses the mask register and full word writes. The MASK is not required on READs, but is required on WRITEs.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I have yet to test whether the write occurs in the same system clock tick for both PORTs (0,1).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Since your bits are all contiguous, your code may be simpler, ie a whole byte could be inserted across word boundaries in single shift operation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;HTH,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Bill.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;pXX# = port number for XX on LPC, bit #&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;bXX# = bit number on LPC&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;eg:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define pSW0( 0 )&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define bSW0(&amp;nbsp; 7 )&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define pSW1( 1 )&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define bSW1( 19 )&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#define pLED0( 0)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define bLED0( 23 )&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define pLED1( 1)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define bLED1( 22 )&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define pLED9( 1 )&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define bLED9( 16 )&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MASK_LEDp0(1&amp;lt;&amp;lt;bLED0 | 1&amp;lt;&amp;lt;bLEDg | 1&amp;lt;&amp;lt;bLEDy)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MASK_LEDp1(1&amp;lt;&amp;lt;bLED1 | 1&amp;lt;&amp;lt;bLED2 | 1&amp;lt;&amp;lt;bLED3 | 1&amp;lt;&amp;lt;bLED4 | 1&amp;lt;&amp;lt;bLED5 | 1&amp;lt;&amp;lt;bLED6 | 1&amp;lt;&amp;lt;bLED7 | 1&amp;lt;&amp;lt;bLED8 | 1&amp;lt;&amp;lt;bLED9)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MASK_LEDp01(((unsigned long long)MASK_LEDp1 &amp;lt;&amp;lt; 32) | MASK_LEDp0)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;uint32_t getSwitchValuesW(void)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;uint64_t *pMPIN = (uint64_t *)&amp;amp;(LPC_GPIO-&amp;gt;MPIN);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;uint32_t sw = 0; // reading the bits into a word in correct bit order for use in program.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;sw |= *pMPIN &amp;amp; ( 1ULL &amp;lt;&amp;lt; ((pSW0 ? (32) : (0)) + bSW0)) ? ( 1 &amp;lt;&amp;lt;&amp;nbsp; 0) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;sw |= *pMPIN &amp;amp; ( 1ULL &amp;lt;&amp;lt; ((pSW1 ? (32) : (0)) + bSW1)) ? ( 1 &amp;lt;&amp;lt;&amp;nbsp; 1) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;sw |= *pMPIN &amp;amp; ( 1ULL &amp;lt;&amp;lt; ((pSW2 ? (32) : (0)) + bSW2)) ? ( 1 &amp;lt;&amp;lt;&amp;nbsp; 2) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;sw |= *pMPIN &amp;amp; ( 1ULL &amp;lt;&amp;lt; ((pSW3 ? (32) : (0)) + bSW3)) ? ( 1 &amp;lt;&amp;lt;&amp;nbsp; 3) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;sw |= *pMPIN &amp;amp; ( 1ULL &amp;lt;&amp;lt; ((pSW4 ? (32) : (0)) + bSW4)) ? ( 1 &amp;lt;&amp;lt;&amp;nbsp; 4) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;sw |= *pMPIN &amp;amp; ( 1ULL &amp;lt;&amp;lt; ((pSW5 ? (32) : (0)) + bSW5)) ? ( 1 &amp;lt;&amp;lt;&amp;nbsp; 5) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;sw |= *pMPIN &amp;amp; ( 1ULL &amp;lt;&amp;lt; ((pSW6 ? (32) : (0)) + bSW6)) ? ( 1 &amp;lt;&amp;lt;&amp;nbsp; 6) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;sw |= *pMPIN &amp;amp; ( 1ULL &amp;lt;&amp;lt; ((pSW7 ? (32) : (0)) + bSW7)) ? ( 1 &amp;lt;&amp;lt;&amp;nbsp; 7) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;return sw;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;void ledsOnOffW(uint32_t values)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;uint64_t p01 = 0; // port bit accumulator, creating the bit pattern to be presented to LPC chip&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;uint64_t *pMPIN = (uint64_t *)&amp;amp;(LPC_GPIO-&amp;gt;MPIN);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;uint64_t *pMASK = (uint64_t *)&amp;amp;(LPC_GPIO-&amp;gt;MASK);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;p01 |= values &amp;amp; ( 1 &amp;lt;&amp;lt;&amp;nbsp; 0) ? ( 1ULL &amp;lt;&amp;lt; ((pLED0 ? (32) : (0)) + bLED0)) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;p01 |= values &amp;amp; ( 1 &amp;lt;&amp;lt;&amp;nbsp; 1) ? ( 1ULL &amp;lt;&amp;lt; ((pLED1 ? (32) : (0)) + bLED1)) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;p01 |= values &amp;amp; ( 1 &amp;lt;&amp;lt;&amp;nbsp; 2) ? ( 1ULL &amp;lt;&amp;lt; ((pLED2 ? (32) : (0)) + bLED2)) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;p01 |= values &amp;amp; ( 1 &amp;lt;&amp;lt;&amp;nbsp; 3) ? ( 1ULL &amp;lt;&amp;lt; ((pLED3 ? (32) : (0)) + bLED3)) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;p01 |= values &amp;amp; ( 1 &amp;lt;&amp;lt;&amp;nbsp; 4) ? ( 1ULL &amp;lt;&amp;lt; ((pLED4 ? (32) : (0)) + bLED4)) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;p01 |= values &amp;amp; ( 1 &amp;lt;&amp;lt;&amp;nbsp; 5) ? ( 1ULL &amp;lt;&amp;lt; ((pLED5 ? (32) : (0)) + bLED5)) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;p01 |= values &amp;amp; ( 1 &amp;lt;&amp;lt;&amp;nbsp; 6) ? ( 1ULL &amp;lt;&amp;lt; ((pLED6 ? (32) : (0)) + bLED6)) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;p01 |= values &amp;amp; ( 1 &amp;lt;&amp;lt;&amp;nbsp; 7) ? ( 1ULL &amp;lt;&amp;lt; ((pLED7 ? (32) : (0)) + bLED7)) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;p01 |= values &amp;amp; ( 1 &amp;lt;&amp;lt;&amp;nbsp; 8) ? ( 1ULL &amp;lt;&amp;lt; ((pLED8 ? (32) : (0)) + bLED8)) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;p01 |= values &amp;amp; ( 1 &amp;lt;&amp;lt;&amp;nbsp; 9) ? ( 1ULL &amp;lt;&amp;lt; ((pLED9 ? (32) : (0)) + bLED9)) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;p01 |= values &amp;amp; ( 1 &amp;lt;&amp;lt; 10) ? ( 1ULL &amp;lt;&amp;lt; ((pLEDg ? (32) : (0)) + bLEDg)) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;p01 |= values &amp;amp; ( 1 &amp;lt;&amp;lt; 11) ? ( 1ULL &amp;lt;&amp;lt; ((pLEDy ? (32) : (0)) + bLEDy)) : 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*pMASK = ~MASK_LEDp01; // mask of all the LEDs bits which are defined in this array&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*pMPIN = p01;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:55:39 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525734#M8370</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:55:39Z</dc:date>
    </item>
    <item>
      <title>Re: Writing 8 bit data on port in fastest way</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525735#M8371</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by mathseng on Wed Aug 21 23:01:46 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;My code was truncated in display.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Attached is file containing the code sample.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Also, the reading should be done to the PIN register, not the MPIN register.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(This worked on my code because of other MASK settings I did :( )&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; Bill.&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:55:39 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525735#M8371</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:55:39Z</dc:date>
    </item>
    <item>
      <title>Re: Writing 8 bit data on port in fastest way</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525736#M8372</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by tmune on Thu Aug 22 11:15:40 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I think there is no API/Drivers to write multiple bits in one shot in lpcopen v1.03.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;BTW regarding to writing bits to a port,I have one question on how lpcopen writes a bit, particularly Chip_GPIO_WritePortBit() in &lt;/SPAN&gt;&lt;A href="http://http://docs.lpcware.com/lpcopen/v1.03/group___g_p_i_o__13_x_x.html"&gt;LPC13xx GPIO Driver&lt;/A&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I found out that it eventually leads to pGPIO-&amp;gt;B[Port][Bit] = Setting; in gpio_001.h file.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This file also has a struct definition includes this definiton:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;__IO uint8_t B[128][32];/*!&amp;lt; Offset 0x0000: Byte pin registers ports 0 to n; pins PIOn_0 to PIOn_31 */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;My quetion(s) is "Is this a 128X32=4096 pointer table, which is 4096 X 4(bytes = 32 bits)=16k bytes?". Or is it just a code, not produce a table, and its size is very small?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;If it is a table, can it be B[2][32] to just enough for port 0 and 1?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Takashi&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:55:40 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525736#M8372</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:55:40Z</dc:date>
    </item>
    <item>
      <title>Re: Writing 8 bit data on port in fastest way</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525737#M8373</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by tmune on Fri Aug 23 00:01:51 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I found out the code doesn't use tables at all. The assembler code of chip_GPIO_WritePortBit() is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;[list]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP_GPIO_WritePortBit:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004a0:&amp;nbsp;&amp;nbsp;&amp;nbsp; push {r7} &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004a2:&amp;nbsp;&amp;nbsp;&amp;nbsp; sub sp, #20&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004a4:&amp;nbsp;&amp;nbsp;&amp;nbsp; add r7, sp, #0&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004a6:&amp;nbsp;&amp;nbsp;&amp;nbsp; str r0, [r7, #12]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004a8:&amp;nbsp;&amp;nbsp;&amp;nbsp; str r1, [r7, #8]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004aa:&amp;nbsp;&amp;nbsp;&amp;nbsp; strb r2, [r7, #7]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004ac:&amp;nbsp;&amp;nbsp;&amp;nbsp; strb r3, [r7, #6]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004ae:&amp;nbsp;&amp;nbsp;&amp;nbsp; ldrb r3, [r7, #7]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004b0:&amp;nbsp;&amp;nbsp;&amp;nbsp; ldrb r2, [r7, #6]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004b2:&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr r1, [r7, #12]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004b4:&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr r0, [r7, #8]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004b6:&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.w r0, r0, lsl #5&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004ba:&amp;nbsp;&amp;nbsp;&amp;nbsp; adds r3, r0, r3&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004bc:&amp;nbsp;&amp;nbsp;&amp;nbsp; adds r3, r1, r3&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004be:&amp;nbsp;&amp;nbsp;&amp;nbsp; strb r2, [r3, #0]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004c0:&amp;nbsp;&amp;nbsp;&amp;nbsp; add.w r7, r7, #20&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004c4:&amp;nbsp;&amp;nbsp;&amp;nbsp; mov sp, r7&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004c6:&amp;nbsp;&amp;nbsp;&amp;nbsp; pop {r7} &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004c8:&amp;nbsp;&amp;nbsp;&amp;nbsp; bx lr &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;000004ca:&amp;nbsp;&amp;nbsp;&amp;nbsp; nop &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;[/list] &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm not familiar with ARM assembly, but I think it write one byte data to one of Byte pin register.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Takashi&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:55:41 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525737#M8373</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:55:41Z</dc:date>
    </item>
    <item>
      <title>Re: Writing 8 bit data on port in fastest way</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525738#M8374</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by mathseng on Fri Aug 23 04:11:07 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;maybe this will help with deciphering the structure for the port bits, and give the understanding necessary to create macros/etc.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN&gt;This mapping of bits to bytes/short/word is bit-banding - a one page reference can be found at &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Finfocenter.arm.com%2Fhelp%2Findex.jsp%3Ftopic%3D%2Fcom.arm.doc.ddi0337h%2FBehcjiic.html" rel="nofollow" target="_blank"&gt;http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337h/Behcjiic.html&lt;/A&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN&gt;A more in-depth reference is at &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.scribd.com%2Fdoc%2F30063713%2FThe-Definitive-Guide-to-the-ARM-Cortex-M3-2010" rel="nofollow" target="_blank"&gt;http://www.scribd.com/doc/30063713/The-Definitive-Guide-to-the-ARM-Cortex-M3-2010&lt;/A&gt;&lt;SPAN&gt; - Chapter 5 page 79. Fig 5.1 shows clearly the aliased regions, section 5.5 describes access to regions.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;To see the effect of writing bits to the output ports, I set up a simple R-2R circuit to create a DAC (ie bit changes will be visible on a storage CRO) on a number of ports, some contiguous, some in different ports. This way, I don't need to know my assembler. (I haven't yet captured the output results to see which writes are on the same machine cycle - it's not important at this stage of our project, and the timing is only necessary to be accurate down to 1mS.)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Bill.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:55:42 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525738#M8374</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:55:42Z</dc:date>
    </item>
    <item>
      <title>Re: Writing 8 bit data on port in fastest way</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525739#M8375</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by mathseng on Thu Nov 07 17:47:24 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi Takashi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;After my earlier post, I reduced my code complexity by using macros (attached). (My other I/O macros are similar.)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Using my 100MHz logic analyzer, I was able to determine that using my macros, data appears on the output as:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;My code works for all port/pin combinations - pins can be consecutive or sparsely mapped, and cover 1 or both ports.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;First IO port changes:&amp;nbsp;&amp;nbsp;&amp;nbsp; port 0&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Second IO port changes:&amp;nbsp;&amp;nbsp; port 1 - displaced by 10nS or 20nS (probably jitter at max resolution of my analyzer)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; all test runs have port 1 displacement at identical times, ie all 10nS or all 20nS.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So, I am confident that only the setup time is the issue, but the PortIO writing times are almost as fast as possible.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ie 2 issues:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;+ data setup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - mine is long but consistent time, using Encode/Decode routine&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;+ I/O bit update&amp;nbsp;&amp;nbsp; - observed output shows effective IO operation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Bill&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My program code consists of essentially 2 lines of code, the first to map the internal data (whatever width) to the 64 bits of the 2 ports. The macro as written works because the ports use consecutive addresses. (Can't use same macro for port setup, since port addressing is 0..23/0..31, and setup bits are different, preventing similar complexity reduction).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The INV section is to support my ActiveLOW and ActiveHIGH outputs - keeping the logic separate from physical.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// LEDs are arranged in a particular order. This is the&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// mapping of the LEDs to the I/O ports in a portable manner&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#defineoLED8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ioBIT(1,31))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#defineoLED9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ioBIT(1,16))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#defineoLEDg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ioBIT(0,22))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#defineoLEDy&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ioBIT(0,21))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MASK_LED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((oLED8 | oLED9 | oLEDg | oLEDy))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MASK_LEDINV&amp;nbsp;&amp;nbsp; (oLEDy)&amp;nbsp;&amp;nbsp; // bits which are inverted on output&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#define ioBIT(port,bit)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( 1ULL &amp;lt;&amp;lt; (((port) ? (32) : (0)) + (bit)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define GPIO_PUT(mask, valu)&amp;nbsp;&amp;nbsp; ((*((uint64_t *)&amp;amp;(LPC_GPIO-&amp;gt;MASK)) = ~(mask)), (*((uint64_t *)&amp;amp;(LPC_GPIO-&amp;gt;MPIN)) = (valu)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Code is&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;uint64_t p01 = Encode(value);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;GPIO_PUT(MASK_LED, p01 ^ MASK_LEDINV);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:55:42 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Writing-8-bit-data-on-port-in-fastest-way/m-p/525739#M8375</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:55:42Z</dc:date>
    </item>
  </channel>
</rss>

