[NXP]/LPC1k2011. 8. 14. 12:11

[LPC1K EVM] PWM 테스트

[LPC1K EVM] PWM 테스트



LPC1111/LPC1112/LPC1113/LPC1114 는 4개의 타이머가 있고 각각 4개의 MATCH 레지스터가 있어 PWM으로 사용할 수 있다.
각 타이머별 PWM채널은 아래와 같다.

PIO1_6/RXD/CT32B0_MAT0
PIO1_7/TXD/CT32B0_MAT1
PO0_1/CLKOUT/CT32B0_MAT2
PIO0_11/AD0/CT32B0_MAT3


PIO1_1/AD2/CT32B1_MAT0
PIO1_2/AD3/CT32B1_MAT1
SWDIO/PIO1_3/AD4/CT32B1_MAT2
PIO1_4/AD5/CT32B1_MAT3/WAKEUP


PIO0_8/MISO0/CT16B0_MAT0
PIO0_9/MOSI0/CT16B0_MAT1
SWCLK/PIO0_10/SCK0/CT16B0_MAT2


PIO1_9/CT16B1_MAT0
PIO1_10/AD6/CT16B1_MAT1






PWM 초기화 및 주기 설정
#define PWM_INTERVAL             48000     //1ms(48000/48M)


    //PWM 초기화
    init_timer32PWM(TIMER_1, PWM_INTERVAL, (1<<PWM_CH2));
    enablePWM(TIMER_1, 1);
   
    //주기 설정
    period = SET_PWM(PWM_INTERVAL, 50);       //   50%
    setMatch_timer32PWM (TIMER_1, PWM_CH2, period);


LPC1113 PWM테스트 예제 소스코드
#include "system.h"
#include "serial.h"
#include "pwm.h"

#define TIME_INTERVAL             48000     //1ms(48000/48M)

int main()
{
    unsigned long period=0;
    unsigned long cnt = 0;
    SystemInit();

    Led1Init();
    Led1Off();
    
    U0_Init(BAUD_115200);
    DebugPrint("LPC1K PWM Test\r\n");
   
    //PWM 초기화
    init_timer32PWM(TIMER_1, PWM_INTERVAL, (1<<PWM_CH2));
 enablePWM(TIMER_1, 1);
   
    //주기 설정
    period = SET_PWM(PWM_INTERVAL, 50);       //   50%
    setMatch_timer32PWM (TIMER_1, PWM_CH2, period);

    while(1)
    {
        switch(U0_GetByte())
        {
        case '+':
            cnt += 1;
            period = SET_PWM(PWM_INTERVAL, cnt);
           
            DebugPrint("CNT= %d, %d\r\n", cnt, period);
            setMatch_timer32PWM (TIMER_1, PWM_CH2, period);
            break;            
           
           
        case '-':
            cnt -= 1;
            period = SET_PWM(PWM_INTERVAL, cnt);
           
            DebugPrint("CNT= %d, %d\r\n", cnt, period);
            setMatch_timer32PWM (TIMER_1, PWM_CH2, period);
            break;             
        }
   
    }
 
    return 0;
}


[LPC1113 EVM] PWM테스트 동영상
ADC값에 따라 PWM출력을 가변하는 예제




PWM초기화 함수 (init_timer32PWM)



PWM 주기 설정 함수 (setMatch_timer32PWM)




Posted by nexp

댓글을 달아 주세요

[NXP]/LPC1k2011. 8. 13. 16:56

[LPC1K EVM] LPC1114 타이머 테스트 - 1초 만들기

[LPC1K EVM] LPC1114 타이머 테스트 - 1초 만들기
CortexM0의 SysTick Timer 를 이용하여 1ms마다 인터럽트 발생하게 하여 1초간격으로 구동할 수 있다.
SysTick Timer는 24bit down counter타이머로 아래와 같은 구조를 가지고 있다.


인터럽트 핸들러(SysTick_Handler) 정의 해 주고 SysTick_Config()함수로 주기를 설정하면 된다.
여기서는 메인 클럭이 48Mhz이므로 1ms로 설정하기 위해 4800/48000000 = 0.001, 1ms로 설정 할 수 있다.

