TM4C123 EVM - TFT-LCD 테스트

[TI]/TM4C | 2014/07/27 21:00
Posted by nexp

TM4C123 EVM - TFT-LCD 테스트 



TM4C123 보드를 이용하여 TFT-LCD를 적은 핀수로 테스트 할 수 있는 [LCD-CONV] 보드의 TFT-LCD 테스트를 진행 했다. TFT-LCD출력 속도는 18ms로 빠른데 SD Card 읽어들이는 속도가 상대적으로 느려 고속출력은 무리가 있어 보인다.


TI 제공 ROM 함수 사용시

320x240 한프레임 출력 시간이 100ms 정도 출력된다.

상당히 느리다..

#define _LCD_DAT_OUT(Data) ROM_GPIOPinWrite(GPIO_PORTC_BASE, 0xFF, Data>>8);\

                                        LCD_DATA_LATCH();\

                                                                ROM_GPIOPinWrite(GPIO_PORTC_BASE, 0xFF, Data&0xFF)




레지스터 직접 제어시

18ms 로 상당히 빨라졌다.

#define _LCD_DAT_OUT(Data) PORTC = (Data>>8);\

                                              LCD_DATA_LATCH();\

                                                                PORTC = Data




TM4C123 TFT-LCD 테스트 동영상







TM4C123 TFT-LCD 드라이버 코드

//-----------------------------------------------------------------------------

// TFT LCD Driver

#define TFT_DRV_HD66791 0

#define TFT_DRV_COM44 1


                                        

#define LCD_LAT_BIT BIT6

#define LCD_LAT_PORT GPIO2

#define LCD_LAT_ON() PD6 = BIT6;

#define LCD_LAT_OFF() PD6 = 0;

#define LCD_DATA_LATCH() LCD_LAT_ON();LCD_LAT_OFF();


#define LCD_RST_BIT BIT6

#define LCD_RST_PORT GPIOA

#define LCD_RST_ON()

#define LCD_RST_OFF()


#define LCD_WR_BIT BIT0

#define LCD_WR_PORT GPIO2

#define LCD_WR_OFF() (PD0 = 0);

#define LCD_WR_ON() (PD0 = BIT0);


#define LCD_RS_BIT BIT1

#define LCD_RS_PORT GPIO2

#define LCD_RS_OFF() (PD1 = 0);

#define LCD_RS_ON() (PD1 = BIT1);


#define LCD_EN_BIT BIT2

#define LCD_EN_PORT GPIO2

#define LCD_ENABLE() (PD2 = 0);

#define LCD_DISABLE() (PD2 = BIT2);


#define LCD_BL_BIT BIT3

#define LCD_BL_PORT GPIO2

#define LCD_BL_OFF() (PD3 = 0);

#define LCD_BL_ON() (PD3 = BIT3);


/*                                        

#define _LCD_DAT_OUT(Data) ROM_GPIOPinWrite(GPIO_PORTC_BASE, 0xFF, Data>>8);\

                                        LCD_DATA_LATCH();\

                                        ROM_GPIOPinWrite(GPIO_PORTC_BASE, 0xFF, Data&0xFF)

*/


#define _LCD_DAT_OUT(Data) PORTC = (Data>>8);\

                                        LCD_DATA_LATCH();\

                                        PORTC = Data


#define TFTGpioInit() ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, 0xFF);\

                                        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, 0xFF); 

//-----------------------------------------------------------------------------




TM4C123 SD Card 드라이버 코드

//-----------------------------------------------------------------------------

// SD Card HAL

#define _DEBUG_FAT_FILE                 1


#define MMC_CS_PORT GPIOA

#define MMC_CS_BIT     BIT3


#define MMC_CS_INIT() ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, MMC_CS_BIT);


#define MMC_CS_HIGH() PA3 = BIT3

#define MMC_CS_LOW() PA3 = 0;


#define MMC_SpiInit() SPI0_Init()

