AnsweredAssumed Answered

UART example on FRDM-KL05Z board for KDS

Question asked by ionchifu on Oct 9, 2015
Latest reply on Oct 13, 2015 by Alice_Yang

     Hello, my name is Alex and I am new in this community. I recently started a project using the FRDM-KL05Z board and I am interested in some examples on how to configure the UART protocol without Processor Expert. So far I found some init and read/write methods but they don't seem to work properly.

 

     Below you can find the code for this methods :

 

void uart_init (UART_MemMapPtr uartch, int sysclk, int baud)

{

    register uint16 sbr, brfa;

    uint8 temp;

   

  /* Enable the clock to the selected UART */   

    if(uartch == UART0_BASE_PTR)

  SIM_SCGC4 |= SIM_SCGC4_UART0_MASK;

    else

    if (uartch == UART1_BASE_PTR)

  SIM_SCGC4 |= SIM_SCGC4_UART1_MASK;

    else

    if (uartch == UART2_BASE_PTR)

    SIM_SCGC4 |= SIM_SCGC4_UART2_MASK;

    else

    if(uartch == UART3_BASE_PTR)

    SIM_SCGC4 |= SIM_SCGC4_UART3_MASK;

    else

    if(uartch == UART4_BASE_PTR)

    SIM_SCGC1 |= SIM_SCGC1_UART4_MASK;

    else

    SIM_SCGC1 |= SIM_SCGC1_UART5_MASK;

                               

    /* Make sure that the transmitter and receiver are disabled while we

     * change settings.

     */

    UART_C2_REG(uartch) &= ~(UART_C2_TE_MASK

  | UART_C2_RE_MASK );

 

 

    /* Configure the UART for 8-bit mode, no parity */

    UART_C1_REG(uartch) = 0; /* We need all default settings, so entire register is cleared */

   

    /* Calculate baud settings */

    sbr = (uint16)((sysclk*1000)/(baud * 16));

       

    /* Save off the current value of the UARTx_BDH except for the SBR field */

    temp = UART_BDH_REG(uartch) & ~(UART_BDH_SBR(0x1F));

   

    UART_BDH_REG(uartch) = temp |  UART_BDH_SBR(((sbr & 0x1F00) >> 8));

    UART_BDL_REG(uartch) = (uint8)(sbr & UART_BDL_SBR_MASK);

   

    /* Determine if a fractional divider is needed to get closer to the baud rate */

    brfa = (((sysclk*32000)/(baud * 16)) - (sbr * 32));

   

    /* Save off the current value of the UARTx_C4 register except for the BRFA field */

    temp = UART_C4_REG(uartch) & ~(UART_C4_BRFA(0x1F));

   

    UART_C4_REG(uartch) = temp |  UART_C4_BRFA(brfa);   

 

 

    /* Enable receiver and transmitter */

  UART_C2_REG(uartch) |= (UART_C2_TE_MASK

  | UART_C2_RE_MASK );

}

/********************************************************************/

/*

* Wait for a character to be received on the specified UART

*

* Parameters:

*  channel      UART channel to read from

*

* Return Values:

*  the received character

*/

char uart_getchar (UART_MemMapPtr channel)

{

    /* Wait until character has been received */

    while (!(UART_S1_REG(channel) & UART_S1_RDRF_MASK));

   

    /* Return the 8-bit data from the receiver */

    return UART_D_REG(channel);

}

/********************************************************************/

/*

* Wait for space in the UART Tx FIFO and then send a character

*

* Parameters:

*  channel      UART channel to send to

*  ch character to send

*/

void uart_putchar (UART_MemMapPtr channel, char ch)

{

    /* Wait until space is available in the FIFO */

    while(!(UART_S1_REG(channel) & UART_S1_TDRE_MASK));

   

    /* Send the character */

    UART_D_REG(channel) = (uint8)ch;

}

/********************************************************************/

/*

* Check to see if a character has been received

*

* Parameters:

*  channel      UART channel to check for a character

*

* Return values:

*  0       No character received

*  1       Character has been received

*/

int uart_getchar_present (UART_MemMapPtr channel)

{

    return (UART_S1_REG(channel) & UART_S1_RDRF_MASK);

}

 

     I was just wondering if anyone used those routines or something similar or has an example on how to communicate with a terminal using the UART protocol on the FRDM-KL05Z board.

 

     This is my first time using a freescale microcontroller so I don't fully understand all it's aspects so any information will be greatly appreciated.

Outcomes