SysTick 타이머 초기화
SysTick_Config 함수는 core_cm0.h 에 정의되어 있다.
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SYSTICK_MAXCOUNT)  return (1);                                             /* Reload value impossible */

  SysTick->LOAD  =  (ticks & SYSTICK_MAXCOUNT) - 1;                                      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);                            /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   =  (0x00);                                                              /* Load the SysTick Counter Value */
  SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) | (1<<SYSTICK_TICKINT); /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                                            /* Function successful */
}


인터럽트 핸들러
//-----------------------------------------------------------------------------
//SysTick interrupt handler
void SysTick_Handler(void)
{
    Led2Toggle();
    TimeTick1_1ms++;
}
//-----------------------------------------------------------------------------


LPC1114 타이머 테스트 예제코드
#define SYSTICK_DELAY  48000       //1ms (48000/48M)

volatile uint32_t TimeTick1_1ms = 0;

//-----------------------------------------------------------------------------
//SysTick interrupt handler
void SysTick_Handler(void)
{
    Led2Toggle();
    TimeTick1_1ms++;
}
//-----------------------------------------------------------------------------

int main()
{
    SystemInit();

    Led1Init();
    Led1Off();
   
    Led2Init();
    Led2Off();

    //SysTick 설정   
    SysTick_Config( SYSTICK_DELAY );
   
    while(1)
    {
        //1초마다 Led 점등
        if(TimeTick1_1ms>1000)
        {
            Led1Toggle();
            TimeTick1_1ms = 0;
        }
   
    }
 
    return 0;
}




Timer32 사용하기
LPC11xx는 SysTick Timer외에 2개의 32bit 타이머와 2개의 16bit타이머가 있다.

타이머 초기화 함수
#define TIME_INTERVAL (SystemAHBFrequency/1000 - 1)

void InitTimer32B0(uint32_t TimerInterval)
{
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);

    LPC_TMR32B0->MR0 = TimerInterval;

    LPC_TMR32B0->MCR = 3;   /* Interrupt and Reset on MR0 */

    /* Enable the TIMER0 Interrupt */
    NVIC_EnableIRQ(TIMER_32_0_IRQn);
   
    //타이머 Enalbe
    LPC_TMR32B0->TCR = 1;  


인터럽트 핸들러
//-----------------------------------------------------------------------------
//SysTick interrupt handler
void CT32B0_IRQHandler(void)
{
  if ( LPC_TMR32B0->IR & 0x01 )
  { 
    LPC_TMR32B0->IR = 1;    /* clear interrupt flag */
   TimeTick1_1ms++;
  }
  return;
}
//-----------------------------------------------------------------------------



LPC1114 Timer32 이용 테스트 예제 소스코드

int main()
{
    SystemInit();

    Led1Init();
    Led1Off();
   
    Led2Init();
    Led2Off();

    //SysTick 설정   
    InitTimer32B0(TIME_INTERVAL);
   
    while(1)
    {
        //1초마다 Led 점등
        if(TimeTick1_1ms>1000)
        {
            Led1Toggle();
            TimeTick1_1ms = 0;
        }
   
    }
 
    return 0;
}
Posted by nexp

댓글을 달아 주세요

[NXP]/LPC1k2011. 2. 25. 23:00

[LPC1K EVM] SPI 테스트 - 가속도 센서 테스트

[LPC1K EVM] SPI 테스트 - 가속도 센서 테스트

LCP1K SPI 특징
- Maximum SPI speed of 25 Mbit/s (master) or 4.17 Mbit/s (slave) (in SSP mode)
- Compatible with Motorola SPI, 4-wire Texas Instruments SSI, and National Semiconductor Microwire buses
- Synchronous serial communication
- Master or slave operation
- 8-frame FIFOs for both transmit and receive
- 4-bit to 16-bit frame


