<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>UARTE driver from scratch</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/26845/uarte-driver-from-scratch</link><description>#include &amp;quot;nrf_delay.h&amp;quot;
#include &amp;quot;nrf_gpio.h&amp;quot;



#define SETB(x,y) (x|=(1&amp;lt;&amp;lt;y)) //for o/p
#define CLRB(x,y) (x&amp;amp;=(~(1&amp;lt;&amp;lt;y))) //for o/p
#define TGLB(x,y) (x^=(1&amp;lt;&amp;lt;y)) //for o/p
#define CHECKB(x,y) (x&amp;amp;(1&amp;lt;&amp;lt;y)) //for i/p


#define SERIAL_BUFFER_SIZE</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 13 Nov 2017 11:34:22 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/26845/uarte-driver-from-scratch" /><item><title>RE: UARTE driver from scratch</title><link>https://devzone.nordicsemi.com/thread/105523?ContentTypeID=1</link><pubDate>Mon, 13 Nov 2017 11:34:22 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b7947e00-9c0a-4561-8172-275c36fb7090</guid><dc:creator>vikrant8051</dc:creator><description>&lt;p&gt;This is answer to my own Question. This working code for UARTE.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;quot;nrf_delay.h&amp;quot;
#include &amp;quot;nrf_gpio.h&amp;quot;
#include &amp;quot;nrf_uart.h&amp;quot;


#define  SETB(x,y)   (x|=(1&amp;lt;&amp;lt;y))     //for o/p
#define  CLRB(x,y)   (x&amp;amp;=(~(1&amp;lt;&amp;lt;y)))  //for o/p
#define  TGLB(x,y)   (x^=(1&amp;lt;&amp;lt;y))     //for o/p
#define  CHECKB(x,y) (x&amp;amp;(1&amp;lt;&amp;lt;y))      //for i/p


#define SERIAL_BUFFER_SIZE 256


typedef struct
{
  volatile unsigned char buffer[SERIAL_BUFFER_SIZE];
  volatile unsigned int head;
}ring_buffer;



ring_buffer rx_buffer;
ring_buffer tx_buffer;


void UARTE0_UART0_IRQHandler(void)
{
  /*
  if(NRF_UARTE0-&amp;gt;EVENTS_TXDRDY == 1)
  {
    NRF_UARTE0-&amp;gt;EVENTS_TXDRDY=0;
    
  }
  */

  
  if(NRF_UARTE0-&amp;gt;EVENTS_ENDTX == 1)
  {
    NRF_UARTE0-&amp;gt;EVENTS_ENDTX = 0;
    NRF_UARTE0-&amp;gt;TASKS_STOPTX = 1;
  }
  
 
  /*
  if(NRF_UARTE0-&amp;gt;EVENTS_TXSTARTED == 1)
  {
    NRF_UARTE0-&amp;gt;EVENTS_TXSTARTED = 0;
  }
  */
  
  /*
  if(NRF_UARTE0-&amp;gt;EVENTS_TXSTOPPED == 1)
  {
    //NRF_UARTE0-&amp;gt;EVENTS_TXSTOPPED = 0;
  }
  */

}


