[TI]/LM3S8xx2010. 5. 16. 15:47

[LM3S8XX EVM] 소형 그래픽 LCD테스트

[LM3S8XX EVM] 소형 그래픽 LCD테스트


Luminary Micro Cortex-M3 [LM3S8XX EVM]의 SSD1815 드라이버를 이용한 초소형 그래픽 LCD 테스트
SSD1815 모듈은 4핀의 GPIO만 있으면 쉽게 제어 가능하므로 [SM-EXP] 보드의 LCD포트 D0~D3을 이용하여 테스트 진행 했다.

먼저 [LM3S8xx EVM]의 GPIO PB0~PB3을 GLCD모듈의 SDA, RE, SCL, CS로 연결한다. 

LM3S812 SSD1815 GLCD 테스트 예제 소스

//=============================================================================
// LM3S8xx EVM 테스트 프로그램
//
// by  http://nexp.tistory.com
//=============================================================================

/*
 - PB0~PB3에 연결된 ( SDA, RE, SCL, CS) LCD제어
*/

#include "system.h"
#include "glcd.h"

int main()
{
 SystemInit(); 

 Led1Init();
 Led1On();
 
 //GLCD 초기화
 GlcdInit();

 //GLCD 데이터 출력
 GlcdSetAddress(0,0);
 GlcdPutStr("LM3Sxx Glcd Test");
 
 
 while(1)
 {
  Led1Toggle();
  Delay(300);
 }
 
 return 0;
}


LM3S812 GLCD 테스트 결과


Posted by nexp

댓글을 달아 주세요

[TI]/LM3S8xx2009. 3. 27. 21:56

[LM3S608] 센서 테스트 보드 제작

[LM3S608] 센서 테스트 보드 제작



LM3S608 보드를 이용하여 가속도, 자이로등의 각종 센서를 테스트 할수 있는 보드 제작.



3축 가속도 및 자이로 센서 테스트




회로도
LM3S608 Module







Posted by nexp

댓글을 달아 주세요

  1. 자이로

    구매할 수 있는지요?
    hojoonmk@hanmail.net

    2009.04.09 15:41 [ ADDR : EDIT/ DEL : REPLY ]

[TI]/LM3S2xxx2009. 3. 5. 17:27

[LM3S2965] PWM 제어

[LM3S2965] PWM 제어




Luminary Micro Cortex-M3 LM3S2965 PWM
예제소스코드
pwmgen.zip



PWM초기화 함수
void PwmInit(void)
{
    // Enable the peripherals used by this example.
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
 

    //
    // Set GPIO D0 and D1 as PWM pins.  They are used to output the PWM0 and
    // PWM1 signals.
    //
    GPIOPinTypePWM(GPIO_PORTG_BASE, GPIO_PIN_2 | GPIO_PIN_3);

    //
    // Compute the PWM period based on the system clock.
    //
    ulPeriod = SysCtlClockGet() / 50000;

    //
    // Set the PWM period to 50 kHz.
    //
    PWMGenConfigure(PWM_BASE, PWM_GEN_0, PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
    PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, ulPeriod);

    //
    // Set PWM0 to a duty cycle of 25% and PWM1 to a duty cycle of 75%.
    //
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, ulPeriod/4);
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_1, ulPeriod * 3 / 4);

    //
    // Enable the PWM0 and PWM1 output signals.
    //
    PWMOutputState(PWM_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT, true);

    //
    // Enable the PWM generator.
    //
    PWMGenEnable(PWM_BASE, PWM_GEN_0);
}


