[STM32F373 EVM] I2C 테스트 - 9축 IMU 센서 테스트




[STM32F373 EVM]에는 I2C가 PB8(SCL), PB9(SDA)에 할당되어 있다. I2C테스트를 위해 9축 IMU센서(BNO055 EVM)의 롤,피치 값을 TFT LCD에 표시하는 예제를 작성해 보았다.


PB8 -> SPI2_SCK/I2S2_CK,I2C1_SCL, USART3_TX,CAN_RX, CEC, TIM16_CH1,TIM4_CH3, TIM19_CH3,COMP1_OUT, TSC_SYNC

PB9 -> SPI2_NSS/I2S2_WS,I2C1_SDA, USART3_RX,CAN_TX, IR_OUT,TIM17_CH1, TIM4_CH4,TIM19_CH4, COMP2_OUT



STM32F373 EVM 회로도 핀맵



STM32F373의 I2C 블록도






STM32F373 I2C 초기화 함수

#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_9

#define I2Cx_SDA_GPIO_PORT              GPIOB

#define I2Cx_SDA_AF                     GPIO_AF4_I2C1



void BNO055_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_FREQ_HIGH;

  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.Timing      = 400000;

  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;

  I2cHandle.Init.OwnAddress2     = 0xFE;    

  

  

  HAL_I2C_Init(&I2cHandle);  

}




STM32F373 I2C 송수신 함수

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

{

    unsigned char tx_buf[2];

    unsigned char rx_buf[4];

    tx_buf[0] = data;

   

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

    {


    }

    

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

    {

    }

  

    result = rx_buf[0];

}


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

{

    unsigned char tx_buf[2];


    tx_buf[0] = reg;

    tx_buf[1] = data;


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

    {

    }

}




STM32F373 I2C 테스트 동영상

I2C인터페이스로 BNO055 센서의 롤,피치 값을 TFT LCD에 표시하는 테스트 


저작자 표시 비영리 변경 금지
신고

[STM32F373 EVM] SDADC 16bit ADC 성능 측정


16비트 ADC테스트 중 성능 확인을 위해서 데이터 분석을 해 보았다.



결론적으로는 +-)10정도 흔들린다. 정밀레퍼런스를 사용하지 않고 내부 레퍼런스만으로도 이정도면 상당히 좋은것 같다.

비슷한 등급의 FreeScale사의 K20 16bit ADC 성능 테스트와 비교해 보면 10배 정도는 노이즈가 줄어드는것 같다.



저작자 표시 비영리 변경 금지
신고

[STM32F373 EVM] SDADC 16bit ADC 테스트




STM32F3시리즈를 보면서 가장 눈길이 가는것은 16bit ADC (SDADC) 이다.  저가이면서 16bit ADC가 포함된 MCU로 사용하기에 좋을것 같다.



SDADC 특징

- Precise 16-bit sigma-delta ADCs (21 channels)

- 1.2/1.8V reference

- 16.6 ksps (multiple channels and up to 50 ksps)

- The data can be automatically stored in a system RAM buffer, reducing the software overhead. 

- Self-calibration (offset)

- 7 gain settings from 0.5x to 32x (analog gains: 0.5 - 8, digital gains: 16 - 32)




STM32F373 SDADC 블록도
STM32F372CBT6 은 48핀 패키지이고 SDADC1 만 사용가능하다.
따라서 PB0, PB1, PE8, PE9, PB2 만 사용 가능하다. 차동 입력은 2채널 가능하다.

PB0 -> ADC_IN8, SDADC1_AIN6P
PB1 -> ADC_IN9, SDADC1_AIN5P, SDADC1_AIN6M

PB2 -> SDADC1_AIN4P,SDADC2_AIN6P

PE8 -> SDADC1_AIN8P, SDADC2_AIN8P
PE9 -> SDADC1_AIN7P,SDADC1_AIN8M,SDADC2_AIN7P,SDADC2_AIN8M


PB14 -> SDADC3_AIN8P
PB15 -> SDADC3_AIN7P, SDADC3_AIN8M, RTC_REFCLKIN

PD8 SDADC3_AIN6P




