LM4F120(Launchpad) UART kanalı nasıl değiştirilir ?

Başlatan AsHeS, 17 Kasım 2012, 16:01:06

AsHeS

Merhaba arkadaşlar TI'nin kitlerinden yeni bir tane edindim.Hello adlı örnek kodlarını değiştirerek oynamaya çalışıyorum kitle fakat aşağıda ki gibi kodu modifiye ettiğimde seri veri bilgisayarıma gelmiyor ARM serisi hakkında da geniş bir bilgim yok ilk uğraşım bu kit üzerinde aşağıda kodları veriyorum.Bilgisayarımda kullandığım usb-ttl dönüştürücüyü deneyerek çalıştığını biliyorum burada da bir problem yok.
Yardımlarınız için şimdiden teşekkürler
//*****************************************************************************
//
// hello.c - Simple hello world example.
//
// Copyright (c) 2012 Texas Instruments Incorporated.  All rights reserved.
// Software License Agreement
// 
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
// 
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
// 
// This is part of revision 9453 of the EK-LM4F120XL Firmware Package.
//
//*****************************************************************************

#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "utils/uartstdio.h"
#include "driverlib/uart.h"
//*****************************************************************************
//
//! \addtogroup example_list
//! <h1>Hello World (hello)</h1>
//!
//! A very simple ``hello world'' example.  It simply displays ``Hello World!''
//! on the UART and is a starting point for more complicated applications.
//!
//! UART0, connected to the Stellaris Virtual Serial Port and running at 
//! 115,200, 8-N-1, is used to display messages from this application.
//
//*****************************************************************************


//*****************************************************************************
//
// The error routine that is called if the driver library encounters an error.
//
//*****************************************************************************
#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif
 
 #define RED_LED   GPIO_PIN_1
 #define BLUE_LED  GPIO_PIN_2
 #define GREEN_LED GPIO_PIN_3
//*****************************************************************************
//
// Print "Hello World!" to the UART on the Stellaris evaluation board.
//
//*****************************************************************************
int
main(void)
{
    volatile unsigned long ulLoop;

    //
    // Enable lazy stacking for interrupt handlers.  This allows floating-point
    // instructions to be used within interrupt handlers, but at the expense of
    // extra stack usage.
    //
    ROM_FPULazyStackingEnable();

    //
    // Set the clocking to run directly from the crystal.
    //
   // ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
    //                  SYSCTL_OSC_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.
    //
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

    //
    // Enable the GPIO pins for the LED (PF2 & PF3).  
    //
    ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2|GPIO_PIN_3);
   // ROM_GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_1);
    //
    // Initialize the UART.
    //
		SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
	
    ROM_GPIOPinConfigure(GPIO_PB0_U1RX);
    ROM_GPIOPinConfigure(GPIO_PB1_U1TX);
    ROM_GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
			UARTConfigSetExpClk(UART1_BASE, SysCtlClockGet(), 9600,
       (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
        UART_CONFIG_PAR_NONE));

    UARTStdioInit(0);

    //
    // Hello!
    //
    UARTprintf("Hello, world!\n");
    
    //
    // We are finished.  Hang around doing nothing.
    //
    while(1)
    {
        //
        // Turn on the BLUE LED.
        //
		
       GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2|GPIO_PIN_3,0x0E);

        //
        // Delay for a bit.
        //
			SysCtlDelay(SysCtlClockGet()/10/3);
        //SysCtlDelay(SysCtlClockGet() / 10 / 3);
  
        //
        // Turn off the BLUE LED.
        //
			 UARTprintf("Hello, world!\n");
      GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2|GPIO_PIN_3,0x00);
        //
        // Delay for a bit.
        //
       // SysCtlDelay(SysCtlClockGet() / 10 / 3);
			SysCtlDelay(SysCtlClockGet()/10/3 );
    }
}

Firzen

Kararsız...

AsHeS


Firzen

Anladım bu kodların birebir aynısını ben MikroC de kullanıyorum benim tavsiyem birde MikroC kullanman hem kullanımı rahat tanımlama vs daha rahat yine de sen bilirsin sitede MikroC for ARM başlığı var bir bak istersen.
Kararsız...

