선물로 받은 STM32F303 Discovery 보드 


지난 토요일 퇴사한 회사에서 택배가 와있다고 연락온지 한참만에 방문해서 STM32F303 Discovery 보드를 받아 왔다. 


예전에 ICBANQ에서 세마나 할때 주저리 떠들었더니 선물로 주신듯 .. 


써봐야 하는데~~ 요즘은 바빠서 잠시 보류 했다가 시간이 나면 해보려 한다. 







'공부 > STM32' 카테고리의 다른 글

STM32F030 보드  (0) 2013.12.11
ST-LINK를 이용한 STM32 양산  (1) 2013.03.20
stm32f3xx 대리점 문의  (0) 2012.12.01
관심 가는 STM32F30x  (0) 2012.11.30
STM32/STM32 시리얼 또는 USB 다운로드 지원 툴  (0) 2012.11.13

관심 가는 STM32F30x 로 포스팅을 올렸었는데

국내에서 어떻게 사용되는지 알고 싶어 대리점에

문의를 했다.

대리점에서는  아직 준비가 안된듯 하다.

디스커버리 보드는 발주후 2주정도 걸린다고 하고

아직 부품은 안들어 와 있는듯 하다.

 

현재는 STM32F4xx 계열을 추천 한다.

대량 양산 제품이 아닌 경우 딜리버리 문제로 인해 대리점에서 재고를 가지고 가는 제품을 사용하는 것이 좋은데

F3를 추천하지 않으니.. 그래도 일단 공부 ~~

 

 

 

'공부 > STM32' 카테고리의 다른 글

ST-LINK를 이용한 STM32 양산  (1) 2013.03.20
선물로 받은 STM32F303 Discovery 보드  (0) 2013.01.21
관심 가는 STM32F30x  (0) 2012.11.30
STM32/STM32 시리얼 또는 USB 다운로드 지원 툴  (0) 2012.11.13
[STM32] Source 보기 7  (0) 2012.11.09

 

ST에서 STM32F3xx 라는 MCU를 출시 했는데 Cortex-M4 기반으로 특이점으로 ADC 기능이 강화된 것 같다.

Cortex-M4 라는 DSP 기능이 강화된 것도 성능 향상에 도움을 준다고 하는데 시간이 되면 TEST를 해봐야 겠다.

ST에서 Discovery 보드를 출시 했는데 구해 봐야겠다.

 

 

참고 : http://www.isnews.co.kr/news/articleView.html?idxno=23028

 

'공부 > STM32' 카테고리의 다른 글

선물로 받은 STM32F303 Discovery 보드  (0) 2013.01.21
stm32f3xx 대리점 문의  (0) 2012.12.01
STM32/STM32 시리얼 또는 USB 다운로드 지원 툴  (0) 2012.11.13
[STM32] Source 보기 7  (0) 2012.11.09
[STM32] Source 보기 6  (0) 2012.11.09
STM32/STM32 시리얼 또는 USB 다운로드 지원 툴

ST 사이트에서 다운로드하려 찾으면 시간이 많이 걸린다.

그래서 여기에 업로드 해둠

 

 

stm32-stm8_flash_loader_demo.zip

 

 

'공부 > STM32' 카테고리의 다른 글

stm32f3xx 대리점 문의  (0) 2012.12.01
관심 가는 STM32F30x  (0) 2012.11.30
[STM32] Source 보기 7  (0) 2012.11.09
[STM32] Source 보기 6  (0) 2012.11.09
[STM32] Source 보기 5  (0) 2012.11.09

외부 인터럽트 설정

 
 
-----------------------------------------------------------------------------------------
 