그리고 16비트 ADC를 이용한 테스트 예제로 압력센서 MPX2102A와 온도센서 PT100 예제를 제공하니 테스트 해보면 좋을것 같다.



STM32F373의 ADC는 12bit, 16bit ADC가 모두 외부 레퍼런스 입력이 가능하다.
내부 레퍼런스는 1.2V, 1.8V 설정이 가능한데... 정밀도에대한 언급은 없는것 같다.
(1.2V애대한 언급만 있다. 1.16V< 1.21V< 1.26V, 100 ppm/°C)





STM32F372  SDADC ADC16 테스트 동영상


PB0 -> ADC_IN8, SDADC1_AIN6P 포트에 가변 저항을 연결하여 16bit ADC값을 TFT LCD 화면에 출력하고 그래프로 표시하는 테스트 예제를 진행했다

좀더 정밀한 분석이 필요하겠지만 대략적으로 봐도 값이 아주 안정적으로 들어온다.






STM32F372  SDADC 초기화 코드


void Adc16_Init(void)

{

  SDADC_ConfParamTypeDef confParam;

    

  hsdadc.Instance = SDADC1;

  hsdadc.Init.ReferenceVoltage = SDADC_VREF_VREFINT2;

  hsdadc.Init.IdleLowPowerMode = SDADC_LOWPOWER_NONE;

  hsdadc.Init.FastConversionMode = SDADC_FAST_CONV_DISABLE;

  hsdadc.Init.SlowClockMode = SDADC_SLOW_CLOCK_DISABLE; 

  

  if (HAL_SDADC_Init(&hsdadc) != HAL_OK)

  {

  

  }


  confParam.CommonMode = SDADC_COMMON_MODE_VSSA;

  confParam.Gain = SDADC_GAIN_1;

  confParam.InputMode = SDADC_INPUT_MODE_SE_ZERO_REFERENCE;

  confParam.Offset = 0x00000000;  

  

  if (HAL_SDADC_PrepareChannelConfig(&hsdadc, SDADC_CONF_INDEX_0, &confParam) != HAL_OK)

  {

    /* An error occurs during the preparation of the channel's configuration */

  }


  /* associate POT_SDADC_CHANNEL to the configuration 0 */

  if (HAL_SDADC_AssociateChannelConfig(&hsdadc, POT_SDADC_CHANNEL, SDADC_CONF_INDEX_0) != HAL_OK)

  {

    /* An error occurs during the association of the channel to the prepared configuration */

  }


  /* select POT_SDADC_CHANNEL for injected conversion and continuous mode */

  if (HAL_SDADC_InjectedConfigChannel(&hsdadc, POT_SDADC_CHANNEL, SDADC_CONTINUOUS_CONV_ON) != HAL_OK)

  {

    /* An error occurs during the selection of the channel for the injected conversion */

  }


  /* Select external trigger for injected conversion */

  if (HAL_SDADC_SelectInjectedTrigger(&hsdadc, SDADC_SOFTWARE_TRIGGER) != HAL_OK)

  {

    /* An error occurs during the selection of the trigger */

  }


  /* Start Calibration in polling mode */

  if (HAL_SDADC_CalibrationStart(&hsdadc, SDADC_CALIBRATION_SEQ_1) != HAL_OK)

  {

    /* An error occurs during the starting phase of the calibration */

  }


  /* Pool for the end of calibration */

  if (HAL_SDADC_PollForCalibEvent(&hsdadc, HAL_MAX_DELAY) != HAL_OK)

  {

    /* An error occurs while waiting for the end of the calibration */

  }


  /* Start injected conversion in interrupt mode */

  if (HAL_SDADC_InjectedStart_IT(&hsdadc) != HAL_OK)

  {

    /* An error occurs during the configuration of the injected conversion in interrupt mode */

  }  

}





STM32F372  SDADC 인터럽트 핸들러


void HAL_SDADC_InjectedConvCpltCallback(SDADC_HandleTypeDef *hsdadc)

{

  /* Get conversion value */

  gAdcData = HAL_SDADC_InjectedGetValue(hsdadc, (uint32_t *) &InjChannel);

}



void SDADC1_IRQHandler(void)

{

  HAL_SDADC_IRQHandler(&hsdadc);

}















