Ingo Electronics


    HOME                                                           Stellaris LM4F120 LaunchPad


Stellaris LM4F120  LaunchPad.    UART modulis.    UART RX/TX example.

Stellaris LM4F120 LaunchPad mikrokontroleris turi 8 UART modulius, iš kurių tik UART0 modulio negalime tiesiogiai naudoti, nes jis šioje plokštėje jau panaudotas kaip virtualus COM portas.

Kiekvienas UART modulis turi konkrečius RX/TX pinus:

U0Rx  - PA0     U1Rx – PC4 ,PB0     U2Rx – PD6      U3Rx – PC6      U4Rx  - PC4      U5Rx  - PE4      U6Rx – PD4      U7Rx – PE0

U0Tx  - PA1     U1Tx – PC5 ,PB1     U2Tx – PD7     U3Tx – PC7      U4Tx  - PC5      U5Tx  - PE5      U6Tx – PD5      U7Tx – PE1

UART modulis turi atskirus, priėmimui ir siuntimui, aštuonių baitų FIFO buferius, kurie gali būti naudojami arba ne. Žemiau bus pateiktas programos pavyzdys kuriame FIFO buferiai nėra naudojami. 

FIFO išjungiamas funkcija. Pvz.:

UARTFIFODisable(UART3_BASE);

 

UART modulio nustatymas, inicializacija vykdoma sekančia tvarka:

    // Įjungiame taktavimą portui,kuriame yra pasirinkto UART RX/TX pinai

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);

    // Įjungiame taktavimą UART moduliui

    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART3);

    // Prijungiame PC6 ir PC7 pinus prie UART modulio.

    GPIOPinConfigure(GPIO_PC6_U3RX);

    GPIOPinConfigure(GPIO_PC7_U3TX);

    GPIOPinTypeUART(GPIO_PORTC_BASE, GPIO_PIN_6 | GPIO_PIN_7);

    // UART konfiguravimas. Praktiškai šioje funkcijoje (jeigu nenaudojamas koks nors egzotinis uart’as) nustatome baud rate,             // ir nurodome kuris modulis naudojamas

UARTConfigSetExpClk(UART3_BASE, SysCtlClockGet(), 115200,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE) );

   // Išjungiame FIFO modulį

    UARTFIFODisable(UART3_BASE);

    // Leidžiami UART modulio pertraukimai.

    IntEnable(INT_UART3);

    // Leidžiami tik  UART RX pertraukimai.

    UARTIntEnable(UART3_BASE, UART_INT_RX );

    // Leidžiami globalūs procesoriaus pertraukimai.

    IntMasterEnable();

UART modulio konfiguracija baigta.

Visą kas buvo čia parodyta, galima pasirašyti kaip  atskirą funkciją ir naudoti programoje. Kaip pvz. be komentarų:

 

void uart_init(){

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART3);

    GPIOPinConfigure(GPIO_PC6_U3RX);

    GPIOPinConfigure(GPIO_PC7_U3TX);

    GPIOPinTypeUART(GPIO_PORTC_BASE, GPIO_PIN_6 | GPIO_PIN_7);

UARTConfigSetExpClk(UART3_BASE, SysCtlClockGet(), 115200,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));

    UARTFIFODisable(UART3_BASE);

    IntEnable(INT_UART3);

    UARTIntEnable(UART3_BASE, UART_INT_RX );

    IntMasterEnable();

 }

 

Prieš tai buvo pateikta UART3 modulio konfiguracija, analogiškai konfiguracija atliekama ir kitiems UART moduliams, išskyrus UART2, kuris jungiasi prie vieno iš užrakinto pino, todėl dar reikalinga atrakinti PD7 piną, kaip kad buvo rašyta ankstesnėje temoje.

Kadangi UART dirba naudojant pertraukimų funkciją, šią funkciją reikia deklaruoti startup_ccs.c faile  ir ten pat, pertraukimų vektorių lentelėje, įrašyti šios funkcijos pavadinimą.