PWM출력 함수
void PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, unsigned long ulWidth)
{
    unsigned long ulGenBase, ulReg;

    //
    // Check the arguments.
    //
    ASSERT(ulBase == PWM_BASE);
    ASSERT(PWMOutValid(ulPWMOut));

    //
    // Compute the generator's base address.
    //
    ulGenBase = PWM_OUT_BADDR(ulBase, ulPWMOut);

    //
    // If the counter is in up/down count mode, divide the width by two.
    //
    if(HWREG(ulGenBase + PWM_O_X_CTL) & PWM_X_CTL_MODE)
    {
        ulWidth /= 2;
    }

    //
    // Get the period.
    //
    ulReg = HWREG(ulGenBase + PWM_O_X_LOAD);

    //
    // Make sure the width is not too large.
    //
    ASSERT(ulWidth < ulReg);

    //
    // Compute the compare value.
    //
    ulReg = ulReg - ulWidth;

    //
    // Write to the appropriate registers.
    //
    if(PWM_IS_OUTPUT_ODD(ulPWMOut))
    {
        HWREG(ulGenBase + PWM_O_X_CMPB) = ulReg;
    }
    else
    {
        HWREG(ulGenBase + PWM_O_X_CMPA) = ulReg;
    }
}

Luminary Micro에서 제공하는 함수는 상당히 복잡하다. 범용으로 사용하기 쉽게 제작하긴 했지만... 쉽다는 장점으로 속도에서는 상당한 문제가 있다.
특히나 모터제어와 같이 PWM출력을 주기적으로 변경해야 하는 루틴이 많을경우 AVR보다 더 느려질 수도 있다.

그래서 PWM 제어 함수를 따로 만들었다.
void PwmSet(unsigned int Speed)
{
   HWREG(PWM_OUT_BADDR(PWM_BASE, PWM_OUT_0) + PWM_O_X_CMPA) = PWM_MAX_VALUE - Speed;
}


테스트 동영상

Posted by nexp

댓글을 달아 주세요

[TI]/LuminaryMicro2008. 12. 30. 15:40

IAR Systems, Luminary Micro MCU용 무료 개발 툴 발표


IAR Systems사는 Luminary Micro사의 Stellaris 계열인 100, 300과 600 시리즈 등 3가지 MCU 시리즈를 위한 자사의 IAR

Embedded Workbench KickStart 판을 무료로 이용할 수 있다고 발표했다. KickStart 판은 32Kbyte 컴파일러를 갖추고 있는데 이는 현재 시장에 나와 있는 19개 Stellaris MCU 중 14개에 사용할 수 있는 칩 탑재형 플래시 모두를 완벽하게 지원한다.

Luminary Micro사는 ARM Cortex-M3 프로세서 기반 MCU를 설계 및 출시하고 판매하는 팹리스 반도체 회사로서 내장형 개발자들에게 최초로 1달러짜리 ARM을 제공한 회사다. 이 회사는 현재 100, 300과 최고 32킬로바이트 범위의 칩 탑재형 플래시를 갖춘 600과 64킬로바이트 칩 탑재형 플래시를 가진 800 계열 등 4 계열에 사용할 수 있는 19가지 Stellaris MCU를 가지고 있다. 이 KickStart 공개로 64킬로바이트 플래시를 가진 Stellaris 800 계열 칩만이 완전한 기능을 가진 무료 상업용 등급의 평가 툴로 충분히 지원되지 않고 있다.

Posted by nexp

댓글을 달아 주세요

[TI]/LM3S8xx2008. 12. 4. 12:40

Luminary Micro LM3S608 GPIO Toggle 속도 테스트

Luminary Micro LM3S608 GPIO Toggle 속도 테스트



외부 8Mhz 입력하여 PLL/4 = 50Mhz로 구동시 GPIO Toggle 속도는 240ns(2Mhz)정도 측정된다.  옵티마이즈 했을때 180ns(2.5Mhz)단순 페리속도 비교는 좀 그렇지만 AVR과 속도비교(16Mh에서 360ns(1.6Mhz))하면 조금 빠르다. 50Mhz 시스템 클럭인데도 페리가 이리 느린지? 좀더 알아볼 필요가 있다.