저작자 표시 비영리 변경 금지
신고

[STM32F373 EVM] 12bit ADC 테스트

[ST_MICRO]/STM32F3 | 2016.12.11 22:19
Posted by nexp

[STM32F372 EVM] 12bit ADC 테스트




STM32F3 시리즈의 가장 강점은 저렴지만 강력한 ADC성능이다.


16비트 ADC도 추가되었고, ADC 속도도 향상되고 3채널 동시 획득이 가능하다고 한다. 


 - Ultra-fast 12-bit ADCs with 5 MSPS per channel (up to 18 MSPS in Interleaved mode)



16bit ADC테스트를 먼저 해 보고 싶지만 우선 기존 코드로 테스트 해 볼 수 있는 12bit ADC를 테스트 해보자


하지만 기존 코드와 많이 변경된것 같다.




STM32F373 ADC 초기화 코드


ADC_HandleTypeDef    AdcHandle;

  

void AdcInit(void)

{

__HAL_RCC_ADC1_CONFIG(RCC_ADC1PCLK2_DIV6);


AdcHandle.Instance          = ADCx;


AdcHandle.Init.ScanConvMode          = DISABLE;

AdcHandle.Init.ContinuousConvMode    = DISABLE;

AdcHandle.Init.DiscontinuousConvMode = DISABLE;

AdcHandle.Init.NbrOfDiscConversion   = 0;

AdcHandle.Init.ExternalTrigConv      = ADC_SOFTWARE_START;

AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;

AdcHandle.Init.NbrOfConversion       = 1;



GPIO_InitTypeDef          GPIO_InitStruct;


ADCx_CLK_ENABLE();

ADCx_CHANNEL_GPIO_CLK_ENABLE();


GPIO_InitStruct.Pin = ADCx_CHANNEL_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(ADCx_CHANNEL_GPIO_PORT, &GPIO_InitStruct);

}




STM32F373 ADC 획득 소스코드


unsigned int GetAdc(unsigned int Ch)

{

unsigned int val = 0;

ADC_ChannelConfTypeDef sConfig;


sConfig.Channel      = Ch;

sConfig.Rank         = 1;

sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;


HAL_ADC_ConfigChannel(&AdcHandle, &sConfig)


//Start the conversion process

HAL_ADC_Start(&AdcHandle)


HAL_ADC_PollForConversion(&AdcHandle, 10);


//ADC conversion completed

val = HAL_ADC_GetValue(&AdcHandle);


return val;

}






저작자 표시 비영리 변경 금지
신고

[STM32F373 EVM] UART Test

[ST_MICRO]/STM32F3 | 2016.12.11 22:19
Posted by nexp


[STM32F373 EVM] UART Test




STM32F3시리즈의 소스코드 코드는 기존의 STM32F1, F2, F4 시리즈와 100% 호환이 안되는것 같다.

STM32F1, F2, F4에서는 거의 동일한 코드로 잘 동작 했는데 컴파일이 안된다.


레지스터 명이 약간 변경된것 같다. 


아래와 같이 수정해 주니 잘 동작한다. (왜 이렇게 자주 바뀌지...?)


unsigned char U0_GetByte(void)

{

  //while ((USART1->SR & USART_FLAG_RXNE) == RESET);

//return USART1->DR; 

    

    while ((USART1->ISR & USART_FLAG_RXNE) == RESET);

    return USART1->RDR;

}


void U0_PutByte(unsigned char Data)

{

//while((USART1->SR & USART_FLAG_TXE) == RESET);

//USART1->DR = Data;


    while((USART1->ISR & USART_FLAG_TXE) == RESET);

    USART1->TDR = Data;

}




[STM32F373 EVM] UART Test 예제 소스코드

int main(void)

{

    int cnt = 0;

    _SystemInit();


    SystemClock_Config();


    Led1Init();


    U0_Init(BAUD_115200);

    DebugPrint("STM32F373 EVM UART Test\r\n");

    

    while (1)

    {

        Led1Toggle();

        DebugPrint("cnt =%d\r\n", cnt++);

        Delay(100);

    }

}





저작자 표시 비영리 변경 금지
신고

블로그 이미지

nexp

카테고리

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

티스토리 툴바