'STM32'에 해당되는 글 50건

  1. 2008.02.15 [STM32]GPIO
  2. 2008.02.15 [STM32] CLOCK
  3. 2008.02.13 [STM32-48 EVM]보드 제작
  4. 2008.02.13 STM32소개자료
  5. 2008.01.24 STM32 예제 소스코드 모음
[ST_MICRO]/STM322008. 2. 15. 19:09

[STM32]GPIO

[STM32]GPIO



특징

  • 80 Standard I/Os (5V tolerant, 20 mA drive)
  • 18 MHz Toggling
  • Configurable Output Speed up to 50 MHz
  • Up to 16 Analog Inputs
  • Alternate Functions pins (like USARTx, TIMx, I2Cx, SPIx, CAN, USB…)
  • All I/Os can be set-up as external interrupt (up to 16 lines at time)
  • One I/O can be used as Wake-Up from STANDBY (PA.00)
  • One I/O can be set-up as Tamper Pin (PC.13)
  • All Standard I/Os are shared in 5 ports (GPIOA..GPIOE)
  • Atomic Bit Set and Bit Reset using BSRR and BRR registers
  • Locking mechanism to avoid spurious write in the IO registers

GPIO관련 registers
CRL
 - Port Control Register low
CRH - Port Control Register High
IDR - Input Data Register
ODR Output Data Register
BSRR Bit Set Reset Register
BRR Bit Reset Register
LCKR Lock Register
EVCR Event Control Register
MAPR Remap Debug and AF Register
EXTICR EXTI Line 0 to Line 15 Configuration Register


GPIO Configuration
고속을 요하지 않는 포트 설정은 간단히 GPIO_DeInit()함수에 원하는 설정값 구조체를 입력하면 되므로 쉽게 설정가능한다.


GPIO클럭 APB2를 eable하고 원하는 포트와 클럭속도, 입출력 모드를 설정하면 GPIO Configuration이 된다.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(LED1_PORT, &GPIO_InitStructure)


void GPIO_DeInit(GPIO_TypeDef* GPIOx)

{

  switch (*(u32*)&GPIOx)

  {

    case GPIOA_BASE:

      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);

      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);

      break;

    case GPIOB_BASE:

      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);

      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);

      break;

    case GPIOC_BASE:

      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);

      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE);

      break;

    case GPIOD_BASE:

      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE);

      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE);

      break;

     

    case GPIOE_BASE:

      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE);

      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE);

      break;           

    default:

      break;

  }

}


포트출력
IO포트가 출력으로 설정되면 Output Buffer가 사용가능해 진다.
따라서 포트를 0 또는 1로 출력하기 위해 BSRR(Bit Set Reset Register), BRR(Bit Reset Register) 레지스터에 값을 출력하면 된다.

//GPIO핀을 high로 출력
GPIOx->BSRR = GPIO_Pin

//GPIO핀을 low로 출력
GPIOx->BRR = GPIO_Pin

기존 코드와 호환성도 있고 해서 sbi, cbi로 정의 했다.
#define sbi(Port, Bit)     Port->BSRR = Bit
#define cbi(Port, Bit)     Port->BRR = Bit




ODR(Output Data Register)는 쓰고 읽을 수  있으므로 비트토글에 있어 유용하게 사용할 수 있다.
GPIOx->ODR ^= GPIO_Pin

보드상의 LED를 제어하기 위해 아래와 같이 설정하였다.
#define LED1_BIT         GPIO_Pin_8
#define LED1_PORT      GPIOB

#define Led1Off()         LED1_PORT->BRR |= LED1_BIT
#define Led1On()         LED1_PORT-> |= LED1_BIT
#define Led1Toggle()   LED1_PORT->ODR ^= LED1_BIT







JATG핀을 GPIO로 사용하기 위해 처리해야 할 사항
* STM32에서 JTAG핀은 RCC_APB2Periph_AFIO 클럭을 설정해야 정상동작 한다.

    //Enable GPIOA, GPIOB and AFIO clocks
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);    
 
    //Disable the Serial Wire Jtag Debug Port SWJ-DP
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

    //Configure PA.13 (JTMS/SWDAT), PA.14 (JTCK/SWCLK) and PA.15 (JTDI) as output push-pull
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //Configure PB.03 (JTDO) and PB.04 (JTRST) as output push-pull
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
    GPIO_Init(GPIOB, &GPIO_InitStructure);


