[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를 사용하라고 한다





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




[STM32F439 EVM] 외부인터럽트 테스트


STM32F439 의 외부 인터럽트 소스는 각 포트0에서 15까지로 설정 가능하고 아래와 같이 그룹별로 관리 가능하다.

0에서 4번까지는 각각의 인터럽트 소스를 할당 할 수 있고 5~9, 10~15는 그룹으로되어 있어서 인터럽트 핸들러 내에서 구분해서 사용해야 한다.


EXTI0_IRQn

EXTI1_IRQn

EXTI2_IRQn

EXTI3_IRQn

EXTI4_IRQn

EXTI9_5_IRQn

EXTI15_10_IRQn



STM32F439 EVM 보드의 스위치 회로는 아래과 같고 PA8에 연결되어 있는 스위치를 이용하여 인터럽트 테스트 예제를 작성해 보았다.





STM32F439 외부 인터럽트 초기화 코드

static void EXTILine9_5_Config(void)

{

  GPIO_InitTypeDef   GPIO_InitStructure;


  /* Enable GPIOA clock */

  __GPIOA_CLK_ENABLE();

  

  /* Configure PA0 pin as input floating */

  GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;

  GPIO_InitStructure.Pull = GPIO_PULLUP;

  GPIO_InitStructure.Pin = GPIO_PIN_8;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);


  /* Enable and set EXTI Line0 Interrupt to the lowest priority */

  HAL_NVIC_SetPriority(EXTI9_5_IRQn, 2, 0);

  HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);

}





STM32F439 외부 인터럽트 핸들러 함수

인터럽트 핸들러 함수 EXTI9_5_IRQHandler 내에서 HAL_GPIO_EXTI_Callback함수를 호출하는 구조로 되어 있다.


void EXTI9_5_IRQHandler(void)

{

  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);

}


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

  if(GPIO_Pin == GPIO_PIN_8)

  {

        Led1Toggle();

  }

}


USB 3.1 Type C 보드 제작기

[INTERFACE]/USB | 2017.01.21 01:15
Posted by nexp

USB 3.1 Type C 보드 제작기





기존 USB 3.0 (micro-b 커넥터 )보드를 USB Type-C 커넥터로 변경해야 하는 일이 생겨서 보드 작업에 들어갔다.

단순히 커넥터만 바꾸기만 하면 될것으로 예상하고 시작 했는데... 관련문서를 보다 보니 만만치 않다.


우여곡절 끝에 성공은 시켰지만 처음 접하는 기술을 적용기에는 항상 고통이 따르는것 같다.



의뢰업체는 항상 급하게 빨리 만들어라고 한다. 

USB Type-C 핀맵을 보면 복잡하다. 도대체 커넥터에 어떻게 연결하라는 것이지?




커넥터 삽입 방향에 상관없도록 하기 위해 물리적으로 2중으로 구성되어 있다. 이것때문에 비용이 상승할 수 밖에 없는데.... 왜 그랬을까?







그럼 보드쪽에서는 어떻게 설계를 해야 할까?


USB Type-C 데이터 시트에 보면 두가지 연결 방법이 있다. 다양한 기능을 지원하기 위해 여러 방식이 지원 하는데 개발자 입장에서는 비용과 복잡함이 따를수 밖에 없는것 같다.



간단하고 저렴한 구성을 위해서 다이렉트 방식을 사용하기로 했다.






USB Type-C 설계에서 주의 해야 하는 사항중에 CC(Configurable Channel) 핀 설정이 있는데 이부분이 헷갈리고 중요하다.











[STM32F439 EVM] I2C 테스트

[ST_MICRO]/STM32F43x | 2016.12.31 12:51
Posted by nexp

[STM32F439 EVM] I2C 테스트




[STM32F439 EVM] 에는 PB8(SCL), PB9(SDA)에 I2C가 할당되어 있다.




STM32F439 I2C 초기화 코드

I2C_HandleTypeDef I2cHandle;


#define I2Cx                             I2C1

#define I2Cx_CLK_ENABLE()                __I2C1_CLK_ENABLE()

#define I2Cx_SDA_GPIO_CLK_ENABLE()       __GPIOB_CLK_ENABLE()

