[MSP430]/MSP430_FRAM2017.03.30 00:38

[MSP430FR2311 EVM] UART 테스트

[MSP430FR2311 EVM] UART 테스트







MSP430FR2311 UART 초기화 코드

MSP430 UART Baudrate 설정 생성코드 참고


    // Configure UART pins

     P1SEL0 |= BIT6 | BIT7;                    // set 2-UART pin as second function



       // Configure UART

     UCA0CTLW0 |= UCSWRST;                     // Put eUSCI in reset

     UCA0CTLW0 |= UCSSEL__SMCLK;


     // Baud Rate calculation

     UCA0BR0 = 8;                              // 1000000/115200 = 8.68

     UCA0MCTLW = 0xD600;                 // 1000000/115200 - INT(1000000/115200)=0.68

                                                     // UCBRSx value = 0xD6 (See UG)

     UCA0BR1 = 0;

     UCA0CTLW0 &= ~UCSWRST;          // Initialize eUSCI



MSP430 에서 UART 보레이트 설정시 항상 문제가 되던 부분은 오차율인데... MCTLW 레지스터를 설정하면  보상 가능하다.


ex) 115200 @ 1Mhz 

1000000/115200 - INT(1000000/115200)=0.68

0.68 => 0.6667 -> 0xD6 





MSP430FR2311 UART 송수신 코드

unsigned char U0_GetByte(void)

{

while(!(UCA0IFG & UCRXIFG));

return UCA0RXBUF;

}


void U0_PutByte(unsigned char Data)

{

    UCA0TXBUF = Data;

    while(!(UCA0IFG & UCTXIFG));

}




참고로 CCS 에는 시리얼 포트 터미널창이 있어 간단히 UART 테스트를 해 볼수 있다.




Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC32MZ2016.12.25 01:21

[PIC32MZ EVM] UART 테스트

[PIC32MZ EVM] UART 테스트




PIC32MZ에서 UART를 사용하려면 MPLAB Harmony Configurator 를 실행해서 UART를 활성화 하고 설정해 주면 쉽게 사용가능하다.






[PIC32MZ EVM] 보드의 UART는 RD14->TXD, RD15-RXD에 할당되어 있다.

핀 다이어그램 에서 원하는 핀을 클릭해서 설정 할 수 있다.



그러면 아래와 같은 코드들을 자동으로 생성해 준다.

void SYS_Initialize ( void* data )

{

    /* Core Processor Initialization */

    SYS_CLK_Initialize( NULL );

    sysObj.sysDevcon = SYS_DEVCON_Initialize(SYS_DEVCON_INDEX_0, (SYS_MODULE_INIT*)&sysDevconInit);

    SYS_DEVCON_PerformanceConfig(SYS_CLK_SystemFrequencyGet());

    SYS_PORTS_Initialize();


    /* Initialize Drivers */

    sysObj.drvUsart0 = DRV_USART_Initialize(DRV_USART_INDEX_0, (SYS_MODULE_INIT *)&drvUsart0InitData);

    SYS_INT_VectorPrioritySet(INT_VECTOR_UART1_TX, INT_DISABLE_INTERRUPT);

    SYS_INT_VectorSubprioritySet(INT_VECTOR_UART1_TX, INT_SUBPRIORITY_LEVEL0);

    SYS_INT_VectorPrioritySet(INT_VECTOR_UART1_RX, INT_PRIORITY_LEVEL1);

    SYS_INT_VectorSubprioritySet(INT_VECTOR_UART1_RX, INT_SUBPRIORITY_LEVEL0);

    SYS_INT_VectorPrioritySet(INT_VECTOR_UART1_FAULT, INT_PRIORITY_LEVEL1);

    SYS_INT_VectorSubprioritySet(INT_VECTOR_UART1_FAULT, INT_SUBPRIORITY_LEVEL0);


    /* Initialize System Services */


    /*** Interrupt Service Initialization Code ***/

    SYS_INT_Initialize();

  

    /* Initialize Middleware */


    /* Enable Global Interrupts */

    SYS_INT_Enable();


    /* Initialize the Application */

    APP_Initialize();

}




void SYS_PORTS_Initialize(void)

