[ST_MICRO]/STM32F0x2015. 4. 29. 16:21

STM32F030 I2C, UART 디자인시 주의 사항

STM32F030  I2C, UART 디자인시 주의 사항


STM32F030, STM32F050 시리즈에서 TSSOP타입의 소형 페키지는 기존 STM32F1 시리즈와 비교 했을때 약간의 핀맵 차이가 있다.


대부분의 핀은 거의 유사한데 I2C의 경우 UART와 공유하기 때문에 I2C와 UART를 동시에 사용해야 한다면 UART 핀을 리맵해서 사용해야 하므로 주의가 필요하다.


PA9

USART1_TX,TIM1_CH2,TIM15_BKIN,I2C1_SCL



PA10

USART1_RX,TIM1_CH3,TIM17_BKIN,I2C1_SDA




PA13

SWCLK, IR_OUT



PA14

USART1_TX, USART2_TX, SWCLK



PA15

SPI1_NSS, USART1_RX, USART2_RX, EVENTOUT





STM32F103, STM32F030, STM32F050 UART 차이점

STM32F103의 경우 PA2, PA3이 UART2로 할당되어 있지만 STM32F030C6은 하나의 채널만 있으므로 주의를 요한다. 다만 STM32F0x는 UART1에 리맵해서 사용 할 수 있다.

STM32F030C8의 경우 UART가 2채널이기 때문에 UART2를 사용할 수 있다.


PA2 USART1_TX / USART2_TX / TIM15_CH1 / ADC_IN2

PA3 USART1_RX / USART2_RX / TIM15_CH2 / ADC_IN3



STM32F050의 경우 UART가 한채널만 제공된다.

PA2  TIM2_CH3 / USART1_TX / ADC_IN2

PA3  TIM2_CH4 / USART1_RX / ADC_IN3

Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F43x2015. 3. 7. 17:00

STM32F439 Ehternet 테스트

STM32F439 Ehternet 테스트


STM32 시리즈에는 Ethernet 을 위한 MAC 제어기가 포함되어 있고 외부에 Ethernet PHY만 연결하면 간단히 Ethernet 을 위한 제어가 가능하다.

STM32F439 EVM 보드에는 기본적으로 핀수가 줄어드는 RMII방식의 PHY가 포함되어 있고 경우에 따라서 기존에 제작해 둔 MII, RMII 모듈을 연결할 수 있는 커넥터가 있어 다양한 방법으로 이더넷 테스를 할 수 있다.

(참고로 STM32F439 EVM 보드에 내장되어 있는 PHY는  "Low deterministic latency supports IEEE1588" 를 지원하는 TI의 TLK106를 사용하였다.)





Ethernet Phy 연결하는방식에 따라 MII, RMII Mode로 가능하며 MII 방식은 25Mhz 클럭로 100T 전송이 가능하다.





RMII Mode에서는 데이터 라인이 절반으로 줄어들어서 9핀으로 가능하지만 클럭을 50Mhz를 공급해야 한다.

비용적인 측면을 고려 한다면 MII방식이 좀더 유리 한데 STM32F4의 내부 클럭에서 25Mhz공급하능하기 때문이다.

하지만 핀수를 줄여서 간단히 하고 싶다면 RMII 방식이 좋을것 같다.

테스트 용이라 RMII 방식으로 보드를 제작 했다.






STM32F429 Ethernet 초기화 코드


void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)

  GPIO_InitTypeDef GPIO_InitStructure;

  

  /* Enable GPIOs clocks */

  __GPIOA_CLK_ENABLE();

  __GPIOB_CLK_ENABLE();

  __GPIOC_CLK_ENABLE();


  //Ethernet pins configuration

  /*

        ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1

        ETH_MDIO -------------------------> PA2

        ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7


        ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PB11

        ETH_MII_TXD0/ETH_RMII_TXD0 -------> PB12

        ETH_MII_TXD1/ETH_RMII_TXD1 -------> PB13


        ETH_MDC --------------------------> PC1        

        ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4

        ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5

                                                  */


  /* Configure PA1, PA2 , PA7 */

  GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;

  GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;

  GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStructure.Pull = GPIO_NOPULL ; 

  GPIO_InitStructure.Alternate = GPIO_AF11_ETH;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);


  /* Configure PB5 and PB8 */

  GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_12| GPIO_PIN_13;

  HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);


  /* Configure PC1, PC2, PC3, PC4 and PC5 */

  GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;

  HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);

                             

  /* Enable ETHERNET clock  */

  __ETH_CLK_ENABLE();

  

  if (heth->Init.MediaInterface == ETH_MEDIA_INTERFACE_MII)

  {

    /* Output HSE clock (25MHz) on MCO pin (PA8) to clock the PHY */

    HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);

  }

}




