This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C123GH6PM: UART issues

Part Number: TM4C123GH6PM

Hello i have tried to implement a simple UART interface, with the following code:

/*****************************************************************************
* University of Southern Denmark
* Embedded Programming (EMP)
*
* MODULENAME.: main.c
*
* PROJECT....: EMP
*
* DESCRIPTION: Assignment 4, main module. No main.h file.
*
* Change Log:
*****************************************************************************
* Date    Id    Change
* YYMMDD
* --------------------
* 290417  MoH   Module created.
*
*****************************************************************************/

/***************************** Include files *******************************/
#include <stdint.h>
#include "glob_def.h"
#include "tm4c123gh6pm.h"
#include "emp_type.h"
#include "uart0.h"
 // led lights
#define RESET_RGB 0x0E
#define GREEN     0b00000110
#define YELLOW    0b00001010
#define RED       0b00001100
#define LED_OFF   0b00001110

//functions
char ReadChar(void);
void PrintChar(char c);
void PrintString(char * string);
char c;


int main(void) {

      // Enable the GPIO port that is used for the on-board LED.
      //
     SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOA | SYSCTL_RCGC2_GPIOC | SYSCTL_RCGC2_GPIOD | SYSCTL_RCGC2_GPIOF;
     SYSCTL_RCGC1_R |= 0x00000001;
     //init_systick();



     //
     // Enable the GPIO pin for the LED (PF3).  Set the direction as output, and
     // enable the GPIO pin for digital function.
     //
     GPIO_PORTC_DIR_R = 0xF0;
     GPIO_PORTC_DEN_R = 0xF0;

     GPIO_PORTD_DIR_R = 0x4C;
     GPIO_PORTD_DEN_R = 0x4C;

     GPIO_PORTF_DIR_R = 0x0E;
     GPIO_PORTF_DEN_R = 0x1F;
     //inistialize the uart
     uart0_init( 9600, 8, 1, 'n' );
      while(1)
      {

          PrintString("Enter \"r\",\"g\", or \"y\":\n\r");     // show string

                          c = ReadChar();
                           PrintChar(c);
                           PrintString("\n\r");

                  switch(c)  // show led color based on case
                  {
                  case 'r':
                      GPIO_PORTF_DATA_R &= ~(RESET_RGB);
                      GPIO_PORTF_DATA_R |= RED;
                  break;
                  case 'g':
                      GPIO_PORTF_DATA_R &= ~(RESET_RGB);
                      GPIO_PORTF_DATA_R |= GREEN;

                  break;
                  case 'y':

                      GPIO_PORTF_DATA_R &= ~(RESET_RGB);
                       GPIO_PORTF_DATA_R |= YELLOW;
                  break;
                  default:
                  GPIO_PORTF_DATA_R &= ~(RESET_RGB);
                  GPIO_PORTF_DATA_R |= LED_OFF;;
                  break;




      }

}

}


void PrintChar(char c)
     {
         while(uart0_tx_rdy()!= 0);
         uart0_putc(c);

     }

char ReadChar(void)
     {
         char c;
         while(uart0_rx_rdy()!=0);
          uart0_getc();
     }

void PrintString(char * string)
     {
         while(*string);

         PrintChar(*(string++));

     }

The functions GetChar an Printchar use functions from the following module:

/*****************************************************************************
* University of Southern Denmark
* Embedded Programming (EMP)
*
* MODULENAME.: emp.c
*
* PROJECT....: EMP
*
* DESCRIPTION: See module specification file (.h-file).
*
* Change Log:
*****************************************************************************
* Date    Id    Change
* YYMMDD
* --------------------
* 150228  MoH   Module created.
*
*****************************************************************************/

/***************************** Include files *******************************/
#include <stdint.h>
#include "tm4c123gh6pm.h"
#include "emp_type.h"
/*****************************    Defines    *******************************/

/*****************************   Constants   *******************************/

/*****************************   Variables   *******************************/
char c;
/*****************************   Functions   *******************************/


INT32U lcrh_databits( INT8U antal_databits )
/*****************************************************************************
*   Input    :
*   Output   :
*   Function : sets bit 5 and 6 according to the wanted number of data bits.
*               5: bit5 = 0, bit6 = 0.
*               6: bit5 = 1, bit6 = 0.
*               7: bit5 = 0, bit6 = 1.
*               8: bit5 = 1, bit6 = 1  (default).
*              all other bits are returned = 0
******************************************************************************/
{
  if(( antal_databits < 5 ) || ( antal_databits > 8 ))
    antal_databits = 8;
  return(( (INT32U)antal_databits - 5 ) << 5 );  // Control bit 5-6, WLEN
}

INT32U lcrh_stopbits( INT8U antal_stopbits )
/*****************************************************************************
*   Input    :
*   Output   :
*   Function : sets bit 3 according to the wanted number of stop bits.
*               1 stpobit:  bit3 = 0 (default).
*               2 stopbits: bit3 = 1.
*              all other bits are returned = 0
******************************************************************************/
{
  if( antal_stopbits == 2 )
    return( 0x00000008 );       // return bit 3 = 1
  else
    return( 0x00000000 );       // return all zeros
}

