MSP430FR2311 저전력 테스트

[MSP430]/MSP430_FRAM | 2017.03.31 05:11
Posted by nexp

MSP430FR2311 저전력 테스트


CPU클럭을 1Mhz로 구동시키고 10bit ADC데이터를 300ms주기로 UART(115200bps)에 실어 보내는 예제를 테스트 해본 결과 320uA정도 전류를 소모한다.


UART로 전송할 때만 CPU를 깨우고 평소에는 LPM3 모드로 동작하도록 수정해 보았다.

이 상태에서도 280uA 정도 소비한다.


클럭을 낮추면 좀더 낮아지지 않을까? 하지만 UART를 115200로 구동하기 위해 1Mhz구동이 필요하다.



일반 MCU에 비교하면 특별한 처리 하지 않고도 상당히 낮은 전류 소모를 확인 할 수 있다.







MSP430G2553

1Mhz + UART -> 350uA - UART만 사용할 경우 

1Mhz + UART + ADC -> 650uA 

16Mhz 780uA



STM32F030

48Mhz 5800uA (레귤레이터 사용시 15mA)

8Mhz 5400uA

1Mhz 5000uA

[MSP430FR2311 EVM] FRAM 테스트

[MSP430]/MSP430_FRAM | 2017.03.30 00:42
Posted by nexp

[MSP430FR2311 EVM] FRAM 테스트





MSP430FR2311 의 최대 장점은 FRAM이다. RAM의 장점인 쉽고 빠르게 Read/Write 하고, FLASH의 장점인 전원 Off시 데이터 유지하는 장점을 가지고 있어서 저전력의 데이터 로깅 시스템에 적용하기에 좋은것 같다.


이러한 MSP430의 FRAM에 읽고 쓰는 테스트 를 해 보았다.



MSP430F2311 FRAM 블록도





FRAM에 Write 하는 코드는 상당히 간단하다.


void FRAMWrite(unsigned long *FRAM_write_ptr, unsigned long Data)

{

    SYSCFG0 = FRWPPW;


    *FRAM_write_ptr = Data;


    SYSCFG0 = FRWPPW | PFWP;

}



void FRAMWriteBuffer(unsigned long *FRAM_write_ptr, unsigned long *pBuf, unsigned int Size)

{

    unsigned int i=0;


    SYSCFG0 = FRWPPW;

    for (i = 0; i < Size; i++)

    {

        *FRAM_write_ptr++ = pBuf[i];

    }

    SYSCFG0 = FRWPPW | PFWP;

}



MSP430FR2311의 FRAM 메모리 주소는 아래와 같이 FFFF-FF80, FFFF-FF100로 코드 메모리와 같이 사용할 수 있다. 예제에서는 FD00에서 테스트 했다.


[MSP430FR2311 EVM] ADC테스트 - 내장 온도 센서 테스트



MSP430FR2311 는 10bit, 12bit ADC가 8채널이 있다. 최대 200ksps 까지 변환 가능하기존 MSP430시리즈와 크게 차이는 없지만 FRAM을 사용하면 장점이 될만한 기능이 있는것 같다.



MSP430FR2311 ADC 블록도



MSP430FR2311 ADC 초기화 코드


    // Configure ADC - Pulse sample mode; ADCSC trigger

    ADCCTL0 |= ADCSHT_8 | ADCON;                                  // ADC ON,temperature sample period>30us

    ADCCTL1 |= ADCSHP;                                            // s/w trig, single ch/conv, MODOSC

    ADCCTL2 |= ADCRES;                                            // 10-bit conversion results

    ADCMCTL0 |= ADCSREF_1 | ADCINCH_12;                           // ADC input ch A12 => temp sense

    ADCIE |=ADCIE0;                                               // Enable the Interrupt request for a completed ADC_B conversion


    // Configure reference

    PMMCTL0_H = PMMPW_H;                                          // Unlock the PMM registers

    PMMCTL2 |= INTREFEN | TSENSOREN;                              // Enable internal reference and temperature sensor