#define I2Cx_SCL_GPIO_CLK_ENABLE()       __GPIOB_CLK_ENABLE() 


#define I2Cx_FORCE_RESET()               __I2C1_FORCE_RESET()

#define I2Cx_RELEASE_RESET()             __I2C1_RELEASE_RESET()


/* Definition for I2Cx Pins */

#define I2Cx_SCL_PIN                    GPIO_PIN_8

#define I2Cx_SCL_GPIO_PORT              GPIOB

#define I2Cx_SCL_AF                     GPIO_AF4_I2C1

#define I2Cx_SDA_PIN                    GPIO_PIN_7

#define I2Cx_SDA_GPIO_PORT              GPIOB

#define I2Cx_SDA_AF                     GPIO_AF4_I2C1


void I2CMaster_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStruct;

  

  /*##-1- Enable peripherals and GPIO Clocks #################################*/

  /* Enable GPIO TX/RX clock */

  I2Cx_SCL_GPIO_CLK_ENABLE();

  I2Cx_SDA_GPIO_CLK_ENABLE();

  /* Enable I2C1 clock */

  I2Cx_CLK_ENABLE(); 

  

  /*##-2- Configure peripheral GPIO ##########################################*/  

  /* I2C TX GPIO pin configuration  */

  GPIO_InitStruct.Pin       = I2Cx_SCL_PIN;

  GPIO_InitStruct.Mode      = GPIO_MODE_AF_OD;

  GPIO_InitStruct.Pull      = GPIO_PULLUP;

  GPIO_InitStruct.Speed     = GPIO_SPEED_FAST;

  GPIO_InitStruct.Alternate = I2Cx_SCL_AF;

  

  HAL_GPIO_Init(I2Cx_SCL_GPIO_PORT, &GPIO_InitStruct);

    

  /* I2C RX GPIO pin configuration  */

  GPIO_InitStruct.Pin = I2Cx_SDA_PIN;

  GPIO_InitStruct.Alternate = I2Cx_SDA_AF;

    

  HAL_GPIO_Init(I2Cx_SDA_GPIO_PORT, &GPIO_InitStruct);

  

  

  I2cHandle.Instance             = I2Cx;

  

  I2cHandle.Init.AddressingMode  = I2C_ADDRESSINGMODE_7BIT;

  I2cHandle.Init.ClockSpeed      = 100000;

  I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;

  I2cHandle.Init.DutyCycle       = I2C_DUTYCYCLE_2;

  I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_ENABLED;

  I2cHandle.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLED;

  I2cHandle.Init.OwnAddress1     = 0xFE;//I2C_ADDRESS<<1;

  I2cHandle.Init.OwnAddress2     = 0xFE;    

  

  

  HAL_I2C_Init(&I2cHandle);

}




STM32F439 I2C Read/Write 함수

HAL_I2C_Master_Transmit(),  HAL_I2C_Master_Receive() 함수를 사용하면 쉽게 I2C제어가 가능하다.

unsigned char read8(unsigned char addr, unsigned char data)

{

    unsigned char result;


    unsigned char tx_buf[2];

    unsigned char rx_buf[4];

    tx_buf[0] = data;

    

    

    //gTimerTick6 = 0;

    while(HAL_I2C_Master_Transmit(&I2cHandle, (uint16_t)addr, (uint8_t*)tx_buf, 1, 10000)!= HAL_OK)

    {

        //if(gTimerTick6>200)break;

    }

    

    //gTimerTick6 = 0;


    while(HAL_I2C_Master_Receive(&I2cHandle, (uint16_t)addr, (uint8_t *)rx_buf, 1, 10000) != HAL_OK)

    {

//if(gTimerTick6>200)break;

    }

  


    result = rx_buf[0];



    return result;


}


void write8(unsigned char addr, unsigned char reg, unsigned char data)

{

    unsigned char result;


    unsigned char tx_buf[2];

    unsigned char rx_buf[4];

    tx_buf[0] = reg;

tx_buf[1] = data;

    

    

    //gTimerTick6 = 0;

    while(HAL_I2C_Master_Transmit(&I2cHandle, (uint16_t)addr, (uint8_t*)tx_buf, 2, 10000)!= HAL_OK)

    {

        //if(gTimerTick6>200)break;

    }

}


블로그 이미지

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)