Žemiau pateiktas programos kodo pavyzdys, kur panaudotas UART2 modulis. Tai demonstracinis kodas, skirtas mokymui, mikrokontroleris gavęs iš uart terminalo raides R,B arba G įjungia atitinkamus LED’us, arba juos išjungia, jeigu priima T,H,arba N, atgal išsiūsdamas pranešimą apie LED’ų statusą. Tam kad parodyti, kaip per uart perduoti dešimtainio skaičiaus parametro reikšmę, while cikle sukasi didėjantis skaičius, kuris siunčiamas į uart terminalą.

 
Jeigu PC neturi COM jungties, be problemų galima jungti USB to COM bet kokį adapterį, panaudojant kokią nors UART terminalo programėlę, kurių internete yra įvairių.  

 
Šio pavyzdžio main.c ir startup_ccs.c failai yra čia:  Link

 

//*****************************************************************************
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/string.h"
#include "driverlib/stdlib.h"//for ltoa(..); 
 

unsigned char test_byte;

signed int number;

char buf[5];

 

void UARTSend(char *string);

//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
// The UART interrupt handler.
//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
void UART2_RX_Interrupt()
{

    // Clear the interrupt flag.

    UARTIntClear(UART2_BASE, UART_INT_RX);

    // Loop while there are characters in the receive FIFO.

    while(UARTCharsAvail(UART2_BASE))

    {

 

         test_byte = UARTCharGetNonBlocking(UART2_BASE);

 

         switch (test_byte) {

                      case  'B': {

                            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);

                             UARTSend("BLUE LED ON\n");

 

                                break;

                               }

 

                      case  'R': {

                            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);

                            UARTSend("RED LED ON\n");

                                break;

                               }

 

                      case  'G': {

                            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3);

                            UARTSend("GREEN LED ON\n");

                               break;

                               }

 

                      case   'N': {

                            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0x00);

                            UARTSend("BLUE LED OFF\n");

                               break;

                               }

 

                      case   'T': {

                            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0x00);

                            UARTSend("RED LED OFF\n");

                                    break;

                                    }

 

                     case   'H': {

                         GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0x00);

                         UARTSend("GREEN LED OFF\n");

                                   break;

                                      }

         }//end switch 

   }//end while

}
//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
// Send a string to the UART.
//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

void

UARTSend(char *string)

{

 

       unsigned long Idx;

       unsigned long string_lenght;

       string_lenght =      strlen(string);

 

 

        for(Idx = 0; Idx<string_lenght; Idx++)

                {

               UARTCharPut(UART2_BASE, string[Idx]);

                }

 

}

//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
void main()

{

    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); 

    // Enable the GPIO port that is used for the on-board LED.

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

    // Enable the GPIO pins for the LED (PF2).

    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1 |GPIO_PIN_2|GPIO_PIN_3);

    GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 |GPIO_PIN_2|GPIO_PIN_3, 0x00);

   //UART initialization

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);

    // Unlock PD7

    HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD;

    HWREG(GPIO_PORTD_BASE + GPIO_O_CR) |=  GPIO_PIN_7;

    HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = 0;

    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);

    // Set GPIO PD6 RX  and PD7 TX as UART pins.

    GPIOPinConfigure(GPIO_PD6_U2RX);

    GPIOPinConfigure(GPIO_PD7_U2TX);

    GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7);

// Configure the UART for 115,200, 8-N-1 operation.

UARTConfigSetExpClk(UART2_BASE, SysCtlClockGet(), 115200,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));

     UARTFIFODisable(UART2_BASE);

    // Enable the UART interrupt.

    IntEnable(INT_UART2);

    UARTIntEnable(UART2_BASE, UART_INT_RX );

    // Enable processor interrupts.

    IntMasterEnable();

//End UART initialization

 

number=0;

    while(1)

    {

                           ltoa(number, buf);

                           UARTSend(buf);

                           UARTSend("\n");

                           number++;

                           SysCtlDelay(2000000);

    }//end while

}//end main

//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''