<?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: Lpc43xx uart baudrate calculation in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/Lpc43xx-uart-baudrate-calculation/m-p/593581#M22527</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by starblue on Thu Apr 23 00:47:47 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;These are just different ways of rounding the result of the division:&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;
    tmp = baudrate * 16;
    div = (clkin + 0) / tmp;
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;SPAN&gt;always rounds down.&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;
    tmp = baudrate * 16;
    div = (clkin + tmp/2) / tmp;
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;SPAN&gt;rounds to the nearest integer (IMHO best for your purpose).&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;
    tmp = baudrate * 16;
    div = (clkin + tmp - 1) / tmp;
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;SPAN&gt;rounds up.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Rounding up or down may be useful if you need upper or lower bounds instead of a close approximation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;But you should do the math how much deviation from the true value you get and check whether that is precise enough for your application.&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 19:20:14 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T19:20:14Z</dc:date>
    <item>
      <title>Lpc43xx uart baudrate calculation</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Lpc43xx-uart-baudrate-calculation/m-p/593580#M22526</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by JoeM on Thu Apr 23 00:03:08 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Using an NGX Xplorer with Lpc4330 and driving Uart0 at 1 MBaud for some debug output.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Currently using Lpcopen 2.12 and Lpcxpresso.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Configuring Uart0 to 1 MBaud won't work because of a rounding error within the baudrate calculation in Chip_UART_SetBaud().&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Originally Chip_UART_SetBaud() code:&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 Chip_UART_SetBaud(LPC_USART_T* pUART, uint32_t baudrate) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t div, divh, divl, clkin;

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Determine UART clock in rate without FDR */
&amp;nbsp;&amp;nbsp;&amp;nbsp; clkin = Chip_Clock_GetRate(UART_BClock[Chip_UART_GetIndex(pUART)]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; div = clkin / (baudrate * 16);

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* High and low halves of the divider */
&amp;nbsp;&amp;nbsp;&amp;nbsp; divh = div / 256;
&amp;nbsp;&amp;nbsp;&amp;nbsp; divl = div - (divh * 256);

&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_UART_EnableDivisorAccess(pUART);
&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_UART_SetDivisorLatches(pUART, divl, divh);
&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_UART_DisableDivisorAccess(pUART);

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Fractional FDR alreadt setup for 1 in UART init */
&amp;nbsp;&amp;nbsp;&amp;nbsp; return clkin / div;
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;IMHO, the errornous part resists in the statement&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;    div = clkin / (baudrate * 16);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;and changing that to something like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;    tmp = baudrate * 16;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;    div = (clkin + tmp/2) / tmp;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;make it work for e.g. 921,6 kBaud and 1 MBaud.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;But now, another colleague says that it better has to be changed to:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;    tmp = baudrate * 16;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;    div = (clkin + (tmp - 1)) / tmp;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;What is the best / most correct way for calculating the Uart baudrate?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;BTW: The errornous calculation can be found both in Lpcopen 2.12 and 2.16.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:20:13 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Lpc43xx-uart-baudrate-calculation/m-p/593580#M22526</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:20:13Z</dc:date>
    </item>
    <item>
      <title>Re: Lpc43xx uart baudrate calculation</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Lpc43xx-uart-baudrate-calculation/m-p/593581#M22527</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by starblue on Thu Apr 23 00:47:47 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;These are just different ways of rounding the result of the division:&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;
    tmp = baudrate * 16;
    div = (clkin + 0) / tmp;
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;SPAN&gt;always rounds down.&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;
    tmp = baudrate * 16;
    div = (clkin + tmp/2) / tmp;
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;SPAN&gt;rounds to the nearest integer (IMHO best for your purpose).&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;
    tmp = baudrate * 16;
    div = (clkin + tmp - 1) / tmp;
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;SPAN&gt;rounds up.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Rounding up or down may be useful if you need upper or lower bounds instead of a close approximation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;But you should do the math how much deviation from the true value you get and check whether that is precise enough for your application.&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:20:14 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Lpc43xx-uart-baudrate-calculation/m-p/593581#M22527</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:20:14Z</dc:date>
    </item>
  </channel>
</rss>