SWD 를 이용하고 나머지 JTAG핀을 GPIO로 사용하고 싶다면 GPIO_PinRemapConfig()함수에서 GPIO_Remap_SWJ_JTAGDisable 를 설정하면 된다.


#define GPIO_Remap_SWJ_NoJTRST     ((u32)0x00300100)  /* Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */

#define GPIO_Remap_SWJ_JTAGDisable ((u32)0x00300200)  /* JTAG-DP Disabled and SW-DP Enabled */

#define GPIO_Remap_SWJ_Disable     ((u32)0x00300400)  /* Full SWJ Disabled (JTAG-DP + SW-DP) */



고속으로 GPIO를 제어 하기 위해 ST에서 제공하는 함수로는 한계가 있다.
직접 레지스터를 제어 해야 한다.

특히 GPIO 입출력 방향을 자주 바꾸어야 할 경우 아무래도 제공함수는 설정하는것이 너무 많다.
일단 PORTB 하위를 Data포트로 사용하기 때문에 아래와 같이 정의해서 사용하면 편리하다.

#define GPIOB_DIR_IN()     GPIOB->CRL = 0x88888888;
#define GPIOB_DIR_OUT()     GPIOB->CRL = 0x33333333;





Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM322008. 2. 15. 10:31

[STM32] CLOCK

[STM32] CLOCK
클럭 소스는 내부 8Mhz의 RC오실레이터나 외부 4~16Mhz크리스탈, OSC32 32Khz로 공급된다.
SYSCLK(System Clock) sources
 HSI, HSE, PLL에서 공급되며 AHB, APB1/2, ADC and TIM clocks 으로 사용 한다.
 
USBCLK(USB Clock)
내부 PLL으로 부터 생성해서 USB 엔진에 공급된다.
 
RTCCLK(RTC Clock)
LSE, LSI, HSE/128 으로 공급된다.
 

CSS(Clock Security System)
HSE실패를 대비한 백업클럭
 
 
HCLK
코어 클럭으로 72Mhz까지 가능
 
 
 
STM32 전체 Clock 구조



BusMatrix와 Harvard architecture로 SRAM, Flash, Peripherals, DMA를 동시에 접근가능해 병목현상이 상당히 줄어 속도를 향상 시겼다고 함.

클럭설정을 위해 먼저 내부클럭(HSI), 외부클럭 (HSE)를 사용할것인지를 설정한다.
ST에서 제공하는 RCC관련 stm32f10x_rcc.c 파일에서 RCC_HSEConfig()함수를 사용해서 RCC_HSE_ON, RCC_HSE_Bypass를 결정할 수 있다.
 
RCC_PLLConfig함수에서 PLL설정 가능하다.
 
    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
 
 
 
HCLK, PCLK1 , PCLK2 등 클럭 설정을 RCC_Configuration()함수로 만들어 관리하면 편하게 사용할 수 있다.
 
void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();
  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);
  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
 
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);

 
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);
   
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);   //run 72Mhz @Div2

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
   
    /* Enable PLL */
    RCC_PLLCmd(ENABLE);
    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }
    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
}

- PCLK1 은 Timer 등 많은 페리가 연결되어 있는데 Div2일때 최대 72Mhz 로 동작한다.
Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F103-SM2008. 2. 13. 19:28

[STM32-48 EVM]보드 제작

 [STM32-48 EVM]보드 제작











어플리케이션 보드도 함께 제작






Posted by nexp
TAG STM32

댓글을 달아 주세요

[ST_MICRO]/STM322008. 2. 13. 19:26

STM32소개자료

STM32 Product Line





사용자 삽입 이미지

 


특징





Posted by nexp
TAG STM32

댓글을 달아 주세요

[ST_MICRO]/STM322008. 1. 24. 20:02

STM32 예제 소스코드 모음

STM32 예제 소스코드 모음



STM32 기본예제 - 기능별 테스트 예제 모음




STM3210E-EVAL 데모예제 소스 (demonstration firmware)




STM32 USB관련 예제 소스코드


USB HID예제



CDC Driver





IAR EWARM 5.1 예제 소스




Keil 예제 소스
Posted by nexp
TAG STM32

댓글을 달아 주세요