void uart_init()
{
   
    NRF_UARTE0-&amp;gt;BAUDRATE = 0x01D60000;
    //NRF_UARTE0-&amp;gt;CONFIG = 0x00000001;

    NRF_UARTE0-&amp;gt;PSEL.RTS = 5;
    NRF_UARTE0-&amp;gt;PSEL.TXD = 6;
    NRF_UARTE0-&amp;gt;PSEL.CTS = 7;
    NRF_UARTE0-&amp;gt;PSEL.RXD = 8;
    
    nrf_gpio_cfg_output(6);
    nrf_gpio_cfg_input(8, GPIO_PIN_CNF_PULL_Disabled);

    nrf_gpio_cfg_output(5);
    nrf_gpio_cfg_input(7, GPIO_PIN_CNF_PULL_Disabled);
     
    NRF_UARTE0-&amp;gt;EVENTS_ENDTX=0;
    NRF_UARTE0-&amp;gt;EVENTS_TXDRDY=0;
    NRF_UARTE0-&amp;gt;EVENTS_TXSTARTED=0;

    //NRF_UARTE0-&amp;gt;TASKS_STARTTX = 1;
    //NRF_UARTE0-&amp;gt;TASKS_STARTRX = 1;

    NRF_UARTE0-&amp;gt;INTENSET |= (0&amp;lt;&amp;lt;22)|(0&amp;lt;&amp;lt;20)|(1&amp;lt;&amp;lt;8)|(0&amp;lt;&amp;lt;7)|(1&amp;lt;&amp;lt;2);
  
    NRF_UARTE0-&amp;gt;ENABLE = 0x00000008;
    
    NVIC_EnableIRQ(UARTE0_UART0_IRQn);
    
}


void serial_write_irq(unsigned char c)
{
  int i = (tx_buffer.head + 1) % SERIAL_BUFFER_SIZE;
 
  tx_buffer.buffer[tx_buffer.head] = c;
  tx_buffer.head = i;

}

void serial_write_string(char *pointer)
{

  tx_buffer.head = 0;

  while(*pointer!=&amp;#39;\0&amp;#39;)
  {
    serial_write_irq(*pointer);
    pointer++;
  }

  NRF_UARTE0-&amp;gt;EVENTS_ENDTX=0;
  NRF_UARTE0-&amp;gt;EVENTS_TXSTOPPED = 0;

  NRF_UARTE0-&amp;gt;TXD.PTR=(uint32_t)&amp;amp;tx_buffer.buffer[0];
  NRF_UARTE0-&amp;gt;TXD.MAXCNT=tx_buffer.head;

  NRF_UARTE0-&amp;gt;TASKS_STARTTX = 1;
 
  while(NRF_UARTE0-&amp;gt;EVENTS_ENDTX == 0 &amp;amp;&amp;amp; NRF_UARTE0-&amp;gt;EVENTS_TXSTOPPED == 0){}

}

void serial_no(long int n) 
{
  char c;
  char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
  char *str = &amp;amp;buf[sizeof(buf) - 1];
  unsigned long int m;

  *str = &amp;#39;\0&amp;#39;;
  
  if(n&amp;lt;0)
  {
     n=-n;
     serial_write_string(&amp;quot;-&amp;quot;);
  }

  do 
  {
    m = n;
    n /= 10;
    c = m - 10 * n;
    
    *--str = c &amp;lt; 10 ? c + &amp;#39;0&amp;#39; : c + &amp;#39;A&amp;#39; - 10;
    
  } while(n);

  serial_write_string(str);
}

int main(void)
{
  int foo=-1000;

  NRF_P0-&amp;gt;DIR |= 0x0001E000;
  NRF_P0-&amp;gt;OUTSET |= 0x0001E000;

  NRF_P0-&amp;gt;PIN_CNF[11]=0x0000000C;

  uart_init();

  while(1) 
  {
 
    NRF_P0-&amp;gt;OUT^=0x00002000;
 
    serial_write_string(&amp;quot;Hello World &amp;quot;);
    serial_no(foo++);
    serial_write_string(&amp;quot;\n\r&amp;quot;);
    //nrf_delay_ms(50);

    if(CHECKB(NRF_P0-&amp;gt;IN,11)==0)
    {
       
      serial_write_string(&amp;quot;Button Pressed !!\n\r&amp;quot;);

      NRF_P0-&amp;gt;OUT &amp;amp;= ~(1&amp;lt;&amp;lt;16);

      while(CHECKB(NRF_P0-&amp;gt;IN,11)==0){}

      NRF_P0-&amp;gt;OUT |= (1&amp;lt;&amp;lt;16);

      foo=0;

    }

  }

  return(0);

}
&lt;/code&gt;&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>