MSP430FR2311 온도센서 특성 그래프



MSP430FR2311 ADC 인터럽트 핸들러

// ADC interrupt service routine

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)

#pragma vector=ADC_VECTOR

__interrupt void ADC_ISR(void)

#elif defined(__GNUC__)

void __attribute__ ((interrupt(ADC_VECTOR))) ADC_ISR (void)

#else

#error Compiler not supported!

#endif

{

    switch(__even_in_range(ADCIV,ADCIV_ADCIFG))

    {

        case ADCIV_NONE:

            break;

        case ADCIV_ADCOVIFG:

            break;

        case ADCIV_ADCTOVIFG:

            break;

        case ADCIV_ADCHIIFG:

            break;

        case ADCIV_ADCLOIFG:

            break;

        case ADCIV_ADCINIFG:

            break;

        case ADCIV_ADCIFG:

            temp = ADCMEM0;

            // Temperature in Celsius

            // The temperature (Temp, C)=

            IntDegC = (temp-CALADC_15V_30C)*(85-30)/(CALADC_15V_85C-CALADC_15V_30C)+30;


            // Temperature in Fahrenheit

            // Tf = (9/5)*Tc | 32

            IntDegF = 9*IntDegC/5+32;

            //__bic_SR_register_on_exit(LPM3_bits);               // Exit LPM3


            break;

        default:

            break;

    }

}










[MSP430FR2311 EVM] UART 테스트

[MSP430]/MSP430_FRAM | 2017.03.30 00:38
Posted by nexp