SPI SLK핀은 P0.10, 2.11, P0.6포트에 리맵이 가능한데 [LPC1K EVM] 보드는 0.6에 되어 있으므로 아래와 같이 설정할 수 있다.
#define IOCON_SCKLOC_SCKPIN_PIO0_10               0 // Set SCK function to pin 0.10
#define IOCON_SCKLOC_SCKPIN_PIO2_11               1 // Set SCK function to pin 2.11
#define IOCON_SCKLOC_SCKPIN_PIO0_6                1 // Set SCK function to pin 0.6

 //Set 0.6 to SSP SCK (2.11 and 0.10 can also be used)
    LPC_IOCON->SCK_LOC = IOCON_SCKLOC_SCKPIN_PIO0_6;
    LPC_IOCON->PIO0_6 = IOCON_PIO0_6_FUNC_SCK; 
    LPC_IOCON->PIO0_6  |= IOCON_PIO0_6_MODE_PULLUP;



SPI 드라이버 함수(spi.c)의 초기화 함수 및 송수신 함수를 수정하면 기존 코드를 그대로 사용할 수 있다.
void SPI0_Init(void)
{
 LPC_SYSCON->PRESETCTRL    |=  (1 <<  0);
 LPC_SYSCON->SSP0CLKDIV    =  SCB_SSP0CLKDIV_DIV4;
 LPC_SYSCON->SYSAHBCLKCTRL |= SCB_SYSAHBCLKCTRL_SSP0;

    /* Set P0.8 to SSP MISO */
    LPC_IOCON->PIO0_8 &= ~IOCON_PIO0_8_FUNC_MASK;
    LPC_IOCON->PIO0_8 |= IOCON_PIO0_8_FUNC_MISO0;
    LPC_IOCON->PIO0_8  |= IOCON_PIO0_8_MODE_PULLUP; 
 
    /* Set P0.9 to SSP MOSI */
    LPC_IOCON->PIO0_9  &= ~IOCON_PIO0_9_FUNC_MASK;
    LPC_IOCON->PIO0_9  |= IOCON_PIO0_9_FUNC_MOSI0;
    LPC_IOCON->PIO0_9  |= IOCON_PIO0_9_MODE_PULLUP;

 //Set 0.6 to SSP SCK (2.11 and 0.10 can also be used)
    LPC_IOCON->SCK_LOC = IOCON_SCKLOC_SCKPIN_PIO0_6;
    LPC_IOCON->PIO0_6 = IOCON_PIO0_6_FUNC_SCK; 
    LPC_IOCON->PIO0_6  |= IOCON_PIO0_6_MODE_PULLUP;
  
    // Set clock polarity
 Cbi(LPC_SSP0->CR0, SSP_SSP0CR0_CPOL_MASK);

 // Set edge transition
 Sbi(LPC_SSP0->CR0, SSP_SSP0CR0_CPHA_SECOND); 


 /* Master mode */
 LPC_SSP0->CR1 = SSP_SSP0CR1_SSE_ENABLED | SSP_SSP0CR1_MS_MASTER | SSP_SSP0CR1_LBM_NORMAL;
 
    /* Clock prescale register must be even and at least 2 in master mode */ 
    LPC_SSP0->CPSR = 2;
}


SUINT SPI0_WriteReadByte(SUINT Data)
{
 /* Move on only if NOT busy and TX FIFO not full. */
 while ((LPC_SSP0->SR & (SSP_SSP0SR_TNF_NOTFULL | SSP_SSP0SR_BSY_BUSY)) != SSP_SSP0SR_TNF_NOTFULL);
 LPC_SSP0->DR = Data;
 
 while ( (LPC_SSP0->SR & (SSP_SSP0SR_BSY_BUSY|SSP_SSP0SR_RNE_NOTEMPTY)) != SSP_SSP0SR_RNE_NOTEMPTY );
 return(LPC_SSP0->DR);  
}


LPC1113 SPI 가속도 센서 테스트
가속도 센서를 테스트하기 위해 [NET-EVM]보드를 이용하였다. [NET-EVM]보드의 가속도 센서 CS는 CN7의 P8에 연결되어 있는데 LPC1K EVM보드는 핀수가 적어 할당되어 있지 않다.
그래서 점퍼를 이용하여 P3.5에 연결하여 테스트 하였다.


Posted by nexp

댓글을 달아 주세요

