<?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: UART1 Garbage value problem in TWR-K20D50M Board using KEIL uvision 4 in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228347#M4725</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Amit,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I looked into your code above, it should be ok, but I found you use this line as below to initialize the UART1：&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;UART1_init(50000, 38400);&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #339966;"&gt;// System clock frequency, Baud rate&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #339966;"&gt;If you dont configure MCG out of reset, the default output is 23986176Hz, nearly 24MHz, not 50MHz, but you can not use 24000KHz to calculate the baudrate either, you should use &lt;SPAN style="color: #339966; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;23986176Hz&lt;/SPAN&gt; in the calculation, and for your latest test, seems you used the fast IRC as the system clock, but it is not trimmed precisely, which would cause the same problem. so it is recommended to configure MCG in PEE mode (PLL active in that case) to get the system clock that you needed.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #339966;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #339966;"&gt;Hope that helps,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #339966;"&gt;B.R&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #339966;"&gt;Kan&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 13 Sep 2013 07:04:07 GMT</pubDate>
    <dc:creator>Kan_Li</dc:creator>
    <dc:date>2013-09-13T07:04:07Z</dc:date>
    <item>
      <title>UART1 Garbage value problem in TWR-K20D50M Board using KEIL uvision 4</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228342#M4720</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello&lt;/P&gt;&lt;P&gt;I have made the simplest code for UART1 for just sending a character through the UART1 (PTE0, PTE1)&amp;nbsp; and receiving it back, Using TWR-K20D50M board. when I am sending any character I am receiving garbage values corresponding to each button press. for some characters I am getting exact values like for a, A, t, T but for others I am getting some other characters. I am using KEIL uvision4 MDK. I am posting the code below. I think the problem is of Baud rate but not very sure how to rectify it. I have changed the baud rate on both P&amp;amp;E virtual serial toolkit as well as in my code but it didn't worked.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;/*****************************************************************************&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROJECT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp;&amp;nbsp; UART 1&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOARD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp;&amp;nbsp; TWR-K20D50M (Freescale)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AUTHOR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp;&amp;nbsp; Amit Kumar&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DATE&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; 12/09/2013&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;*****************************************************************************/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#include&amp;lt;MK20D5.H&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt;// Header file&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;/*****************************************************************************&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;* Function to initialize Gate Clock&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;******************************************************************************/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void GateClock_Init(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM-&amp;gt;SOPT5 |= SIM_SOPT5_UART1RXSRC(0);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt;// UART Rx pin for receiving&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM-&amp;gt;SCGC5 |= SIM_SCGC5_PORTE_MASK;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt; // Enabling Clock gate control to PORT E&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTE-&amp;gt;PCR[0] |= PORT_PCR_MUX(3);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt;// Selecting the alternative 3 of port C i.e UART1_TX&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTE-&amp;gt;PCR[1] |= PORT_PCR_MUX(3);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt;// Selecting the alternative 3 of port C i.e UART1_RX &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;/*****************************************************************************&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;* Function to initialize UART 1&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;******************************************************************************/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void UART1_init (int sysclk, int baud)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; register uint16_t ubd, brfa;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t temp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM-&amp;gt;SCGC4 |= SIM_SCGC4_UART1_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt; // Enabling Clock gate control to UART 1&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt; /* Make sure that the transmitter and receiver are disabled while we &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * change settings.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART1-&amp;gt;C2 &amp;amp;= ~(UART_C2_TE_MASK | UART_C2_RE_MASK);&amp;nbsp; &lt;SPAN style="color: #339966;"&gt;// Disabling transmitter and receiver&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&lt;SPAN style="color: #339966;"&gt;* Configure the UART for 8-bit mode, no parity */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART1-&amp;gt;C1 = 0;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt; /* We need all default settings, so entire register is cleared */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt;&amp;nbsp; /* Calculate baud settings */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ubd = (uint16_t)((sysclk*1000)/(baud * 16));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt; /* Save off the current value of the UARTx_BDH except for the SBR */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = UART1-&amp;gt;BDH &amp;amp; ~(UART_BDH_SBR(0x1F));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART1-&amp;gt;BDH = temp | UART_BDH_SBR(((ubd &amp;amp; 0x1F00) &amp;gt;&amp;gt; 8));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART1-&amp;gt;BDL = (uint8_t)(ubd &amp;amp; UART_BDL_SBR_MASK);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt; /* Determine if a fractional divider is needed to get closer to the baud rate */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; brfa = (((sysclk*32000)/(baud * 16)) - (ubd * 32));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt; /* Save off the current value of the UARTx_C4 register except for the BRFA */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = UART1-&amp;gt;C4 &amp;amp; ~(UART_C4_BRFA(0x1F));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART1-&amp;gt;C4 = temp | UART_C4_BRFA(brfa);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt; /* Enable receiver and transmitter */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART1-&amp;gt;C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK );&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;/*****************************************************************************&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;* Function to Send character to UART 1&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;******************************************************************************/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void uart_putchar (char ch)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt; /* Wait until space is available in the FIFO */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(UART1-&amp;gt;S1 &amp;amp; UART_S1_TDRE_MASK));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt;&amp;nbsp; /* Send the character */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART1-&amp;gt;D = (uint8_t)ch;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/&lt;SPAN style="color: #339966;"&gt;*****************************************************************************&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;* Function to Check for any byte recieved from UART 1&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;******************************************************************************/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;int uart_getchar_present ()&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (UART1-&amp;gt;S1) &amp;amp; UART_S1_RDRF_MASK;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;/*****************************************************************************&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;* Function to Recieve character from UART 1&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;******************************************************************************/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;char uart_getchar ()&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Wait until character has been received */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!(UART1-&amp;gt;S1 &amp;amp; UART_S1_RDRF_MASK));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Return the 8-bit data from the receiver */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return UART1-&amp;gt;D;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;int main(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; GateClock_Init();&lt;/P&gt;&lt;P&gt;&amp;nbsp; UART1_init(50000, 38400);&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt; // System clock frequency, Baud rate&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uart_putchar('A');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1)&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; uart_putchar(uart_getchar());&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #339966;"&gt;// Sending the recieved data&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 12 Sep 2013 03:43:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228342#M4720</guid>
      <dc:creator>Amit_Kumar1</dc:creator>
      <dc:date>2013-09-12T03:43:18Z</dc:date>
    </item>
    <item>
      <title>Re: UART1 Garbage value problem in TWR-K20D50M Board using KEIL uvision 4</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228343#M4721</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Amit,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;How did you configure the MCG? which mode is used in your application? FEI or PEE? Please also provide the related code snippet for a review.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks for your patience!!&lt;/P&gt;&lt;P&gt;B.R&lt;/P&gt;&lt;P&gt;Kan&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 13 Sep 2013 04:25:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228343#M4721</guid>
      <dc:creator>Kan_Li</dc:creator>
      <dc:date>2013-09-13T04:25:29Z</dc:date>
    </item>
    <item>
      <title>Re: UART1 Garbage value problem in TWR-K20D50M Board using KEIL uvision 4</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228344#M4722</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello&lt;/P&gt;&lt;P&gt;I have provided the full code. I just want to do the basic transmission of characters. I thought we don't need to configure the MCG in this case as we are using the system clock directly I took help from the reference manual present in the freescale website. check this link &lt;A href="http://cache.freescale.com/files/32bit/doc/quick_ref_guide/KQRUG.pdf?fsrch=1&amp;amp;sr=1"&gt;http://cache.freescale.com/files/32bit/doc/quick_ref_guide/KQRUG.pdf?fsrch=1&amp;amp;sr=1&lt;/A&gt; I went through the instructions for UART.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 13 Sep 2013 04:39:46 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228344#M4722</guid>
      <dc:creator>Amit_Kumar1</dc:creator>
      <dc:date>2013-09-13T04:39:46Z</dc:date>
    </item>
    <item>
      <title>Re: UART1 Garbage value problem in TWR-K20D50M Board using KEIL uvision 4</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228345#M4723</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Amit,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I see, I will test your code on TWR-K20D50M, and will let you know when I have any progress.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks for your patience!!&lt;/P&gt;&lt;P&gt;B.R&lt;/P&gt;&lt;P&gt;Kan&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 13 Sep 2013 06:31:46 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228345#M4723</guid>
      <dc:creator>Kan_Li</dc:creator>
      <dc:date>2013-09-13T06:31:46Z</dc:date>
    </item>
    <item>
      <title>Re: UART1 Garbage value problem in TWR-K20D50M Board using KEIL uvision 4</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228346#M4724</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Kan&lt;/P&gt;&lt;P&gt;I tried to configure the MCG. I added the below code in my clock init function of the posted code. Now I am not receiving anything in response to keys pressed. Earlier letter 'a' and 't' was coming fine and on pressing other keys I was receiving some different characters like when pressed 'q' I Received 'y' and for few more keys I received 'y'.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;MCG-&amp;gt;C1 |=( MCG_C1_CLKS(1) | MCG_C1_IRCLKEN_MASK );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;// Internal reference clock is selected, IRC is enabled&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt; MCG-&amp;gt;C2 = MCG_C2_IRCS_MASK;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;// Fast internal reference clock selected.&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt; MCG-&amp;gt;SC = MCG_SC_FCRDIV(0);&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;// Divide Factor is 1&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 13 Sep 2013 06:44:54 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228346#M4724</guid>
      <dc:creator>Amit_Kumar1</dc:creator>
      <dc:date>2013-09-13T06:44:54Z</dc:date>
    </item>
    <item>
      <title>Re: UART1 Garbage value problem in TWR-K20D50M Board using KEIL uvision 4</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228347#M4725</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Amit,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I looked into your code above, it should be ok, but I found you use this line as below to initialize the UART1：&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;UART1_init(50000, 38400);&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #339966;"&gt;// System clock frequency, Baud rate&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #339966;"&gt;If you dont configure MCG out of reset, the default output is 23986176Hz, nearly 24MHz, not 50MHz, but you can not use 24000KHz to calculate the baudrate either, you should use &lt;SPAN style="color: #339966; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;23986176Hz&lt;/SPAN&gt; in the calculation, and for your latest test, seems you used the fast IRC as the system clock, but it is not trimmed precisely, which would cause the same problem. so it is recommended to configure MCG in PEE mode (PLL active in that case) to get the system clock that you needed.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #339966;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #339966;"&gt;Hope that helps,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #339966;"&gt;B.R&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #339966;"&gt;Kan&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 13 Sep 2013 07:04:07 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228347#M4725</guid>
      <dc:creator>Kan_Li</dc:creator>
      <dc:date>2013-09-13T07:04:07Z</dc:date>
    </item>
    <item>
      <title>Re: UART1 Garbage value problem in TWR-K20D50M Board using KEIL uvision 4</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228348#M4726</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Kan&lt;/P&gt;&lt;P&gt;Can you provide me the simplest code for MCG configuration using PLL to generate 50 MHz (or any frequency) which I can append in the above code to make my UART working?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks in advance.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 13 Sep 2013 07:13:11 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228348#M4726</guid>
      <dc:creator>Amit_Kumar1</dc:creator>
      <dc:date>2013-09-13T07:13:11Z</dc:date>
    </item>
    <item>
      <title>Re: UART1 Garbage value problem in TWR-K20D50M Board using KEIL uvision 4</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228349#M4727</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Amit,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Please kindly refer to the following for details. It is from the MCG driver for Kinetis 50MHz part.&lt;/P&gt;&lt;P&gt;/*********************************************************************************************/&lt;/P&gt;&lt;P&gt;/* Functon name : pll_init&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; * Mode transition: Option to move from FEI to PEE mode or to just initialize the PLL&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; * This function initializess either PLL0 or PLL1. Either OSC0 or OSC1 can be selected for the&lt;/P&gt;&lt;P&gt; * reference clock source. The oscillators can be configured to use a crystal or take in an&lt;/P&gt;&lt;P&gt; * external square wave clock.&lt;/P&gt;&lt;P&gt; * NOTE : This driver does not presently (as of Sept 9 2011) support the use of OSC1 as the&lt;/P&gt;&lt;P&gt; * reference clock for the MCGOUT clock used for the system clocks.&lt;/P&gt;&lt;P&gt; * The PLL outputs a PLLCLK and PLLCLK2X. PLLCLK2X is the actual PLL frequency and PLLCLK is&lt;/P&gt;&lt;P&gt; * half this frequency. PLLCLK is used for MCGOUT and is also typically used by the&lt;/P&gt;&lt;P&gt; * peripherals that can select the PLL as a clock source. So the PLL frequency generated will&lt;/P&gt;&lt;P&gt; * be twice the desired frequency.&lt;/P&gt;&lt;P&gt; * Using the function parameter names the PLL frequency is calculated as follows:&lt;/P&gt;&lt;P&gt; * PLL freq = ((crystal_val / prdiv_val) * vdiv_val)&lt;/P&gt;&lt;P&gt; * Refer to the readme file in the mcg driver directory for examples of pll_init configurations.&lt;/P&gt;&lt;P&gt; * All parameters must be provided, for example crystal_val must be provided even if the&lt;/P&gt;&lt;P&gt; * oscillator associated with that parameter is already initialized.&lt;/P&gt;&lt;P&gt; * The various passed parameters are checked to ensure they are within the allowed range. If any&lt;/P&gt;&lt;P&gt; * of these checks fail the driver will exit and return a fail/error code. An error code will&lt;/P&gt;&lt;P&gt; * also be returned if any error occurs during the PLL initialization sequence. Refer to the&lt;/P&gt;&lt;P&gt; * readme file in the mcg driver directory for a list of all these codes.&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; * Parameters: crystal_val - external clock frequency in Hz either from a crystal or square&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;&amp;nbsp;&amp;nbsp; wave clock source&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; hgo_val&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - selects whether low power or high gain mode is selected&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;&amp;nbsp;&amp;nbsp; for the crystal oscillator. This has no meaning if an&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;&amp;nbsp;&amp;nbsp; external clock is used.&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; erefs_val&amp;nbsp;&amp;nbsp; - selects external clock (=0) or crystal osc (=1)&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; prdiv_val&amp;nbsp;&amp;nbsp; - value to divide the external clock source by to create the desired&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;&amp;nbsp;&amp;nbsp; PLL reference clock frequency&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; vdiv_val&amp;nbsp;&amp;nbsp;&amp;nbsp; - value to multiply the PLL reference clock frequency by&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; mcgout_select&amp;nbsp; - 0 if the PLL is just to be enabled, non-zero if the PLL is used&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; to provide the MCGOUT clock for the system.&lt;/P&gt;&lt;P&gt; *&lt;/P&gt;&lt;P&gt; * Return value : PLL frequency (Hz) divided by 2 or error code&lt;/P&gt;&lt;P&gt; */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;int pll_init(int crystal_val, unsigned char hgo_val, unsigned char erefs_val, signed char prdiv_val, signed char vdiv_val, unsigned char mcgout_select)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned char frdiv_val;&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned char temp_reg;&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned char prdiv, vdiv;&lt;/P&gt;&lt;P&gt;&amp;nbsp; short i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; int ref_freq;&lt;/P&gt;&lt;P&gt;&amp;nbsp; int pll_freq;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // check if in FEI mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (!((((MCG_S &amp;amp; MCG_S_CLKST_MASK) &amp;gt;&amp;gt; MCG_S_CLKST_SHIFT) == 0x0) &amp;amp;&amp;amp; // check CLKS mux has selcted FLL output&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (MCG_S &amp;amp; MCG_S_IREFST_MASK) &amp;amp;&amp;amp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // check FLL ref is internal ref clk&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (!(MCG_S &amp;amp; MCG_S_PLLST_MASK))))&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // check PLLS mux has selected FLL&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0x1;&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;&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; // return error code&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // check external frequency is less than the maximum frequency&lt;/P&gt;&lt;P&gt;&amp;nbsp; if&amp;nbsp; (crystal_val &amp;gt; 50000000) {return 0x21;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // check crystal frequency is within spec. if crystal osc is being used as PLL ref&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (erefs_val)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((crystal_val &amp;lt; 3000000) || (crystal_val &amp;gt; 32000000)) {return 0x22;} // return 1 if one of the available crystal options is not available&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // make sure HGO will never be greater than 1. Could return an error instead if desired.&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (hgo_val &amp;gt; 0)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hgo_val = 1; // force hgo_val to 1 if &amp;gt; 0&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Check PLL divider settings are within spec.&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ((prdiv_val &amp;lt; 1) || (prdiv_val &amp;gt; 25)) {return 0x41;}&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ((vdiv_val &amp;lt; 24) || (vdiv_val &amp;gt; 55)) {return 0x42;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Check PLL reference clock frequency is within spec.&lt;/P&gt;&lt;P&gt;&amp;nbsp; ref_freq = crystal_val / prdiv_val;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ((ref_freq &amp;lt; 2000000) || (ref_freq &amp;gt; 4000000)) {return 0x43;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Check PLL output frequency is within spec.&lt;/P&gt;&lt;P&gt;&amp;nbsp; pll_freq = (crystal_val / prdiv_val) * vdiv_val;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ((pll_freq &amp;lt; 48000000) || (pll_freq &amp;gt; 100000000)) {return 0x45;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // configure the MCG_C2 register&lt;/P&gt;&lt;P&gt;&amp;nbsp; // the RANGE value is determined by the external frequency. Since the RANGE parameter affects the FRDIV divide value&lt;/P&gt;&lt;P&gt;&amp;nbsp; // it still needs to be set correctly even if the oscillator is not being used&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; temp_reg = MCG_C2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp_reg &amp;amp;= ~(MCG_C2_RANGE_MASK | MCG_C2_HGO_MASK | MCG_C2_EREFS_MASK); // clear fields before writing new values&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; if (crystal_val &amp;lt;= 3000000)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp_reg |= (MCG_C2_RANGE(1) | (hgo_val &amp;lt;&amp;lt; MCG_C2_HGO_SHIFT) | (erefs_val &amp;lt;&amp;lt; MCG_C2_EREFS_SHIFT));&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; else&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp_reg |= (MCG_C2_RANGE(2) | (hgo_val &amp;lt;&amp;lt; MCG_C2_HGO_SHIFT) | (erefs_val &amp;lt;&amp;lt; MCG_C2_EREFS_SHIFT));&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; MCG_C2 = temp_reg;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; // determine FRDIV based on reference clock frequency&lt;/P&gt;&lt;P&gt;&amp;nbsp; // since the external frequency has already been checked only the maximum frequency for each FRDIV value needs to be compared here.&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (crystal_val &amp;lt;= 1250000) {frdiv_val = 0;}&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if (crystal_val &amp;lt;= 2500000) {frdiv_val = 1;}&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if (crystal_val &amp;lt;= 5000000) {frdiv_val = 2;}&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if (crystal_val &amp;lt;= 10000000) {frdiv_val = 3;}&lt;/P&gt;&lt;P&gt;&amp;nbsp; else if (crystal_val &amp;lt;= 20000000) {frdiv_val = 4;}&lt;/P&gt;&lt;P&gt;&amp;nbsp; else {frdiv_val = 5;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Select external oscillator and Reference Divider and clear IREFS to start ext osc&lt;/P&gt;&lt;P&gt;&amp;nbsp; // If IRCLK is required it must be enabled outside of this driver, existing state will be maintained&lt;/P&gt;&lt;P&gt;&amp;nbsp; // CLKS=2, FRDIV=frdiv_val, IREFS=0, IRCLKEN=0, IREFSTEN=0&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp_reg = MCG_C1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp_reg &amp;amp;= ~(MCG_C1_CLKS_MASK | MCG_C1_FRDIV_MASK | MCG_C1_IREFS_MASK); // Clear values in these fields&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp_reg = MCG_C1_CLKS(2) | MCG_C1_FRDIV(frdiv_val); // Set the required CLKS and FRDIV values&lt;/P&gt;&lt;P&gt;&amp;nbsp; MCG_C1 = temp_reg;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // if the external oscillator is used need to wait for OSCINIT to set&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (erefs_val)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = 0 ; i &amp;lt; 10000 ; i++)&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; if (MCG_S &amp;amp; MCG_S_OSCINIT_MASK) break; // jump out early if OSCINIT sets before loop finishes&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (!(MCG_S &amp;amp; MCG_S_OSCINIT_MASK)) return 0x23; // check bit is really set and return with error if not set&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;/* THIS CHECK IS REMOVED DUE TO BUG WITH SLOW IRC IN REV. 1.0&lt;/P&gt;&lt;P&gt;&amp;nbsp; // wait for Reference clock Status bit to clear&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0 ; i &amp;lt; 2000 ; i++)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!(MCG_S &amp;amp; MCG_S_IREFST_MASK)) break; // jump out early if IREFST clears before loop finishes&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (MCG_S &amp;amp; MCG_S_IREFST_MASK) return 0x11; // check bit is really clear and return with error if not set&lt;/P&gt;&lt;P&gt;*/&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Wait for clock status bits to show clock source is ext ref clk&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0 ; i &amp;lt; 2000 ; i++)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (((MCG_S &amp;amp; MCG_S_CLKST_MASK) &amp;gt;&amp;gt; MCG_S_CLKST_SHIFT) == 0x2) break; // jump out early if CLKST shows EXT CLK slected before loop finishes&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (((MCG_S &amp;amp; MCG_S_CLKST_MASK) &amp;gt;&amp;gt; MCG_S_CLKST_SHIFT) != 0x2) return 0x1A; // check EXT CLK is really selected and return with error if not&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Now in FBE&lt;/P&gt;&lt;P&gt;&amp;nbsp; // It is recommended that the clock monitor is enabled when using an external clock as the clock source/reference.&lt;/P&gt;&lt;P&gt;&amp;nbsp; // It is enabled here but can be removed if this is not required.&lt;/P&gt;&lt;P&gt;&amp;nbsp; MCG_C6 |= MCG_C6_CME_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; // Configure PLL&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Configure MCG_C5&lt;/P&gt;&lt;P&gt;&amp;nbsp; // If the PLL is to run in STOP mode then the PLLSTEN bit needs to be OR'ed in here or in user code.&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp_reg = MCG_C5;&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp_reg &amp;amp;= ~MCG_C5_PRDIV_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp_reg |= MCG_C5_PRDIV(prdiv_val - 1);&amp;nbsp;&amp;nbsp;&amp;nbsp; //set PLL ref divider&lt;/P&gt;&lt;P&gt;&amp;nbsp; MCG_C5 = temp_reg;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Configure MCG_C6&lt;/P&gt;&lt;P&gt;&amp;nbsp; // The PLLS bit is set to enable the PLL, MCGOUT still sourced from ext ref clk&lt;/P&gt;&lt;P&gt;&amp;nbsp; // The loss of lock interrupt can be enabled by seperately OR'ing in the LOLIE bit in MCG_C6&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp_reg = MCG_C6; // store present C6 value&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp_reg &amp;amp;= ~MCG_C6_VDIV_MASK; // clear VDIV settings&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp_reg |= MCG_C6_PLLS_MASK | MCG_C6_VDIV(vdiv_val - 24); // write new VDIV and enable PLL&lt;/P&gt;&lt;P&gt;&amp;nbsp; MCG_C6 = temp_reg; // update MCG_C6&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // wait for PLLST status bit to set&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0 ; i &amp;lt; 2000 ; i++)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (MCG_S &amp;amp; MCG_S_PLLST_MASK) break; // jump out early if PLLST sets before loop finishes&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (!(MCG_S &amp;amp; MCG_S_PLLST_MASK)) return 0x16; // check bit is really set and return with error if not set&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Wait for LOCK bit to set&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0 ; i &amp;lt; 2000 ; i++)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (MCG_S &amp;amp; MCG_S_LOCK_MASK) break; // jump out early if LOCK sets before loop finishes&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (!(MCG_S &amp;amp; MCG_S_LOCK_MASK)) return 0x44; // check bit is really set and return with error if not set&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Use actual PLL settings to calculate PLL frequency&lt;/P&gt;&lt;P&gt;&amp;nbsp; prdiv = ((MCG_C5 &amp;amp; MCG_C5_PRDIV_MASK) + 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; vdiv = ((MCG_C6 &amp;amp; MCG_C6_VDIV_MASK) + 24);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // now in PBE&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; MCG_C1 &amp;amp;= ~MCG_C1_CLKS_MASK; // clear CLKS to switch CLKS mux to select PLL as MCG_OUT&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Wait for clock status bits to update&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i = 0 ; i &amp;lt; 2000 ; i++)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (((MCG_S &amp;amp; MCG_S_CLKST_MASK) &amp;gt;&amp;gt; MCG_S_CLKST_SHIFT) == 0x3) break; // jump out early if CLKST = 3 before loop finishes&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (((MCG_S &amp;amp; MCG_S_CLKST_MASK) &amp;gt;&amp;gt; MCG_S_CLKST_SHIFT) != 0x3) return 0x1B; // check CLKST is set correctly and return with error if not&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Now in PEE&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; return ((crystal_val / prdiv) * vdiv); //MCGOUT equals PLL output frequency&lt;/P&gt;&lt;P&gt;} // pll_init&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Hope that helps,&lt;/P&gt;&lt;P&gt;B.R&lt;/P&gt;&lt;P&gt;Kan&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 13 Sep 2013 07:45:30 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/UART1-Garbage-value-problem-in-TWR-K20D50M-Board-using-KEIL/m-p/228349#M4727</guid>
      <dc:creator>Kan_Li</dc:creator>
      <dc:date>2013-09-13T07:45:30Z</dc:date>
    </item>
  </channel>
</rss>