[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 테스트를 해 볼수 있다.




[MSP430FR2311 EVM] 개발환경 설정 - CCS7 무료컴파일러 사용하기




MSP430FR2x 시리즈를 개발하기 위한 환경으로 IAR 최신 버전이 필요하다. 

MSP430 Kickstart 버전을 다운 받으려고 사이트 들어가니 CCSv7(Code Composer Studio V7) 가 무료(솔깃~)라고 한다.


이참에 CCS로 한번 테스트 해볼까?


우선 CCS를 다운 받자

Code Composer Studio V7Sv7     



프로그램 설치 후 MSP430FR2311 디바이스로 새로운 프로젝트를 생성한다. 특별히 설정할것 없이 그냥 간단하게 프로젝트 생성 가능하다.





간단히 LED제어 하는 예제 작성후 다운로드 해보자





다운로드 후 디버깅 환경으로 들어가고 문제 없이 디버깅 되는것을 확인할 수 있다.

예전 버전에서는 툴자체가 불안하고 느렸으며 설정도 복잡 했었는데..

상당히 깔끔하게 잘 동작 하는것 같다. 



앞으로 MSP430 개발에서는 CCS를 적극 활용하는 방향으로 진행해 봐야 할것 같다.



[MSP430FR2311 EVM] 보드 제작

[MSP430]/MSP430_FRAM | 2017.03.23 16:04
Posted by nexp

[MSP430FR2311 EVM] 보드 제작






FRAM 기반의 MSP430FR2311을 테스트 할수 있는 보드를 S-Type EVM 형태로 제작 했다.


주요 특징은 아래와 같다.

- 16-Bit RISC Architecture up to 16 MHz

- Active Mode: 126 µA/MHz


- 8-Channel 10-Bit Analog-to-Digital Converter (ADC)

  - Internal 1.5-V Reference

  - Sample-and-Hold 200 ksps


- 6-Bit Digital-to-Analog Converter (DAC) as Reference Voltage

- Smart Analog Combo (SAC-L1)

 -Supports General-Purpose OA

 -Rail-to-Rail Input and Output

 -Multiple Input Selections

 - Current-to-Voltage Conversion


- ±1% Accuracy With On-Chip Reference at Room Temperature

- On-Chip Very Low-Frequency 10-kHz Oscillator (VLO)

- On-Chip High-Frequency Modulation Oscillator (MODOSC)


아날로그 쪽으로 여러가지 기능들이 많이 보강되어 있는데 아무래도 FRAM을 잘 활용할 수 있는 센서 쪽으로 타겟을 하고 있는듯 하다.

특히나 Smart Analog Combo 모듈이 눈여겨 볼 만한것 같다.



아쉬운점이 있다면 기존 MSP430 시리즈(20핀 기준)와는 핀맵 구조가 완전히 달라져서 새롭게 PCB제작 해야 한다는것이다.

큰 회사들의 단점인가?

ST같은 회사는 같은 핀맵, 같은 개발환경을 유지 할수 있도록 하는데... 그런면에서는 아쉬움이 많다.



기능은 많이 추가 되어서 여러가지 용도로 사용하기에 좋은것 같다.







MSP430FR 확장 테스트 보드

표준 핀맵으로 제작해서 여러 다양한 확장 테스트 보드에 연결해서 테스트 가능하도록 했다.











MSP430FR2311 EVM PINMAP 회로도





MSP430FR - FRAM MCU 소형 타입 검토

FRAM 메모리를 가진 소형 저가격의 TSSOP타입의 MSP430FR2x 시리즈가 출시되었다.

기존의 MSP430FR5937 EVM 보드 제작 했을때 패키지 크기가 마음에 안들었는데.. 3x3mm QFN, TSSOP 16핀 타입으로 작고 저렴하게 나왔다.


FRAM MCU의 특징은 아래와 같다.

FRAM은 비휘발성으로 전원이 꺼졌을 때 콘텐츠를 유지된다. 

읽고 쓰는 속도가 상당히 빠르다. (MSP 마이크로컨트롤러에 내장된 FRAM은 최대 8MHz의 속도로 액세스(읽기 또는 쓰기)할 수 있다고 한다. MCU 플래시 쓰기 속도는 약 14KBps)

FRAM에 쓰고 FRAM에서 읽는 방식은 SRAM과 유사해서 쓰기 전 사전 삭제와 같은 설정이나 준비 또는 제어 레지스터의 잠금 해제가 필요 없다.

FRAM은 분할되어 있지 않으며 각 비트는 개별적으로 삭제, 쓰기, 주소 지정이 가능하다.

FRAM 세그먼트는 쓰기 전 삭제가 필요하지 않다. FRAM에 쓸 때는 전하 펌프가 필요하지 않기 때문에 FRAM 쓰기 액세스는 소비 전력이 낮다.


*참고로 FRAM은 SRAM보다 더 많은 전력을 소비하고 약간 더 빠르므로 가장 많이 액세스하는 데이터(예를들어 스텍메모리)는 SRAM를 사용하라고 한다





이런 특징들을 볼때 저전력의 백업시스템이 필요한 어플리캐에션에 적합할것 같다. 특히 데이터 로깅 시스템에 적용하면 좋을것 같다.




 MSP430FR5739 EVM - 2.8" TFT LCD 테스트

 

 

 

MSP430FR5739를 이용하여 좀더 큰 2.8" TFT LCD 제어를 테스트 해보았다.

SM-Type, M-Type에서 간단히 TFT LCD를 연결할 수 있는 [LCD_IF_P EVM] 을 이용하여 테스트 했다.

 

 

 

 

MSP430FR5739 TFT LCD제어 핀맵

 

 

 

 

 

MSP430FR5739 TFT LCD 제어 드라이버 코드

//-----------------------------------------------------------------------------
//TFT LCD
#define TFT_DRV_HD66791                 0
#define TFT_DRV_COM44                   1
#define TFT_DRV_ST7735                  0

#define LCD_LAT_BIT      BIT2
#define LCD_LAT_PORT     PJOUT
#define LCD_LAT_ON()     Sbi(LCD_LAT_PORT, LCD_LAT_BIT)
#define LCD_LAT_OFF()     Cbi(LCD_LAT_PORT, LCD_LAT_BIT)
#define LCD_DATA_LATCH()    LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT      BIT0
#define LCD_EN_PORT      PJOUT
#define LCD_ENABLE()     Cbi(LCD_EN_PORT, LCD_EN_BIT)
#define LCD_DISABLE()     Sbi(LCD_EN_PORT, LCD_EN_BIT)

#define LCD_RST_BIT      BIT2
#define LCD_RST_PORT     //PORT7
#define LCD_RST_ON()     //Sbi(LCD_RST_PORT, LCD_RST_BIT)
#define LCD_RST_OFF()     //Cbi(LCD_RST_PORT, LCD_RST_BIT)

#define LCD_RS_BIT      BIT1
#define LCD_RS_PORT      P4OUT
#define LCD_RS_OFF()     Cbi(LCD_RS_PORT, LCD_RS_BIT)
#define LCD_RS_ON()      Sbi(LCD_RS_PORT, LCD_RS_BIT)

#define LCD_WR_BIT      BIT0
#define LCD_WR_PORT      P4OUT
#define LCD_WR_OFF()     Cbi(LCD_WR_PORT, LCD_WR_BIT)
#define LCD_WR_ON()      Sbi(LCD_WR_PORT, LCD_WR_BIT)

#define LCD_RD_BIT      //BIT5
#define LCD_RD_PORT      //LATD
#define LCD_RD_OFF()     //Cbi(LCD_RD_PORT, LCD_RD_BIT)
#define LCD_RD_ON()      //Sbi(LCD_RD_PORT, LCD_RD_BIT)

#define LCD_BL_BIT      BIT1
#define LCD_BL_PORT      PJOUT
#define LCD_BL_OFF()     Cbi(LCD_BL_PORT, LCD_BL_BIT)
#define LCD_BL_ON()      Sbi(LCD_BL_PORT, LCD_BL_BIT)

 

#define _LCD_DAT_OUT(Data)    PORT1 = (Data>>8);\
                                     LCD_DATA_LATCH();\
                                     PORT1 = (Data&0xFF);

 

#define TFTGpioInit()     P1DIR=0xFF;\
                                        Sbi(P4DIR, BIT1|BIT0);\
                                        Sbi(PJDIR, BIT0|BIT1|BIT2|BIT3)   
//-----------------------------------------------------------------------------

 MSP430FR5739 EVM - 1.5" I1511 TFT LCD 테스트

 

 

MSP430FR5739 를 이용하여 1.5" TFT LCD 테스트를 했다.

확장 테스트 보드는 XMega32 EVM 보드를 이용하였다.

 

 

 

 

 

 I1511 TFT LCD  제어 드라이버 코드

SD CARD의 BMP파읽을 읽어 TFT LCD에 출력하는 예제이다.

 

//-----------------------------------------------------------------------------
//TFT LCD
#define TFT_DRV_HD66791                 0
#define TFT_DRV_COM44                   0
#define TFT_DRV_ST7735                  1

#define LCD_LAT_BIT      BIT0
#define LCD_LAT_PORT     PORT1
#define LCD_LAT_ON()     Sbi(LCD_LAT_PORT, LCD_LAT_BIT)
#define LCD_LAT_OFF()     Cbi(LCD_LAT_PORT, LCD_LAT_BIT)
#define LCD_DATA_LATCH()    LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT      BIT1
#define LCD_EN_PORT      PJOUT
#define LCD_ENABLE()     Cbi(LCD_EN_PORT, LCD_EN_BIT)
#define LCD_DISABLE()     Sbi(LCD_EN_PORT, LCD_EN_BIT)

#define LCD_RST_BIT      BIT2
#define LCD_RST_PORT     //PORT7
#define LCD_RST_ON()     //Sbi(LCD_RST_PORT, LCD_RST_BIT)
#define LCD_RST_OFF()     //Cbi(LCD_RST_PORT, LCD_RST_BIT)

#define LCD_RS_BIT      BIT2
#define LCD_RS_PORT      PJOUT
#define LCD_RS_OFF()     Cbi(LCD_RS_PORT, LCD_RS_BIT)
#define LCD_RS_ON()      Sbi(LCD_RS_PORT, LCD_RS_BIT)

#define LCD_WR_BIT      BIT3
#define LCD_WR_PORT      PJOUT
#define LCD_WR_OFF()     Cbi(LCD_WR_PORT, LCD_WR_BIT)
#define LCD_WR_ON()      Sbi(LCD_WR_PORT, LCD_WR_BIT)

#define LCD_RD_BIT      //BIT5
#define LCD_RD_PORT      //LATD
#define LCD_RD_OFF()     //Cbi(LCD_RD_PORT, LCD_RD_BIT)
#define LCD_RD_ON()      //Sbi(LCD_RD_PORT, LCD_RD_BIT)

#define LCD_BL_BIT      BIT0
#define LCD_BL_PORT      PJOUT
#define LCD_BL_OFF()     Cbi(LCD_BL_PORT, LCD_BL_BIT)
#define LCD_BL_ON()      Sbi(LCD_BL_PORT, LCD_BL_BIT)

 

#define _LCD_DAT_OUT(Data)    PORT1 = (Data>>8);\
                                     LCD_DATA_LATCH();\
                                     PORT1 = Data;

 

#define TFTGpioInit()     P1DIR=0xFF;\
                                        Sbi(P4DIR, BIT0|BIT1);\
                                        Sbi(PJDIR, BIT0|BIT1|BIT2|BIT3)   
//-----------------------------------------------------------------------------

MSP430FR5739 EVM - 6축 가속도 자이로 센서 테스트

 

 

 

MSP430FR5739는 FRAM기반의 저전력 MCU로 1조번의 기록에도 문제가 없다고 하니 데이터 기록이 빈번한 센서 데이터 로깅 시스템에 적용하면 좋다.

따라서 MSP430F5739를 이용하여 6축 가속도, 자이로 센서 데이터 로깅 시스템을 테스트 해 보았다.

 

 

테스트를 위해 [NET-EVM] 보드를 이용하였고 센서는 6축 SD746을 이용했다. 6축 자이로, 가속도 센서는 SPI방식으로 제어하고 CS는 A_8번 커넥터인 P3.7에 연결되어 있다.

 

 

 

 

MSP430FR5739 SD746제어 HAL 드라이버 코드

주의 사항은 SD746과 통신을 위해  SPI모드를 1으로 설정해야 정상 동작 한다.

 //-----------------------------------------------------------------------------
#define _SPI1_ENABLE    1

 

//USCIA1 for MSP430FR5739
#define _SPI1_PxSEL   P2SEL0
#define _SPI1_PxSEL1   P2SEL1
#define _SPI1_PxDIR   P2DIR
#define _SPI1_PxIN    P2IN

#define _SPI1_SIMO    BIT5
#define _SPI1_SOMI    BIT6
#define _SPI1_UCLK    BIT4

 

#define MY_SD746_SPI_MODE   1

#define ACCEL_CS_INIT()    Sbi(P3DIR, BIT7)
#define ACCEL_CS_ASSERT()   Cbi(P3OUT, BIT7)
#define ACCEL_CS_DEASSERT()   Sbi(P3OUT, BIT7)

#define MYSD746_SPI_INIT()   SPI1_Init();SPI1_SetMode(_SPI_MODE1)
#define ACCEL_Read     SPI1_WriteReadByte
#define ACCEL_Write     SPI1_WriteReadByte
//-----------------------------------------------------------------------------

 

 

 

MSP430FR5739 6축 가속도 자이로 센서 테스트 동영상

 

 

 

6축 가속도, 자이로 센서 데이터를 MSP430FR5739의 FRAM영역에 저장하고 확인을 위해 시리얼 포트로 전송하여 그래프로 표시 했다. 

블로그 이미지

nexp

카테고리

분류 전체보기 (1560)
[MyProject] (48)
[TI] (75)
[NXP] (51)
[ST_MICRO] (129)
[FreeScale] (31)
[MSP430] (140)
[Microchip] (131)
Cortex-M (36)
[ATMEL] (29)
[AnalogDevice] (22)
[Embedded] (2)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (50)
[INTERFACE] (213)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (129)
[SENSOR] (41)
[DATA] (21)
[FPGA] (32)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)