{

    /* PORT D Initialization */

    PLIB_PORTS_OpenDrainEnable(PORTS_ID_0, PORT_CHANNEL_D, SYS_PORT_D_ODC);

    PLIB_PORTS_Write( PORTS_ID_0, PORT_CHANNEL_D,  SYS_PORT_D_LAT);

    PLIB_PORTS_DirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_D,  SYS_PORT_D_TRIS ^ 0xFFFF);

    PLIB_PORTS_ChangeNoticePerPortTurnOn(PORTS_ID_0, PORT_CHANNEL_D);

    PLIB_PORTS_ChannelModeSelect(PORTS_ID_0, PORT_CHANNEL_D, SYS_PORT_D_ANSEL ^ 0xFFFF, PORTS_PIN_MODE_DIGITAL);

    PLIB_PORTS_ChannelChangeNoticeEnable(PORTS_ID_0, PORT_CHANNEL_D, SYS_PORT_D_CNEN);

    PLIB_PORTS_ChannelChangeNoticePullUpEnable(PORTS_ID_0, PORT_CHANNEL_D, SYS_PORT_D_CNPU);

    PLIB_PORTS_ChannelChangeNoticePullDownEnable(PORTS_ID_0, PORT_CHANNEL_D, SYS_PORT_D_CNPD);

    

    /* PORT H Initialization */

    PLIB_PORTS_OpenDrainEnable(PORTS_ID_0, PORT_CHANNEL_H, SYS_PORT_H_ODC);

    PLIB_PORTS_Write( PORTS_ID_0, PORT_CHANNEL_H,  SYS_PORT_H_LAT);

    PLIB_PORTS_DirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_H,  SYS_PORT_H_TRIS ^ 0xFFFF);

    PLIB_PORTS_ChangeNoticePerPortTurnOn(PORTS_ID_0, PORT_CHANNEL_H);

    PLIB_PORTS_ChannelModeSelect(PORTS_ID_0, PORT_CHANNEL_H, SYS_PORT_H_ANSEL ^ 0xFFFF, PORTS_PIN_MODE_DIGITAL);

    PLIB_PORTS_ChannelChangeNoticeEnable(PORTS_ID_0, PORT_CHANNEL_H, SYS_PORT_H_CNEN);

    PLIB_PORTS_ChannelChangeNoticePullUpEnable(PORTS_ID_0, PORT_CHANNEL_H, SYS_PORT_H_CNPU);

    PLIB_PORTS_ChannelChangeNoticePullDownEnable(PORTS_ID_0, PORT_CHANNEL_H, SYS_PORT_H_CNPD);



    /* PPS Input Remapping */

    PLIB_PORTS_RemapInput(PORTS_ID_0, INPUT_FUNC_U1RX, INPUT_PIN_RPD14 );


    /* PPS Output Remapping */

    PLIB_PORTS_RemapOutput(PORTS_ID_0, OUTPUT_FUNC_U1TX, OUTPUT_PIN_RPD15 );

}






PIC32MZ UART 송수신 함수


void U0_PutByte (char chr)

{

   PLIB_USART_TransmitterByteSend (DRV_USART_INDEX_0, chr); 

   //U4TXREG = chr;


   while (! PLIB_USART_TransmitterIsEmpty (DRV_USART_INDEX_0));

  //while (! U4STAbits.TRMT); 

}



unsigned char U0_GetByte (char chr)

{

    while(!PLIB_USART_ReceiverDataIsAvailable(DRV_USART_INDEX_0));

    //while(U1STAbits.URXDA == 0);

    

    return PLIB_USART_ReceiverByteReceive(DRV_USART_INDEX_0);

}







XC32 컴파일러에서 printf 함수를 사용하고 싶다면 _mon_putc() 함수를 재정의 해 주면 사용할 수 있다.


void _mon_putc(char c)

{

     U0_PutByte(c);






Posted by nexp
TAG PIC32MZ, UART

댓글을 달아 주세요

[MSP430]/MSP4322016.05.07 20:00

MSP432 EVM - UART 테스트

MSP432 EVM - UART 테스트





MSP43는 총 4개의 UART를 가지고 있다.

MSP432 EVM의 UART는 EUSCI_A0_BASE의 P1.2->RXD, P1.3->TXD 에 할당이 되어 있다.



MSP432의 보레이트 설정은 MSP430 보레이트 계산기를 이용하면 동일하게 설정 가능하다.

http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/



MSP432 UART 초기화 설정 코드


const eUSCI_UART_Config uartConfig =

{

        EUSCI_A_UART_CLOCKSOURCE_SMCLK,          // SMCLK Clock Source

        13,                                      // BRDIV = 13

        0,                                       // UCxBRF = 0

        37,                                      // UCxBRS = 37

        EUSCI_A_UART_NO_PARITY,                  // No Parity

        EUSCI_A_UART_MSB_FIRST,                  // MSB First

        EUSCI_A_UART_ONE_STOP_BIT,               // One stop bit

        EUSCI_A_UART_MODE,                       // UART mode

        EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION  // Oversampling

};



    /* Selecting P1.2 and P1.3 in UART mode */

    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);


    /* Setting DCO to 24MHz (upping Vcore) */

    FlashCtl_setWaitState(FLASH_BANK0, 2);

    FlashCtl_setWaitState(FLASH_BANK1, 2);

    MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);

    CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_24);


    /* Configuring UART Module */

    MAP_UART_initModule(EUSCI_A0_BASE, &uartConfig);


    /* Enable UART module */

    MAP_UART_enableModule(EUSCI_A0_BASE);