Ehternet 을위한 프로토콜 스텍은 ST에서 제공하는 LwIP Third Party Lib 예제를 이용하였다.


Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42012. 9. 10. 00:23

[STM32F4] I2C 테스트 - 3축 가속도 센서 TFT LCD 출력

[STM32F4] I2C 테스트 - 3축 가속도 센서 TFT LCD 출력

 

 

3축 가속도 센서를 테스트 해야할 일이 있어 STM32F407 보드를 이용하여 I2C 테스트를 해보았다. 기존 STM32F103 I2C 테스트 코드과 크게 차이 없이 테스트 가능했다.

 

[EXP-NET EVM] 보드에는 I2C(SPI)로 연결되는 자이로, 가속도, 온도, 압력 센서등의 모듈을 연결할 수 있는 표준핀맵 커넥터가 있다.

 

 

 

 

SM-Type EVM 에는 핀 8번에, M-Type EVM에는 핀 13번에 각각 CS핀이 할당되어 있다.

 

 

 

STM32F4 I2C테스트 동영상

STM32F407 을 이요하여 3가속도 센서의 데이터를 TFT-LCD에 그래프로 표시하는 테스트 예제




STM32F4 I2C 초기화 코드

void i2c_init1(unsigned int Speed)
{
 I2C_InitTypeDef  I2C_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);     
    //Configure I2C2 pins: SCL and SDA
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6| GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;    
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //Connect pins to I2C peripheral
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);  
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);

    //I2C2 and I2C2 Periph clock enable
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

    I2C_DeInit(I2C1);    
 
    //I2C2 configuration
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_OwnAddress1 = 0x33;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = Speed;
    I2C_Cmd(I2C1, ENABLE);
    I2C_Init(I2C1, &I2C_InitStructure);
}

 

 

STM32F4 가속도 센서 I2C 제어 코드 

//-----------------------------------------------------------------------------

// myAccel3LV02 HAL

#define MY_ACCEL3LV02_SPI_MODE 0

#define MY_ACCEL3LV02_I2C_MODE 1


//#define ACCEL_CS_BIT BIT6

//#define ACCEL_CS_PORT PORTB


#define ACCEL_CS_BIT BIT11

#define ACCEL_CS_PORT PORTE


#define ACCEL_CS_INIT() RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);\

GPIO_InitStructure.GPIO_Pin=ACCEL_CS_BIT;\

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;\

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;\

GPIO_Init(GPIOC, &GPIO_InitStructure);\

ACCEL_CS_DEASSERT()

#define ACCEL_CS_ASSERT() Cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)

#define ACCEL_CS_DEASSERT() Sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)


#define ACCEL_SPI_INIT() SPI0_Init()

#define ACCEL_Read SPI0_WriteReadByte

#define ACCEL_Write SPI0_WriteReadByte



#define myAccelI2C_INIT                 i2c2_init

#define myAccelI2C_START                i2c2_start

#define myAccelI2C_WRITE                i2c2_write

#define myAccelI2C_READ_NAK             i2c2_readNak

#define myAccelI2C_STOP                 i2c2_stop



//-----------------------------------------------------------------------------
//myAccel3LV02의 특정 레지스터에서 데이터를 읽어옴
unsigned char myAccel3lvRead(unsigned char reg)

 unsigned char data = 0; 
 
 myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_WRITE);     // device address 및 write mode 설정
 myAccelI2C_WRITE(reg);

    // 레지스터 설정
 myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_READ);       // device address 및 read mode 설정
   
 data = myAccelI2C_READ_NAK(); 
 myAccelI2C_STOP(); 


 return data;
}

 

