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: Creating a UART connection to Putty without extensive libraries

Part Number: TM4C123GH6PM

So I watched a tutorial on setting up a UART connection where I could print things and see them in a putty secession however I cannot get the code to work correctly. It will compile and seems to initialize correctly when I check the memory during debug but it is getting stuck in the printChar function and I cannot figure what is wrong with it. Can someone explain were my error is either in concept or in implementation? Thanks in adance.

#include <stdlib.h>
#include <stdio.h>
#include "lm4f120h5qr.h"


char readChar(void);
void printChar(char c);
void printString(char* string);


/**
 * main.c
 */
int main(void)
{


    SYSCTL_RCGCGPIO_R |= (1<<5);
   
    
    GPIO_PORTF_DIR_R = (1<<1) | (1<<2) | (1<<3);
    GPIO_PORTF_DEN_R = (1<<1) | (1<<2) | (1<<3);
    GPIO_PORTF_DATA_R &= ~((1<<1) | (1<<2) | (1<<3)); // INITIALLY TURN THE LEDS OFF

    char c;


    //1. Enable the UART module using the RCGCUART register (see page 344).
     SYSCTL_RCGCUART_R |=(1<<0);


   // 2. Enable the clock to the appropriate GPIO module via the RCGCGPIO register (see page 340).
     SYSCTL_RCGCGPIO_R |= (1<<0);

   // To find out which GPIO port to enable, refer to Table 23-5 on page 1351.


   // 3. Set the GPIO AFSEL bits for the appropriate pins (see page 671). To determine which GPIOs to
   // configure, see Table 23-4 on page 1344.
     GPIO_PORTA_AFSEL_R  = (1<<1) | (1<<0);
   // 4. Configure the GPIO current level and/or slew rate as specified for the mode selected (see
   // page 673 and page 681).
   // 5. Configure the PMCn fields in the GPIOPCTL register to assign the UART signals to the appropriate
   // pins (see page 688 and Table 23-5 on page 1351).
     
     GPIO_PORTA_PCTL_R = (1<<0) | (1<<1);

     GPIO_PORTA_DEN_R = (1<<0) | (1<<1);

   // UARTFBRD[DIVFRAC] = integer(0.8507 * 64 + 0.5) = 54
   // With the BRD values in hand, the UART configuration is written to the module in the following order:
   // 1. Disable the UART by clearing the UARTEN bit in the UARTCTL register.
     
     UART0_CTL_R &= ~(1<<0);
   // 2. Write the integer portion of the BRD to the UARTIBRD register.
     UART0_IBRD_R = 104;
     
   // 3. Write the fractional portion of the BRD to the UARTFBRD register.
     UART0_FBRD_R = 11;
    
  //  4. Write the desired serial parameters to the UARTLCRH register (in this case, a value of
   // 0x0000.0060).
      UART0_LCRH_R = (0x03<<5); //BIT 5 SETS THE DATA LENGT IN THIS CASE 8 BITS
      
  //  5. Configure the UART clock source by writing to the UARTCC register.
      UART0_CC_R = (0x0); // 0X0 IS THE SYSTEM CLOCK

   // 6. Optionally, configure the µDMA channel (see “Micro Direct Memory Access (µDMA)” on page 585)
  //  and enable the DMA option(s) in the UARTDMACTL register.

  //  7. Enable the UART by setting the UARTEN bit in the UARTCTL register.
     UART0_CTL_R |= (1<<0) | (1<<8) | (1<<9); //BIT 0 ENABLES UART BIT 8 ENABLES RX AND BIT 9 ENABLES TX

     int x = 5;
     printf("%d", x);
     
     //UARTprintf("please work corretly");
     
     
    while(1){
        printString("enter r g b: \n\r"); // prompt the user for an input

        c = readChar();// read the users input
        printChar(c); // print the users input back to them
        printString("\n\r");// start a new line to keep things clean
        
  

        switch (c){

        case 'r': GPIO_PORTF_DATA_R = (1<<1); // READ VALUE OF R SETS THE RED LED TO ON
            break;
        case 'g': GPIO_PORTF_DATA_R = (1<<2);// READ VALUE OF G SETS THE LED TO GREEN
            break;
        case 'b':  GPIO_PORTF_DATA_R = (1<<3);
            break;

        }

    }

	return 0;
}

char readChar(void){

    char c ; // declare a character
    while((UART0_FR_R & (1<<4)) != 0);// wait until the flag register tells us there is data to receive
    c = UART0_DR_R; // read the data in and assign it to c
   
    return c;

}

void printChar(char c){

    while((UART0_FR_R & (1<<5)) != 0); //make sure the transmit line is empty
    UART0_DR_R = c; // write the data assigned to c onto the bus
   
}
void printString(char* string){
    while(*string){
        printChar(*(string++));
    }

}

  • Hello Chad,

    Per our forum guidelines, we do not support debug of Direct Register code for TM4C (see #4): https://e2e.ti.com/support/microcontrollers/other/f/908/t/695568

    As this is a pretty basic application what I would recommend is have a look at our 'Hello' example for your LaunchPad, and then check the UART configuration and send/receive API's to see how they are coded. You can then crosscheck against your own implementation in order to find any missing pieces.

    Long term I would recommend using TivaWare as the provided APIs are designed to save you time from debugging DRM code which tends to be quite involved in comparison.