#define MMC_SendByte SPI0_WriteReadByte

#define MMC_Send(Data) SPI0_WriteReadByte(Data)

#define MMC_Recv() SPI0_WriteReadByte(0xFF)

#define MMC_SPISpeed SPI0_SetSpeed


#define SPI_Mode3() 


#define FAT_MAX_NUM_FILE          50


#define FCLK_SLOW()                     MMC_SPISpeed(SPI_SPEED_1MHZ)

#define FCLK_FAST()                    MMC_SPISpeed(SPI_SPEED_10MHZ) 

//-----------------------------------------------------------------------------




저작자 표시 비영리 변경 금지

TM4C123 - Timer 테스트

[TI]/TM4C | 2014/07/26 21:30
Posted by nexp

TM4C123  - Timer 테스트



TM4C123의 페리는 정말 막강한데12개의 타이머와 20개의 PWM을 출력 할 수 있다. 그리고 마음에 드는 사항이 64bit 타이머가 6개 있다.


TM4C123의 타이머 관련 특징

■ 16/32-bit operating modes:

-16- or 32-bit programmable one-shot timer

-16- or 32-bit programmable periodic timer

-16-bit general-purpose timer with an 8-bit prescaler

-32-bit Real-Time Clock (RTC) when using an external 32.768-KHz clock as the input

-16-bit input-edge count- or time-capture modes with an 8-bit prescaler

-16-bit PWM mode with an 8-bit prescaler and software-programmable output inversion of the PWM signal


■ 32/64-bit operating modes:

-32- or 64-bit programmable one-shot timer

-32- or 64-bit programmable periodic timer

-32-bit general-purpose timer with a 16-bit prescaler

-64-bit Real-Time Clock (RTC) when using an external 32.768-KHz clock as the input

-32-bit input-edge count- or time-capture modes with a16-bit prescaler

-32-bit PWM mode with a 16-bit prescaler and software-programmable output inversion of the PWM signal


■ Count up or down


■ Twelve 16/32-bit Capture Compare PWM pins (CCP)



TM4C123의 타이머 블록도




TM4C123 타이머 CCP 핀맵




TM4C123 타이머 초기화 함수

void InitTimer0(void)

{

    // Enable the peripherals used by this example.

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);


    // Enable processor interrupts.

    ROM_IntMasterEnable();


    // Configure the two 32-bit periodic timers.

    ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);

    

    //1ms

    ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, ROM_SysCtlClockGet()/1000);


    

    // Setup the interrupts for the timer timeouts.

    ROM_IntEnable(INT_TIMER0A);

    ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);


    // Enable the timers.

    ROM_TimerEnable(TIMER0_BASE, TIMER_A);    

}




TM4C123 타이머 인터럽트 핸들러

void Timer0IntHandler(void)

{

    // Clear the timer interrupt.

    ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);


    gTimeTick1++;    

}




TM4C123 타이머 예제 소스코드

int main(void)

{

    int cnt = 0;

    

    SystemInit();

    Led1Init();

    Led1On();

    

    Led2Init();

    Led2On();

    

    DebugInit(BAUD_115200);

    DebugPrint("TM4C123 Timer Test\r\n");

    

    InitTimer0();

    

    while(1)

    {

        if(gTimeTick1>1000)

        {

            gTimeTick1 = 0;

            Led1Toggle();

        }

    }


}


저작자 표시 비영리 변경 금지

TM4C123 - SPI 테스트 (3축 가속도 센서)




TM4C123 의 SPI 기능을 테스트 해 보았다.

최대 SPI클럭이 25 MHz까지 동작 가능하고 FIFO를 내장하고 있다. 특이사항으로 4채널의 SPI블럭을 사용할 수 있어서 SPI블록이 많이 필요한 어플리케이션에 좋을것 같다. 


TM4C123 EVM 보드에서는 PA2, PA3, PA4, PA5 에 SPI를 할당해 두었다.



TM4C123 의 SPI블록도