MSP432 UART 송수신 함수 코드 

unsigned char U0_GetByte(void)

{

    unsigned char  temp = 0;

    temp = MAP_UART_receiveData(EUSCI_A0_BASE);


    return temp;

}


void U0_PutByte(unsigned char Data)

{

    MAP_UART_transmitData(EUSCI_A0_BASE, Data);

}




Posted by nexp

댓글을 달아 주세요

[ATMEL]/SAMD212016.02.14 02:15

[SAMD21 EVM] - UART 테스트

[SAMD21 EVM] - UART 테스트





SAM D 시리즈의 특징으로 멀티 SERCOM모듈을 들수 있다. SERCOM 은 I2C, SPI or USART를 쉽게 할당해서 유연하게 사용 할 수 있는 장점이 있다. 특히 IO핀을 다양한 형태로 할당 할 수 있으므로 PCB설계에 있어 자유롭게 제작 가능하다. 





SAMD21 UART 초기화 설정 코드

SAMD21 EVM의 UART는 SERCOM2의 PA13(PAD1)->RXD, PA14(PAD2)->TXD 에 할당이 되어 있으므로 아래와 같이 핀맵 설정할 수 있다.

struct usart_config usart_conf;


usart_get_config_defaults(&usart_conf);

usart_conf.mux_setting = USART_RX_1_TX_2_XCK_3;

usart_conf.pinmux_pad0 = PINMUX_UNUSED;

usart_conf.pinmux_pad1 = PINMUX_PA13C_SERCOM2_PAD1; //RXD

usart_conf.pinmux_pad2 = PINMUX_PA14C_SERCOM2_PAD2; //TXD

usart_conf.pinmux_pad3 = PINMUX_UNUSED;

usart_conf.baudrate    = baudrate;


       stdio_serial_init(&_UART0, SERCOM2, &usart_conf);

usart_enable(&_UART0); 




SAMD21 UART 송수신 함수 코드 

unsigned char U0_GetByte(void)

{

    uint16_t  temp = 0;

    while(STATUS_OK != usart_read_wait(&_UART0, &temp));


    return temp;

}


void U0_PutByte(unsigned char Data)

{

    while(STATUS_OK !=usart_write_wait(&_UART0, Data));

}




SAMD21 UART 테스트 소스코드

int main(void)

{

_SystemInit();


//config_led();

    Led1Init();

    Led2Init();

    Led1On();

    Led2On();

    

    U0_Init(BAUD_115200);

    DebugPrint("SAMD21 UART Test\r\n");


while (true)

    {

        Led1Toggle(); 

        

        U0_PutByte(U0_GetByte());

}

}






SAMD21 UART 하드웨어 설계시 주의 사항


SAMD 시리즈 데이터 시트를 보면 시리얼 포트 설정은 SERCOM_PAD로해서 소프트웨어로 쉽게 할당 가능한것 처럼 되어 있다.




하지만 아래와 같이 실제로 각 포트의 PAD에 할당 가능한 기능이 제한적이다. PAD1의 경우 TXD 할당이 안된다. PAD1의 핀을 사용하려면 주의가 필요하다. 장점만 내세우고 있지만 제약사항이 있어 이런점이 아쉬운 점이다. GPIO 할당에 있어 SWITCH MAXRIX 를 지원하는 LPC800 시리즈와 비교해 보면 상당히 아쉬운점이 있는것 같다.



SAMD21 EVM 보드의 UART는 PA13(PAD1)->TXD, PA14(PAD2)->RXD 로 디자인 했지만 PAD1에 TXD 할당이 되지 않아 두 핀을 바꿔서 사용하고 있다.



참고로 SAMD21 부트로더 기본 시리얼 포트는 아래와 같다. 다음 디자인에는 고려 해봐야 할것 같다.

PA23 (115200, 8, N, 1) SERCOM3 PAD1 (UART RXD)


PA22 (115200, 8, N, 1) SERCOM3 PAD0 (UART TXD)


Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42014.12.15 18:17

STM32F4 UART interrupt 테스트

STM32F4 UART interrupt 테스트



void U0_SetInt(void)

{

    /* NVIC for USART1 */

    HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);

    HAL_NVIC_EnableIRQ(USART1_IRQn);

    

      /* Enable the UART Data Register not empty Interrupt */

    __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_RXNE);

}




void USART1_IRQHandler(void)

{

    U0_PutByte(U0_GetByte());

}


Posted by nexp

댓글을 달아 주세요