DSP28335와 GPIO Toggle 속도( 60ns(15Mhz) 비교하면 쫌....

그리고 같은 [Cortex-M3 STM32 속도] 에 비교하면 좀 더 느린것 같다.


    //-------------------------------------------------
    //Set the system clock to run at 50MHz from the PLL.
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |SYSCTL_XTAL_8MHZ);

   

    //GPIO  Init
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    Sbi(GPIO_PORTD_DIR_R, BIT0);
    Sbi(GPIO_PORTD_DEN_R, BIT0);
   
    while(1)
    {
        //GPIO Toggle
        GPIO_PORTD_DATA_R ^= BIT0;
    }




옵티마이즈 옵션을 바꾸니 코드가 좀더 간결해 진다.

     24           while(1)
     25           {
     26                  GPIO_PORTE_DATA_R ^= BIT0;  
   \                     ??main_1:
   \   00000052   0548               LDR.N    R0,??main_0+0x8  ;; 0x400243fc
   \   00000054   0068               LDR      R0,[R0, #+0]
   \   00000056   90F00100           EORS     R0,R0,#0x1
   \   0000005A   0349               LDR.N    R1,??main_0+0x8  ;; 0x400243fc
   \   0000005C   0860               STR      R0,[R1, #+0]
   \   0000005E   F8E7               B.N      ??main_1
   \                     ??main_0:
   

   
옵티마이스 사용시 180n/2.5Mhz
     24           while(1)
     25           {
     26                  GPIO_PORTE_DATA_R ^= BIT0;  
   \   00000050   3068               LDR      R0,[R6, #+0]
   \   00000052   80F00100           EOR      R0,R0,#0x1
   \   00000056   FAE7               B.N      ??main_1
   \                     ??main_0:


하지만 그래도 뭔가 원하는 속도가 나오지 않는다.
클럭을 오버 클럭 해보자
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

코드 수정하니 130ns/3.4Mhz 까지 출력된다.


비트제어 레지스터로 테스트 해 보니 8.5Mhz까지 나오지만 그래도 STM32보다는 느리다.
#define GPIOC                       GPIO_PORTC_BASE
#define sbi(Port, Bit)              HWREG(Port + (GPIO_O_DATA + (Bit << 2))) = Bit
#define cbi(Port, Bit)              HWREG(Port + (GPIO_O_DATA + (Bit << 2))) = 0

 while(1)
 {
        sbi(GPIOC, GPIO_PIN_6);
        cbi(GPIOC, GPIO_PIN_6);        
 }

     21           while(1)
     22           {
     24                  sbi(GPIOC, GPIO_PIN_6);
   \                     ??main_1:
   \   00000062   4021               MOVS     R1,#+64
   \   00000064   0160               STR      R1,[R0, #+0]
     25                  cbi(GPIOC, GPIO_PIN_6);       
   \   00000066   0021               MOVS     R1,#+0
   \   00000068   0160               STR      R1,[R0, #+0]
   \   0000006A   FAE7               B.N      ??main_1
   \                     ??main_0:
   \   0000006C   04000020           DC32     0x20000004
   \   00000070   00600040           DC32     0x40006000
   \   00000074   00610040           DC32     0x40006100
     28           }


참고로 Luminary에서 제공하는 함수를 이용하면 2.5Mhz 밖에 나오지 않는다.
     16           while(1)
     17           {
     21                  GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_6, GPIO_PIN_6);
   \                     ??main_1:
   \   00000050   4022               MOVS     R2,#+64
   \   00000052   4021               MOVS     R1,#+64
   \   00000054   2800               MOVS     R0,R5
   \   00000056   ........           BL       GPIOPinWrite
     22                  GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_6, 0);
   \   0000005A   0022               MOVS     R2,#+0
   \   0000005C   4021               MOVS     R1,#+64
   \   0000005E   2800               MOVS     R0,R5
   \   00000060   ........           BL       GPIOPinWrite
   \   00000064   F4E7               B.N      ??main_1
   \   00000066   00BF               Nop     
   \                     ??main_0:
   \   00000068   04000020           DC32     0x20000004
   \   0000006C   00600040           DC32     0x40006000
   \   00000070   FC630040           DC32     0x400063fc
     23           }


SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);
-> 400k


Posted by nexp

댓글을 달아 주세요