AsHeS

#4
Alıntı yapılan: Firzen - 17 Kasım 2012, 18:47:16
Anladım bu kodların birebir aynısını ben MikroC de kullanıyorum benim tavsiyem birde MikroC kullanman hem kullanımı rahat tanımlama vs daha rahat yine de sen bilirsin sitede MikroC for ARM başlığı var bir bak istersen.
Benzer olduğu için soruyorum algoritma bazlı bir hata gözüküyor mu ?Benim bilmediğim  ya da beceremediğim...

mesaj birleştirme:: 18 Kasım 2012, 18:35:26

Sorunun çözümünü bilen bir arkadaşımzı bulunmaz mı acep koskoca forumda.

Firzen

Valla bir sorununuz bana göre yok diyor ama benim tavsiyem bu konuda çok iyi olan iki hocamız var bunlar MAYTERE VE FATIH INANC :)
Kararsız...

AsHeS

@Firzen o değilde TI'nın kendi verdiği UART örneği(hello project) de çalışmadı.Sorunu nerelerde arayacağım şu anda zerre fikrim yok .

Firzen

Birde mikroC de dene ne dersin maytere Hocamız ile de konuş ben onun sayesinde kullanıyorum valla.
Kararsız...

superconductor

#8
Kart uzerinde porta 0 ve1 headeri monte degil monte edip denedigimde calisti.headeri reset buttonun hemen yaninda olan  bos padlere lehimledim.bende bir problem yasiyorum bu konuda,farkli bir uart kanali ile calisirken gondermede sorun yok ama alma sirasinda rx kesmesi olusturamadim tum kanallari denedim.gelen bufferini okuyabiliyorum ama kesme olusmuyor.su  an tabletten yazdigimdan kod ekleyemiyorum pc ye gecince kodlari eklerim.
İyi calismalar

mesaj birleştirme:: 24 Kasım 2012, 17:46:28

Sanırım bu fonksiyon eksik: UARTEnable(UART1_BASE);

superconductor

UARTStdioInit(1);   fonksiyonu gözümüzden kaçmış.parametre olarak "0" verildiği için fonksiyon uart0'ı init etmeye çalışıyor.
Uart1 ile çalışan kodlar..
//*****************************************************************************
//
// hello.c - Simple hello world example.
//
// Copyright (c) 2012 Texas Instruments Incorporated.  All rights reserved.
// Software License Agreement
// 
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
// 
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
// 
// This is part of revision 9453 of the EK-LM4F120XL Firmware Package.
//
//*****************************************************************************

#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "utils/uartstdio.h"

//*****************************************************************************
//
//! \addtogroup example_list
//! <h1>Hello World (hello)</h1>
//!
//! A very simple ``hello world'' example.  It simply displays ``Hello World!''
//! on the UART and is a starting point for more complicated applications.
//!
//! UART1, connected to the Stellaris Virtual Serial Port and running at 
//! 115,200, 8-N-1, is used to display messages from this application.
//
//*****************************************************************************


//*****************************************************************************
//
// The error routine that is called if the driver library encounters an error.
//
//*****************************************************************************
#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif

//*****************************************************************************
//
// Print "Hello World!" to the UART on the Stellaris evaluation board.
//
//*****************************************************************************
int
main(void)
{
    volatile unsigned long ulLoop;

    //
    // Enable lazy stacking for interrupt handlers.  This allows floating-point
    // instructions to be used within interrupt handlers, but at the expense of
    // extra stack usage.
    //
    ROM_FPULazyStackingEnable();

    //
    // Set the clocking to run directly from the crystal.
    //
    ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
                       SYSCTL_OSC_MAIN);

                       
    //
    // Enable the GPIO port that is used for the on-board LED.
    //
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
		SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    //
    // Enable the GPIO pins for the LED (PF2 & PF3).  
    //
    GPIOPinTypeTimer(GPIO_PORTF_BASE, GPIO_PIN_1);

                       
    //
    // Initialize the UART.
    //
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    ROM_GPIOPinConfigure(GPIO_PB0_U1RX);
    ROM_GPIOPinConfigure(GPIO_PB1_U1TX);
    ROM_GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    UARTStdioInit(1);

    //
    // Hello!
    //
    UARTprintf("Hello, world!\n");
    
    //
    // We are finished.  Hang around doing nothing.
    //
    while(1)
    {
        //
        // Turn on the BLUE LED.
        //
        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);

        //
        // Delay for a bit.
        //
        SysCtlDelay(SysCtlClockGet() / 10 / 3);

        //
        // Turn off the BLUE LED.
        //
        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);
        
        //
        // Delay for a bit.
        //
        SysCtlDelay(SysCtlClockGet() / 10 / 3);
    }
}


Uart0 haricindeki uart modüllerinde rx kesmesi oluşturamadım bu kart ile uğraşan arkadaşlar yardım ederlerse sevinirim.

muhendisbey

Bir de komutlarınız arasında sanki uart interrupt'ı yok gibi. Bu durumda sadece cycle bazında komut alırsınız ve farklı bir komut geldiğinde program kilitlenir. Startup dosyasında vector table'ı aktif etmeniz gerekli. Kendi uygulamalarında bu uartinthandler olarak isimlendirilmiş. yani orada UART1 in karşısına UARTIntHandler yazıp aynı zamanda main dosyasında bunu kullanmanız gerekli.

Eğer uartı halletmek istiyorsanız hello değil de echo uygulamasıyla uğraşmanızı tavsiye ederim. Alınan verinin geri yansıtılması uygulaması. O uygulamada kesme de var.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

AsHeS

Alıntı yapılan: muhendisbey - 20 Şubat 2013, 22:35:45
Bir de komutlarınız arasında sanki uart interrupt'ı yok gibi. Bu durumda sadece cycle bazında komut alırsınız ve farklı bir komut geldiğinde program kilitlenir. Startup dosyasında vector table'ı aktif etmeniz gerekli. Kendi uygulamalarında bu uartinthandler olarak isimlendirilmiş. yani orada UART1 in karşısına UARTIntHandler yazıp aynı zamanda main dosyasında bunu kullanmanız gerekli.

Eğer uartı halletmek istiyorsanız hello değil de echo uygulamasıyla uğraşmanızı tavsiye ederim. Alınan verinin geri yansıtılması uygulaması. O uygulamada kesme de var.
UART alıcısı için dediğiniz doğru da gönderim için gerek yok kesmeye bence.
Cycle bazında komut ne demek bilmiyorum(tüm komutlar cycle ya da pipeline aracılığıyla cycle bazlı işletiliyor diye biliyorum) ama bahsettiğiniz gibi echo uygulaması ve örnek UART uygulaması ile sorunu hallettim 2 algoritması var UART kullanmak için UARTStdioInit yerine diğer algoritmayı barındıran kodu yazıp çalıştırdım.
Çalışan kod aşağıda
   ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);//burdan baslar
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    GPIOPinConfigure(GPIO_PB0_U1RX);
    GPIOPinConfigure(GPIO_PB1_U1TX);
    ROM_GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    ROM_UARTConfigSetExpClk(UART1_BASE, ROM_SysCtlClockGet(), 115200,
                            (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                             UART_CONFIG_PAR_NONE));
    UARTCharPut(UART1_BASE,'x');//burda biter

muhendisbey

#12
Alıntı yapılan: superconductor - 28 Kasım 2012, 14:00:33
Uart0 haricindeki uart modüllerinde rx kesmesi oluşturamadım bu kart ile uğraşan arkadaşlar yardım ederlerse sevinirim.

RX verisini kullanmak için veri almak gerekir. Dolayısıyla da interrupt gerekir.
Cycle bazında dediğim kesme kullanmadan. Nedir? Veri gelmiş mi gelmemiş mi diye sürekli kontrol etmeyi kastediyorum. Yani diğer adıyla polling.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.