//myAccel3LV02의 특정 레지스터에 데이터를 기록
void myAccel3lvWrite(unsigned char reg, unsigned char data)
{
 myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_WRITE);     // device address 및 write mode 설정
 myAccelI2C_WRITE(reg);         // 레지스터 설정
 myAccelI2C_WRITE(data);        // 데이터 출력
 myAccelI2C_STOP();  
}

 

Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42011. 12. 5. 21:30

[STM32F4 ] PLL 설정

[STM32F4 ] PLL 설정

STM32F4 의 최대 동작 속도는 168Mhz이다.  SystemInit() 함수를 이용하여 PLL을 설정 가능하고 startup_stm32f4xx.s 에서 초기화시 실행된다.

외부 입력 클럭은 8Mhz로 설정했다.

#if !defined  (HSE_VALUE) 
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */    
#endif /* HSE_VALUE */


/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      8


void SystemInit(void)
{
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif

  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Disable all interrupts */
  RCC->CIR = 0x00000000;

#ifdef DATA_IN_ExtSRAM
  SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */
        
  /* Configure the System clock source, PLL Multiplier and Divider factors,
     AHB/APBx prescalers and Flash settings ----------------------------------*/
  SetSysClock();

  /* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}



PA8에 PCU클럭을 출력해서 확인 할 수 있는데. 아래와 같이 설정해 주면 된다.
  /* Output HSE clock on MCO1 pin(PA8) ****************************************/
  /* Enable the GPIOA peripheral */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
 
  /* Configure MCO1 pin(PA8) in alternate function */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
  /* HSE clock selected to output on MCO1 pin(PA8)*/
  RCC_MCO1Config(RCC_MCO1Source_PLLCLK, RCC_MCO1Div_1);




STM32F4 RCC블록도





Posted by nexp

댓글을 달아 주세요

  1. fkkmemi

    관리자의 승인을 기다리고 있는 댓글입니다

    2012.03.16 15:48 [ ADDR : EDIT/ DEL : REPLY ]

[ST_MICRO]/STM32F42011. 12. 5. 20:30

[STM32F4] GPIO 테스트

[STM32F4] GPIO 테스트
STM32F103과 하드웨어 적으로 크게 변경된 것이 없지만 소프트웨어 적으로 약간의 변경이 있는것 같다.
대부분의 코드는 호환 되지만 기능이 약간 추가되고 레지스터명이 조금 변경 된것 같다.






STM32F4 에서는 GPIO 제어 레지스터가 변경되어 약간 수정 해 주었다.

//#define sbi(Port, Bit)     Port->BSRR = Bit
//#define cbi(Port, Bit)     Port->BRR = Bit


#define sbi(Port, Bit)    Port->BSRRH = Bit
#define cbi(Port, Bit)    Port->BSRRL = Bit



STM32F4 GPIO 설정 HAL 드라이버 코드
//-----------------------------------------------------------------------------
//LED Driver
#define LED1_BIT      BIT11
#define LED1_PORT      GPIOG
#define Led1Init()      
#define Led1Off()      sbi(LED1_PORT, LED1_BIT)
#define Led1On()      cbi(LED1_PORT, LED1_BIT)
#define Led1Toggle()     Tbi(PORTG, LED1_BIT)

#define Led1Init()       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);\
          GPIO_InitStructure.GPIO_Pin = LED1_BIT;\
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;\
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\
          GPIO_Init(GPIOG, &GPIO_InitStructure); 


#define LED2_BIT      BIT0
#define LED2_PORT      GPIOA
#define Led2Init()      
#define Led2Off()      sbi(LED2_PORT, LED2_BIT)
#define Led2On()      cbi(LED2_PORT, LED2_BIT)
#define Led2Toggle()     Tbi(PORTA, LED1_BIT)

#define Led2Init()       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);\
          GPIO_InitStructure.GPIO_Pin = LED2_BIT;\
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;\
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\
          GPIO_Init(GPIOA, &GPIO_InitStructure); 
  
//-----------------------------------------------------------------------------



STM32F4 GPIO 테스트 예제 코드
#include "system.h"

int main(void)
{
    Led1Init();
    Led2Init()
   
    while (1)
    {
        Led1Toggle();
        Led2Toggle();
        Delay(500);
    }
}

Posted by nexp

댓글을 달아 주세요