int main(void)
{
    uint8_t ch;
 
    /* System Clocks Configuration */
    RCC_Configuration();  //시스템 클럭을 살리고 주변 프리페럴럴 를 살린다.
 
    RCC_GetClocksFreq(&rcc_clocks); //현재 설정된 클럭을 rcc_clocks 스트럭쳐로 가져 온다.

    /* NVIC configuration */
    NVIC_Configuration();   //인터럽트 백터 테이블을 선언 한고, 우선순위 선언, 인터럽트 살리기 

    /* Configure the GPIO ports */
    GPIO_Configuration();   //기능에 따라 GPIO를 선언하고 동작 시킨다.

    /* EXTI configuration */
    EXTI_Configuration();   //외부 인터럽트를 위해 설정 한다.


-----------------------------------------------------------------------------------------
 
EXTI_Configuration();   함수 는 외부 인터럽트를 설정 한다.

 
 
외부 인터럽트는 총 19개의 edge detecter 구성 되어 event 나 인터럽트 처리 에 사용된다.
 rising, falling 또는 두개 한꺼번에 동작 가능 하도록 설정 할수 있습니다.

PORTA0,PORTB0 와 같이 여러개의 port의 같은 bit 는 한개의 인터럽처 처리가 된다.
또한 16번 인터럽트는 PVD,17번 RTC,18번 USB wakeup 로 사용된다.
NVIC에서 인터럽트를 사용하겠다고 설정하고,이함수에서 특성을 설정 하면되고

해당 인터럽트 백더 함수에 해당 인터럽트가 발생되면 처리될 소스를 코딩하면 된다.

 
 
-----------------------------------------------------------------------------------------
 
void EXTI_Configuration(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;
 
    /* Configure gpio as input : Button Left-WKUP */
    /* Connect EXTI Line to gpio pin */
    //특별한 용도로 사용함을 설정 한다.
    GPIO_EXTILineConfig(GPIO_PORTSOURCE_KEY, GPIO_PINSOURCE_KEY1);
 
    /* Configure EXTI Line to generate an interrupt */
    EXTI_InitStructure.EXTI_Line    = GPIO_EXTI_Line_KEY1;  //특성 설정을 한다.
    EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure); // 인터럽트를 활성화 한다.


-----------------------------------------------------------------------------------------
 
 
 
GPIO_EXTILineConfig(); 는 특수 모드로 사용되는것을 설정하고

EXTI_Init(); 외부 인터럽트를 설정 한다.

 

 

'공부 > STM32' 카테고리의 다른 글

관심 가는 STM32F30x  (0) 2012.11.30
STM32/STM32 시리얼 또는 USB 다운로드 지원 툴  (0) 2012.11.13
[STM32] Source 보기 6  (0) 2012.11.09
[STM32] Source 보기 5  (0) 2012.11.09
[STM32] Source 보기 4  (0) 2012.11.09

GPIO 설정

 
 
------------------------------------------------------------------------------------
 
int main(void)
{
    uint8_t ch;
 
    /* System Clocks Configuration */
    RCC_Configuration();  //시스템 클럭을 살리고 주변 프리페럴럴 를 살린다.
 
    RCC_GetClocksFreq(&rcc_clocks); //현재 설정된 클럭을 rcc_clocks 스트럭쳐로 가져 온다.

    /* NVIC configuration */
    NVIC_Configuration();   //인터럽트 백터 테이블을 선언 한고, 우선순위 선언, 인터럽트 살리기 

    /* Configure the GPIO ports */
    GPIO_Configuration();   //기능에 따라 GPIO를 선언하고 동작 시킨다.
 
------------------------------------------------------------------------------------
 
 
 
GPIO_Configuration();   을 살펴보면 GPIO 의 특성을 설정하고 동작모드 설정한다.

 
 
------------------------------------------------------------------------------------
 
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;    //어떤 pin를 어떤 스피드로 어떤기능으로 할것인가?
 
    // UART configuration ...
    /* Configure USARTx_Tx as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin   = GPIO_USART_Tx_Pin;  //pin 사용 bit 를 선언 한다.
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //output mode에서  max speed 선언
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;    //pin 이 어떤 상태로 동작하는지선언,
    GPIO_Init(GPIO_USART, &GPIO_InitStructure);         //GPIO_USART = GPIOA
 
    /* Configure USARTx_Rx as input floating */
    GPIO_InitStructure.GPIO_Pin  = GPIO_USART_Rx_Pin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIO_USART, &GPIO_InitStructure);
 
 
 
------------------------------------------------------------------------------------
 
 
 
몇가지 선언된것을 찾아보면 아래와 같다.

 
 
typedef enum
{
  GPIO_Speed_10MHz = 1, //output mode, max speed 10Mhz
  GPIO_Speed_2MHz,      //output mode, max speed 2Mhz
  GPIO_Speed_50MHz      //output mode, max speed 50Mhz
}GPIOSpeed_TypeDef;

 
typedef enum
{ GPIO_Mode_AIN = 0x0,              //Analog input
  GPIO_Mode_IN_FLOATING = 0x04,     //Floating input (reset 후 최초 상태 )
  GPIO_Mode_IPD = 0x28,             //input pull-down mode
  GPIO_Mode_IPU = 0x48,             //input pull-up mode
  GPIO_Mode_Out_OD = 0x14,          //general output open drain mode
  GPIO_Mode_Out_PP = 0x10,          //general output push-pull mode
  GPIO_Mode_AF_OD = 0x1C,           //alternate function output open-drain
  GPIO_Mode_AF_PP = 0x18            //alternate function output open-drain
}GPIOMode_TypeDef;

 
 

 

'공부 > STM32' 카테고리의 다른 글

STM32/STM32 시리얼 또는 USB 다운로드 지원 툴  (0) 2012.11.13
[STM32] Source 보기 7  (0) 2012.11.09
[STM32] Source 보기 5  (0) 2012.11.09
[STM32] Source 보기 4  (0) 2012.11.09
[STM32] Source 보기 3  (0) 2012.11.09


인터럽트를 살리는 루틴이 있다.

 
 
------------------------------------------------------------------------------------
 
int main(void)
{
    uint8_t ch;
 
    /* System Clocks Configuration */
    RCC_Configuration();  //시스템 클럭을 살리고 주변 프리페럴럴 를 살린다.
 
    RCC_GetClocksFreq(&rcc_clocks); //현재 설정된 클럭을 rcc_clocks 스트럭쳐로 가져 온다.

    /* NVIC configuration */
    NVIC_Configuration();   //인터럽트 백터 테이블을 선언 한고, 우선순위 선언, 인터럽트 살리기 

------------------------------------------------------------------------------------
 
 
 
NVIC_Configuration 을 살펴 보면  code를 ram 에서 돌릴지 flash 에서 돌릴지에 따라
 
NVIC가 동작할수 있도록 인터럽트 백터 번지를 선언해 주고

인터럽트를 동작하도록 선언 하다.

 
 
------------------------------------------------------------------------------------
 
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;//인터럽트 선언하기 위한 스트럭쳐 정의 함

#ifdef  VECT_TAB_RAM    //선언이 안되어 있음 동작안함  ..
    /* Set the Vector Table base location at 0x20000000 */
    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */    //flash type으로 컴파일
    /* Set the Vector Table base location at 0x08000000 */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   //인터럽트 백터 번지 설정   
#endif
 
    //기본적으로 H/W 에 인터럽트 테이블 순서에 따라 우선순위가 정해지나
    //Interrupt Priority Register 를 가지고 S/W 적으로 0~255까지 변경할수 있다.
    //그러나 reset,NMI,hard fault 는 가장 높은 우선순위를 가진다.
    //하나씩 다 설정하면 무척 복잡해서 우선순위 group 을 지원하며
    //
    /* Configure one bit for preemption priority */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //인터럽트 운선 순위 설정

    /* Enable the EXTI0 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;    //
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
 
    /* Enable the EXTI1 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
 
------------------------------------------------------------------------------------
 
 
 
NVIC_SetVectorTable 에보면 assert_param(IS_NVIC_VECTTAB(NVIC_VectTab)); 라는 문장이 있다. 조건이 다르면 에러가 발생되도록 하는것인데 조건이 아래와 같다.
 
#define NVIC_VectTab_RAM             ((uint32_t)0x20000000)
#define NVIC_VectTab_FLASH           ((uint32_t)0x08000000)
#define IS_NVIC_VECTTAB(VECTTAB) (((VECTTAB) == NVIC_VectTab_RAM) || \
                                  ((VECTTAB) == NVIC_VectTab_FLASH))
즉 인터럽럽트 백터 번지가 다른것이 들어올경우 에러 처리 ..

 
 
NVIC_Init() 에서 최종적으로 인터럽트를 동작시키거나 죽이는 역활을 한다.

'공부 > STM32' 카테고리의 다른 글

[STM32] Source 보기 7  (0) 2012.11.09
[STM32] Source 보기 6  (0) 2012.11.09
[STM32] Source 보기 4  (0) 2012.11.09
[STM32] Source 보기 3  (0) 2012.11.09
[STM32] SOURCE 보기 2  (0) 2012.11.09
몇일이 지났는데 아직도 main에 초입을 보고 있다. 분발~~
 
 
 
이번에 볼 소스는  RCC_GetClocksFreq 다 .
 
이 함수는 rcc_clocks 라는 스트럭쳐를 상수값으로 전달해서
 
내부 선언된 클럭을 읽어오는 함수다.
---------------------------------------------------------------------------------
 
int main(void)
{
    uint8_t ch;
 
    /* System Clocks Configuration */
    RCC_Configuration();  //시스템 클럭을 살리고 주변 프리페럴럴 를 살린다.
 
    RCC_GetClocksFreq(&rcc_clocks); //현재 설정된 클럭을 rcc_clocks 스트럭쳐로 가져 온다.
---------------------------------------------------------------------------------
 
 
 
스트력처를 보면 클러벌 변수로 선언이 되어 있다.
---------------------------------------------------------------------------------
 
RCC_ClocksTypeDef  rcc_clocks;
 
---------------------------------------------------------------------------------
 
 
 
스트럭처 내용을 보면 typedef 로 선언되어 있고 stm32f10x_rcc.h 에 있다.
특별한기능은 없고 값을 기억하고 있는용으로 사용된다.
---------------------------------------------------------------------------------
 
typedef struct
{
  uint32_t SYSCLK_Frequency;  /*!< returns SYSCLK clock frequency expressed in Hz */
  uint32_t HCLK_Frequency;    /*!< returns HCLK clock frequency expressed in Hz */
  uint32_t PCLK1_Frequency;   /*!< returns PCLK1 clock frequency expressed in Hz */
  uint32_t PCLK2_Frequency;   /*!< returns PCLK2 clock frequency expressed in Hz */
  uint32_t ADCCLK_Frequency;  /*!< returns ADCCLK clock frequency expressed in Hz */
}RCC_ClocksTypeDef;
---------------------------------------------------------------------------------
 
 
 
RCC_GetClocksFreq  소스는 stm32f10x_rcc.c 에 있다. 내용을 보면 아래와 같다.
---------------------------------------------------------------------------------
 
void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
{
  uint32_t tmp = 0, pllmull = 0, pllsource = 0, presc = 0;
 
#ifdef  STM32F10X_CL //105,107은 레지스터가 추가되어 있어 계산식이 복잡하다.
  uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0;
#endif /* STM32F10X_CL */
   
  /* Get SYSCLK source -------------------------------------------------------*/
  tmp = RCC->CFGR & CFGR_SWS_Mask;
  /*  SWS 정보 : system 클럭의 소스는 누구?
      00: HSI oscillator used as system clock
      01: HSE oscillator used as system clock
      10: PLL used as system clock
      11: not applicable
  */
 
  switch (tmp)
  {
    case 0x00:  /* HSI used as system clock */
      RCC_Clocks->SYSCLK_Frequency = HSI_Value;   //define 된 값을 가져 온다.
      break;
    case 0x04:  /* HSE used as system clock */
      RCC_Clocks->SYSCLK_Frequency = HSE_Value;   //define 된 값을 가져 온다.
      break;
    case 0x08:  /* PLL used as system clock */
 
      /* Get PLL clock source and multiplication factor ----------------------*/
      pllmull = RCC->CFGR & CFGR_PLLMull_Mask;  //pll 입력 주파수 * 몇배할값
      pllsource = RCC->CFGR & CFGR_PLLSRC_Mask; //pll 입력: 외부클럭 (1값)이 바로 들어오는지 내부클럭/2 (0값)되서 들어오는지
     
#ifndef STM32F10X_CL      
      //pllmull 이 0 이면 pll은 *2로 동작
      //pllmull 이 1 이면 pll은 *3로 동작 .....
      pllmull = ( pllmull >> 18) + 2;
     
      if (pllsource == 0x00)  //내부클럭/2 * pll배수
      {/* HSI oscillator clock divided by 2 selected as PLL clock entry */
        RCC_Clocks->SYSCLK_Frequency = (HSI_Value >> 1) * pllmull;
      }
      else  //외부 클럭 * pll 배수 또는   외부 클럭/2 * pll
      {/* HSE selected as PLL clock entry */
        if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (uint32_t)RESET)
        {/* HSE oscillator clock divided by 2 */
          RCC_Clocks->SYSCLK_Frequency = (HSE_Value >> 1) * pllmull;
        }
        else
        {
          RCC_Clocks->SYSCLK_Frequency = HSE_Value * pllmull;
        }
      }
#else    //성능 좋은 놈들  105,107
      pllmull = pllmull >> 18;
     
      if (pllmull != 0x0D)
      {
        //pllmull 이 0 이면 pll은 *2로 동작
        //pllmull 이 1 이면 pll은 *3로 동작
        pllmull += 2;
      }
      else
      { /* PLL multiplication factor = PLL input clock * 6.5 */
 
        pllmull = 13 / 2;
      }
           
      if (pllsource == 0x00)  //내부클럭/2 * pll배수
      {/* HSI oscillator clock divided by 2 selected as PLL clock entry */
        RCC_Clocks->SYSCLK_Frequency = (HSI_Value >> 1) * pllmull;
      }
      else  //외부 클럭 * pll 배수
      {/* PREDIV1 selected as PLL clock entry */
       
        /* Get PREDIV1 clock source and division factor */
        prediv1source = RCC->CFGR2 & CFGR2_PREDIV1SRC;
        prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1;
       
        if (prediv1source == 0)
        { /* HSE oscillator clock selected as PREDIV1 clock entry */
          RCC_Clocks->SYSCLK_Frequency = (HSE_Value / prediv1factor) * pllmull;         
        }
        else
        {/* PLL2 clock selected as PREDIV1 clock entry */
         
          /* Get PREDIV2 division factor and PLL2 multiplication factor */
          prediv2factor = ((RCC->CFGR2 & CFGR2_PREDIV2) >> 4) + 1;
          pll2mull = ((RCC->CFGR2 & CFGR2_PLL2MUL) >> 8 ) + 2;
          RCC_Clocks->SYSCLK_Frequency = (((HSE_Value / prediv2factor) * pll2mull) / prediv1factor) * pllmull;                        
        }
      }
#endif /* STM32F10X_CL */
      break;
 
    default:
      RCC_Clocks->SYSCLK_Frequency = HSI_Value;
      break;
  }
 
  /* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/
  /* Get HCLK prescaler */
  tmp = RCC->CFGR & CFGR_HPRE_Set_Mask;
  tmp = tmp >> 4;
  presc = APBAHBPrescTable[tmp];
  /* HCLK clock frequency */ //core,AHB,menory,DMA 용
  RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;
  /* Get PCLK1 prescaler */
  tmp = RCC->CFGR & CFGR_PPRE1_Set_Mask;
  tmp = tmp >> 8;
  presc = APBAHBPrescTable[tmp];
  /* PCLK1 clock frequency */ //APB1 용 peripherals
  //USART2,USART3,UART4,SPI/I2S2,SPI/I2S3,I2C1,I2C2,TIM2,TIM3,TIM4,TIM5,TIM6,TIM7가 사용
  RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
  /* Get PCLK2 prescaler */
  tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask;
  tmp = tmp >> 11;
  presc = APBAHBPrescTable[tmp];
  /* PCLK2 clock frequency */  //APB2용 peripherals
  //USART1,SPI1,ADC1,ADC3,TIM1,TIM8 가 사용
  RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
  /* Get ADCCLK prescaler */
  tmp = RCC->CFGR & CFGR_ADCPRE_Set_Mask;
  tmp = tmp >> 14;
  presc = ADCPrescTable[tmp];
  /* ADCCLK clock frequency */  //ADC용 클럭
  //타이머에 의한 ADC 동작을 만들수도 있고 ADC클럭으로 이벤트 동작을 할수도 있다.
  RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc;
}
 
---------------------------------------------------------------------------------
 
 
 
* STM32F10X_CL  define 문을 잘 보면서 소스를 봐야지 자꾸 잘못 본다.

'공부 > STM32' 카테고리의 다른 글

[STM32] Source 보기 6  (0) 2012.11.09
[STM32] Source 보기 5  (0) 2012.11.09
[STM32] Source 보기 3  (0) 2012.11.09
[STM32] SOURCE 보기 2  (0) 2012.11.09
[STM32] Source 보기 1  (0) 2012.11.09

+ Recent posts