Cortex-M/NUVOTON2014. 7. 9. 14:01

M052LBN EVM - NUVOTON 12bit ADC 테스트

M052LBN EVM - NUVOTON  12bit ADC 테스트



NUVOTON M051 시리즈 ADC는 최대 12비트해상도 이고 특이사항으로 5V까지 측정 가능하다.


- 입력레인지 : 0~5V

- 10bit 12bit, 해상도

- 8채널 싱글, 4채널 differenctial

- 760kSPS (16Mhz)




M052LBN ADC 블록도




M052LBN ADC 초기화 코드

void ADCInit( void)

{

    SYS_UnlockReg();

    /* Enable ADC module clock */

    CLK_EnableModuleClock(ADC_MODULE);

    /* ADC clock source is 22.1184MHz, set divider to 7, ADC clock is 22.1184/7 MHz */

    CLK_SetModuleClock(ADC_MODULE, CLK_CLKSEL1_ADC_S_HIRC, CLK_CLKDIV_ADC(7));

    

 

    //ADC 포트 설정

    GPIO_DISABLE_DIGITAL_PATH(P1, BIT0);


    SYS->P1_MFP &= ~(SYS_MFP_P10_Msk);

    SYS->P1_MFP |= SYS_MFP_P10_AIN0;

    SYS_LockReg();

}



M052LBN ADC Read 코드

nsigned int ADCRead( unsigned int channelNum )

{

    ADC_Open(ADC, ADC_ADCR_DIFFEN_SINGLE_END, ADC_ADCR_ADMD_SINGLE_CYCLE, BIT0<<channelNum);


    /* Power on ADC module */

    ADC_POWER_ON(ADC);


    /* clear the A/D interrupt flag for safe */

    ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);


    /* start A/D conversion */

    ADC_START_CONV(ADC);


    /* Wait conversion done */

    while(!ADC_GET_INT_FLAG(ADC, ADC_ADF_INT));


    return ADC_GET_CONVERSION_DATA(ADC, channelNum);    

}




M052LBN ADC 테스트 코드

int main(void)

{

    _SystemInit();

    

    Led1Init();

    Led1On();


    Led2Init();

    Led2On();

    

    //Serial Init

    DebugInit(BAUD_115200);

    DebugPrint("NUVOTON ADC Test Program.\r\n");

    

    //ADC 초기화

    ADCInit();


    while(1)

    {

        DebugPrint("adc=%d\r\n", ADCRead(0));

        Led1Toggle();

        Delay(300);

    }

}




M052LBN ADC 테스트 동영상

NUVOTON M052LBM 의 ADC Ch0에 연결되어 있는 VR의 전압값을 TFT-LCD 그래프로 표시하는 테스트


Posted by nexp

댓글을 달아 주세요

Cortex-M/NUVOTON2014. 7. 9. 13:30

M052LBN - NUVOTON Timer 테스트

M052LBN - NUVOTON Timer 테스트




Nuvoton사의 M051시리즈는 4개의 32bit (8bit prescale, 24bit timer)타이머가 있다. 


M052LBN 타이머 블록도




크럭소스 선택




M052LBN 타이머 초기화 코드

타이머 클럭소스는 내부클럭을 사용하고 있기 때문에 HIRC를 선택해서 사용하고 있다.

void Timer0Init(void)

{

    SYS_UnlockReg();    

    /* Enable peripheral clock */

    CLK->APBCLK |= CLK_APBCLK_TMR0_EN_Msk;


    /* Peripheral clock source */

    CLK->CLKSEL1 |= CLK_CLKSEL1_TMR0_S_HIRC;


    //1ms 타이머 설정

    TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1000);

    TIMER_EnableInt(TIMER0);

    

    NVIC_EnableIRQ(TMR0_IRQn);

    

    TIMER_Start(TIMER0);

    

    SYS_LockReg(); 

}




M052LBN 타이머 인터럽트 핸들러

void TMR0_IRQHandler(void)

{

    if(TIMER_GetIntFlag(TIMER0) == 1)

    {

        TIMER_ClearIntFlag(TIMER0);


        gTimerTick1++;

    }

}




M052LBN 타이머 테스트 코드

int main(void)

{

    _SystemInit();

    

    Led1Init();

    Led1On();


    Led2Init();

    Led2On();

    

    //Serial Init

    DebugInit(BAUD_115200);

    DebugPrint("M052LBN Timer Test Program.\r\n");


    //타이머 초기화

    Timer0Init();

    while(1)

    {

        if(gTimerTick1>1000)

        {

            gTimerTick1 = 0;

            Led1Toggle();

        }

    }

}


Posted by nexp

댓글을 달아 주세요

Cortex-M/NUVOTON2014. 7. 9. 12:52

M052LBN EVM - SPI 테스트

M052LBN EVM - SPI 테스트




M052LBN는 저렴한 MCU임에도 2채널의 SPI를 제공한다. FIFO있고 SPI속도도 빠르다.




M052LBN SPI 블록도



M052LBN SPI 초기화 함수

void SPI0_Init(void)