INT32U lcrh_parity( INT8U parity )
/*****************************************************************************
*   Input    :
*   Output   :
*   Function : sets bit 1, 2 and 7 to the wanted parity.
*               'e':  00000110b.
*               'o':  00000010b.
*               '0':  10000110b.
*               '1':  10000010b.
*               'n':  00000000b.
*              all other bits are returned = 0
******************************************************************************/
{
  INT32U result;

  switch( parity )
  {
    case 'e':
      result = 0x00000006;
      break;
    case 'o':
      result = 0x00000002;
      break;
    case '0':
      result = 0x00000086;
      break;
    case '1':
      result = 0x00000082;
      break;
    case 'n':
      /* no break */
    default:
      result = 0x00000000;
  }
  return( result );
}

void uart0_fifos_enable()
/*****************************************************************************
*   Input    :
*   Output   :
*   Function : Enable the tx and rx fifos
******************************************************************************/
{
  UART0_LCRH_R  |= 0x00000010;
}

void uart0_fifos_disable()
/*****************************************************************************
*   Input    :
*   Output   :
*   Function : Enable the tx and rx fifos
******************************************************************************/
{
  UART0_LCRH_R  &= 0xFFFFFFEF;
}


extern BOOLEAN uart0_rx_rdy()
/*****************************************************************************
*   Function : See module specification (.h-file).
*****************************************************************************/
{
  return( UART0_FR_R & UART_FR_RXFF );
}

extern INT8U uart0_getc()
/*****************************************************************************
*   Function : See module specification (.h-file).
*****************************************************************************/
{

  return ( UART0_DR_R );
}

extern BOOLEAN uart0_tx_rdy()
/*****************************************************************************
*   Function : See module specification (.h-file).
*****************************************************************************/
{
  return( UART0_FR_R & UART_FR_TXFE );
}

extern void uart0_putc( INT8U ch )

/*****************************************************************************
*   Function : See module specification (.h-file).
*****************************************************************************/
{

 UART0_DR_R = ch;
}

extern void uart0_init( INT32U baud_rate, INT8U databits, INT8U stopbits, INT8U parity )
/*****************************************************************************
*   Function : See module specification (.h-file).
*****************************************************************************/
{
  INT32U BRD;

  #ifndef E_PORTA
  #define E_PORTA
  SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOA;                 // Enable clock for Port A
  #endif

  #ifndef E_UART0
  #define E_UART0
  SYSCTL_RCGC1_R |= SYSCTL_RCGC1_UART0;                 // Enable clock for UART 0
  #endif

  GPIO_PORTA_AFSEL_R |= 0x00000003;     // set PA0 og PA1 to alternativ function (uart0)
  GPIO_PORTA_DIR_R   |= 0x00000002;     // set PA1 (uart0 tx) to output
  GPIO_PORTA_DIR_R   &= 0xFFFFFFFE;     // set PA0 (uart0 rx) to input
  GPIO_PORTA_DEN_R   |= 0x00000003;     // enable digital operation of PA0 and PA1
  GPIO_PORTA_PUR_R   |= 0x00000002;

  BRD = 64000000 / baud_rate;       // X-sys*64/(16*baudrate) = 16M*4/baudrate
  UART0_IBRD_R = BRD / 64;
  UART0_FBRD_R = BRD & 0x0000003F;

  UART0_LCRH_R  = lcrh_databits( databits );
  UART0_LCRH_R += lcrh_stopbits( stopbits );
  UART0_LCRH_R += lcrh_parity( parity );

  uart0_fifos_disable();

  UART0_CTL_R  |= (UART_CTL_UARTEN | UART_CTL_TXE );  // Enable UART
}

/****************************** End Of Module *******************************/


The code simply should show red, yellow or green based on the button i press on my keyboard.

I have no errors, but  i get nothing through to the terminal i am using(putty). It's worth noting that i have tried other terminals as well. 

  • Hi Branko,

    Some questions to clarify and check.
    - Did you setup the same baudrate, number of stop bits on your COM port as your UART0?
    - Does the PrintString() work?
    - Does your ReadChar() work?
    - What character did you get when you call ReadChar()?
  • It is noted that your subject is, "UART Issues" - yet the great bulk of your set-up/config. code involves the R-G-B Leds - only little (directly, here) reveals the UART set-up.    ("visiting a site" (to glean key info) forces extra time/effort upon helpers - is that well thought?)

    The "fall thru" clause of "switch (c)" (shown below)

    GPIO_PORTF_DATA_R &= ~(RESET_RGB);
    GPIO_PORTF_DATA_R |= LED_OFF;;

    along w/the "dual semi-colons" "LED_OFF" provides no (added) value.      (~(RESET_RGB) -the line above - well achieves your objective (clears all Leds) - w/out additional help.)

    We're told, "What the Led code "should do" - yet as Charles mentions - never, "Whether it actually succeeds."

    Use of a scope - tied to the MCU's UART_TX - reveals (both) data's presence & baud-rate - highly useful in diagnosis...