TM4C123 의 SPI 핀맵

TM4C 는 최대 4채널의 SPI모듈을 제공한다. 

핀맵을 아래와같이 설정 가능하다.





TM4C123 의 SPI 초기화 함수

TI의 기존 Cortex-M3 코어와 코드를 호환하도록 제작되어 있기 때문에 코드 변경없이 그대로 사용가능하다. 물론 초기화 코드는 약간의 수정이 필요하다.

// SPI 통신 초기화 함수

void SPI0_Init(void) 

{

    // The SSI0 peripheral must be enabled for use.

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);


// Configure the pin muxing for SSI0 functions on port A2, A3, A4, and A5.

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    

    ROM_GPIOPinConfigure(GPIO_PA2_SSI0CLK);

    //ROM_GPIOPinConfigure(GPIO_PA3_SSI0FSS);

    ROM_GPIOPinConfigure(GPIO_PA4_SSI0RX);

    ROM_GPIOPinConfigure(GPIO_PA5_SSI0TX);

    

    ROM_GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_2);


    ROM_SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), _ssi0_mode,

                       SSI_MODE_MASTER, _ssi0_baud, 8);


    // Enable the SSI0 module.

    ROM_SSIEnable(SSI0_BASE);    

}




TM4C123 의 SPI 송수신 함수

UINT SPI0_WriteReadByte(UINT Data)

{

unsigned long rx_data;

ROM_SSIDataPut(SSI0_BASE, Data);

ROM_SSIDataGet(SSI0_BASE, &rx_data);

return rx_data;    

}



Sellaless SPI 테스트 예제 를 참고 하면 되는데 속도를 필요로 한다면 아무래도 레지스터를 직접 제어 하는것이 좋을것 같다.


UINT SPI0_WriteReadByte(UINT Data)

{

    // Wait until there is space.

    while(!(HWREG(SSI0_BASE + SSI_O_SR) & SSI_SR_TNF))

    {

    }


    // Write the data to the SSI.

    HWREG(SSI0_BASE + SSI_O_DR) = Data;

    while(!(HWREG(SSI0_BASE + SSI_O_SR) & SSI_SR_RNE))

    {

    }


    // Read data from SSI.

    return (HWREG(SSI0_BASE + SSI_O_DR));

}







TM4C123 EVM - 3축 가속도 센서 드라이버 코드





//-----------------------------------------------------------------------------

// myAccel3LV02 HAL

#define MY_ACCEL3LV02_SPI_MODE 1

#define MY_ACCEL3LV02_I2C_MODE 0


#define ACCEL_CS_BIT BIT4

#define ACCEL_CS_PORT PORTB


#define ACCEL_CS_INIT() ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, ACCEL_CS_BIT);

#define ACCEL_CS_ASSERT() PB4 = 0

#define ACCEL_CS_DEASSERT() PB4 = ACCEL_CS_BIT;


#define ACCEL_SPI_INIT()         SPI0_Init()

#define ACCEL_Read SPI0_WriteReadByte

#define ACCEL_Write SPI0_WriteReadByte

//-----------------------------------------------------------------------------




TM4C123 EVM - 3축 가속도 센서 예제 코드

int main(void)

{

    short data;

    

    SystemInit();

    Led1Init();

    Led1On();

    

    Led2Init();

    Led2On();

    

    DebugInit(BAUD_115200);

    DebugPrint("TM4C Uart Test\r\n");


myAccel3lvInit();

myAccel3lvWrite(CTRL_REG1, 0xC7); //1000.0111 Power on, enable all axis, self test off


    DebugPrint("WHO_AM_I: %x\r\n", myAccel3lvRead(WHO_AM_I));    


    while(1)

    {

if(DebugIsByte())

{

switch(U0_GetByte())

{

case '0':

Led1Off();

DebugPrint("LED OFF\r\n");

break;

case '1':

Led1On();

DebugPrint("LED ON\r\n");

break;

case 't':

DebugPrint("WHO_AM_I: %x\r\n", myAccel3lvRead(WHO_AM_I));

break;

case 'r':

GetAccelValue(AXIS_X, &data);

DebugPrint("%d\r\n", data);

break;

}

}       

    }


}