{

SYS_UnlockReg();    

     CLK_EnableModuleClock(SPI0_MODULE);

         

    /* Set multi function pin for SPI1 */

    //SYS->P0_MFP = SYS_MFP_P04_SPISS1 | SYS_MFP_P05_MOSI_1 | SYS_MFP_P06_MISO_1 | SYS_MFP_P07_SPICLK1;

     SYS->P1_MFP = SYS_MFP_P15_MOSI_0 | SYS_MFP_P16_MISO_0 | SYS_MFP_P17_SPICLK0;

    

    

        /* Select HXT as the clock source of SPI1 */

    CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL1_SPI0_S_HCLK, MODULE_NoMsk);


    /* Enable SPI1 peripheral clock */

    CLK_EnableModuleClock(SPI0_MODULE);

    

    /* Lock protected registers */

    SYS_LockReg();

    

    

    /* Configure SPI1 as a master, MSB first, 8-bit transaction, SPI Mode-0 timing, clock is 6MHz */

    SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 8, 6000000);


    /* Enable the automatic hardware slave select function. Select the SS0 pin and configure as low-active. */

    SPI_EnableAutoSS(SPI0, SPI_SS, SPI_SS_ACTIVE_LOW);

}




SPI_CNTRL 레지스터





M052LBN SPI 송수신 함수

unsigned char SPI0_WriteReadByte(unsigned char Data)

{

    SPI_WRITE_TX0(SPI0, Data);

    /* Trigger SPI transfer */

    SPI_TRIGGER(SPI0);


    /* Check busy state */

    while(SPI_IS_BUSY(SPI0));


   return SPI_READ_RX0(SPI0);

}


Posted by nexp

댓글을 달아 주세요

Cortex-M/NUVOTON2014. 7. 6. 23:00

M052LBN EVM - UART테스트

M052LBN - UART테스트




M052LBN UART 특징

M0521은 2채널의 UART가 있다. 그리고 FIFO 있고.. RS485 9bit 모지원한다. 저렴한 MCU에서 지원은 좋은것 같다.


 - Separate receive / transmit 16/16 bytes entry FIFO for data payloads

 - hardware auto-flow control and flow control

 - Supports RS-485 9-bit mode

 - Supports hardware or software enable to program RTS pin to control RS-485 transmission direction directly



M052LBN UART 블록도




M052LBN UART 초기화 코드

void U0_Init(unsigned char baud)

{

    SYS_UnlockReg();    

    /* Enable UART module clock */

    CLK_EnableModuleClock(UART0_MODULE);


    /* Select UART module clock source */

    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));


    /* Set P3 multi-function pins for UART0 RXD and TXD */

    SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);

    SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);


    /* Lock protected registers */

    SYS_LockReg(); 

    

    U0_SetBaud(baud);

}




M052LBN UART 송수신 함수

void U0_PutByte(unsigned char Data)

{

while((UART0->FSR & UART_FSR_TE_FLAG_Msk) == 0);

UART0->THR = Data;    

}


unsigned char U0_GetByte(void)

{

while(UART0->FSR & UART_FSR_RX_EMPTY_Msk); 

return UART0->RBR;

}




M052LBN RS485 기능 







Posted by nexp

댓글을 달아 주세요

Cortex-M/NUVOTON2014. 7. 6. 22:00

M052LBN EVM - NUVOTON MCU성능 측정

M052LBN EVM - NUVOTON MCU성능 측정



NUVOTON사의 저렴한 MCU M052LBN 는 최대 클럭 50Mhz로 동작한다. GPIO토글을 이용하여 MCU성능 측정을 해 보았다.



3.2Mhz

#define Led1Toggle() P26 ^= 1


     15              while(1)

     16              {

     17                  Led1Toggle();

   \                     ??main_1: (+1)

   \   00000026   0x6821             LDR      R1,[R4, #+0]

   \   00000028   0x4041             EORS     R1,R1,R0

   \   0000002A   0x6021             STR      R1,[R4, #+0]

   \   0000002C   0xE7FB             B        ??main_1

   \   0000002E   0xBF00             Nop      

   \                     ??main_0:

   \   00000030   0x50004080         DC32     0x50004080

   \   00000034   0x50004258         DC32     0x50004258

     19              }




GPIO On/Off 시 7.2Mhz까지 출력 되는것이 확인된다.

#define Led1Off() P26 = 1

#define Led1On() P26 = 0


     15              while(1)

     16              {

     17                  Led1On();

   \                     ??main_1: (+1)

   \   00000026   0x6025             STR      R5,[R4, #+0]

     18                  Led1Off();

   \   00000028   0x6020             STR      R0,[R4, #+0]

   \   0000002A   0xE7FC             B        ??main_1

   \                     ??main_0:

   \   0000002C   0x50004080         DC32     0x50004080

   \   00000030   0x50004258         DC32     0x50004258

     21              }


1$ 이하 MCU에서 이정도 성는이면 포트도 여유롭고 나쁘지 않다.

 

Posted by nexp

댓글을 달아 주세요