[NXP]/LPC1k2011. 1. 1. 23:00

[LPC1K-SM EVM] LPC1113 ADC테스트

[LPC1K-SM EVM] LPC1113 ADC테스트



LPC1K는 10비트 ADC(Sample time 2.44 μs)가 있다. VR을 이용하여 ADC값을 그래프로 출력하는 테스트 예제를 작성해 보았다.

LPC1113 ADC초기화
void AdcInit(unsigned int AD_Chan)
{
    unsigned long reg;
    unsigned char CLKDIV;

    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<13);
    CLKDIV = (uint8_t)ceil((double)SystemCoreClock/(double)4500000);
    reg = AD_Chan;
   
    InitAdcPort(AD_Chan);
   
    //ADC Clock 
    reg |= (CLKDIV << 8);
   
    LPC_ADC->CR = reg;
    LPC_ADC->INTEN = 0xFF & AD_Chan;
   
 LPC_ADC->CR |= (1 << 24);   
   
//    NVIC_EnableIRQ(ADC_IRQn);
}


ADC Read함수
unsigned int AdcRead(unsigned char port)
{
    return (0x3FF & (LPC_ADC->DR[port] >> 6));
}


LPC1113 ADC테스트 예제 코드
int main()
{
 unsigned int adc_value = 0;
 
    SystemInit();

    U0_Init(BAUD_115200);
    DebugPrint("LPC1K ADC Test\r\n");
   
    Led1Init();
    Led1On();

 //ADC 초기화
 AdcInit(BIT0);    

    while(1)
    {
  //LPC1K ADC Polling
  adc_value = AdcRead(BIT0);
  DebugPrint("%d\r\n", adc_value);
  Delay(10); 
 }
    
    return 0;
}


LPC1K ADC테스트 동영상
Posted by nexp

댓글을 달아 주세요

[NXP]/LPC1k2011. 1. 1. 17:00

[LPC1K-SM EVM] 시리얼 포트 테스트

[LPC1K-SM EVM] 시리얼 포트 테스트




LPC1K UART의 특징으로 저렴한 MCU임에도 불구하고 16byte의 FIFO가 있어 UART통신에 있어 편리하고 고속으로 처리할 수 있다. 그리고 RS-485/EIA-485 9-bit모드를 지원하고 하드웨어 흐름제어도 지원한다고 한다.



LPC1113 UART초기화 함수
//------------------------------------------------------------------------------
// Serial Prot0 Utility Fuction Routine
void U0_Init(unsigned long baud)
{
    NVIC_DisableIRQ(UART_IRQn);
    
    //UART 클럭 초기화
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);   // UART=1

    // Enable UART peripheral clock
    LPC_SYSCON->UARTCLKDIV = 0x01;      // DIV=1
    
    LPC_IOCON->PIO1_6 &= ~0x07;    /*  UART I/O config */
    LPC_IOCON->PIO1_6 |= 0x01;     /* UART RXD */
    LPC_IOCON->PIO1_7 &= ~0x07; 
    LPC_IOCON->PIO1_7 |= 0x01;     /* UART TXD */
 
 U0_SetBaud(baud);
}


1Byte 전송함수
void U0_PutByte(unsigned char Data)
{
    while ( !(LPC_UART->LSR & LSR_THRE) );
    LPC_UART->THR = Data;   
}

1Byte 수신함수
unsigned char U0_GetByte(void)
{
    while (!(LPC_UART->LSR & LSR_RDR));
    return LPC_UART->RBR;
}


LPC1K UART테스트 예제 코드
int main()
{
    SystemInit();

    U0_Init(BAUD_115200);
    DebugPrint("LPC1K UART Test\r\n");
   
    Led1Init();
    Led1On();
   
   
    Led2Init();
    Led2Off();
   
    while(1)
    {
        switch(U0_GetByte())
        {
        case '0':
            Led1Off();
            DebugPrint("LED OFF\r\n");
            break;
           
        case '1':
            Led1On();
            DebugPrint("LED ON\r\n");
            break;           
        }
    }
    return 0;
}
Posted by nexp

댓글을 달아 주세요