저작자 표시 비영리 변경 금지

TM4C123 - HWREG 정의

[TI]/TM4C | 2014/07/25 22:12
Posted by nexp

TM4C123 - HWREG 정의



Stellaris Firmware Development Package, hw_types.h

//*****************************************************************************
//
// Macros for hardware access, both direct and via the bit-band region.
//
//*****************************************************************************
#define HWREG(x)                                                              \
        (*((volatile unsigned long *)(x)))
#define HWREGH(x)                                                             \
        (*((volatile unsigned short *)(x)))
#define HWREGB(x)                                                             \
        (*((volatile unsigned char *)(x)))
#define HWREGBITW(x, b)                                                       \
        HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 |                \
              (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2))
#define HWREGBITH(x, b)                                                       \
        HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 |               \
               (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2))
#define HWREGBITB(x, b)                                                       \
        HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 |               \
               (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2))


저작자 표시 비영리 변경 금지
TAG TM4C123

TM4C123 - UART UART 테스트

[TI]/TM4C | 2014/07/20 23:00
Posted by nexp

TM4C123 - UART UART 테스트




TM4C123 UART 특징

Tiva TM4C123FH6PM의 UART의 특징은 아래와 같다.

눈여겨 볼 만한 사항으로 64핀 패키지에서도 8채널 UART를 사용할 수 있고 485모드, 가변 FIFO 등등을 들수 있을것 같다.

 - 8Ch UART

 -  Programmable baud-rate generator allowing speeds up to 5 Mbps , 10 Mbps 

 - FIFO trigger levels of 1/8, 1/4, 1/2, 3/4, and 7/8

 - Separate 16x8 transmit (TX) and receive (RX) FIFOs

 - IrDA serial-IR (SIR) encoder/decoder providing

 - EIA-485 9-bit support



64핀 패키지에서  최대 8채널을 사용할 수 있다. 

아래와 같이 8채널 할당이 가능하다.




TM4C123 UART블록도





TM4C123 UART 초기화 함수

void U0_Init(unsigned char baud)

{

    // Enable the GPIO Peripheral used by the UART.

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);


    // Enable UART0

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);


    // Configure GPIO Pins for UART mode.

    ROM_GPIOPinConfigure(GPIO_PA0_U0RX);

    ROM_GPIOPinConfigure(GPIO_PA1_U0TX);

    ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);


    // Use the internal 16MHz oscillator as the UART clock source.

    UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);


    U0_SetBaud(baud);

}




TM4C123 UART 송수신 함수 

UARTFR 레지스터를 확인해서 처리해주면 된다.

void U0_PutByte(unsigned char Data)

{

    // Wait until space is available.

    while(HWREG(UART0_BASE + UART_O_FR) & UART_FR_TXFF)

    {

    }


    HWREG(UART0_BASE + UART_O_DR) = Data;

}



unsigned char U0_GetByte(void)

{

    // Wait until a char is available.

    while(HWREG(UART0_BASE + UART_O_FR) & UART_FR_RXFE)

    {

    }


    return(HWREG(UART0_BASE + UART_O_DR));

}









저작자 표시 비영리 변경 금지

블로그 이미지

nexp

카테고리

분류 전체보기 (1441)
[MyProject] (32)
[TI] (70)
[NXP] (36)
[ST_MICRO] (86)
[FreeScale] (30)
[MSP430] (116)
[Microchip] (121)
Cortex-M (36)
[AnalogDevice] (22)
ARM9 (24)
[ARM7] (47)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (48)
[INTERFACE] (206)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (121)
[SENSOR] (40)
[DATA] (21)
[FPGA/PLD] (29)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)

티스토리 툴바