7/17/2016

STM32F10x Dev Tools (CoIDE)

1. STM32 MPU Dev Tools

저의 경우는 처음부터 어쩔 수 없이 IAR Program을 사용하게 되었지만, STM32F103C8 MPU를 쓰면서
관련된 다른 Tool 들을 찾아보고 알아보기로했다. 왜냐하면 Github에서 *.coproj로 많이들 이용을 하여,
OpenSource기반을 Tool 이 있다는 것을 알게 되었다.


  • MPU: STM32F103C8T6


1.1 CoIDE Program

OpenSouce이며, Eclipse 기반의 Tool로 많이 STM 개발자들이 가장 많이 사용하는 Tool인 것 같다.
무료로 사용이 가능하며 Github에서 이 프로그램 기반으로 많이 개발이 되었으며, 이 Tool안에서도,
손쉽게 STM32 관련 Interface program을 구성할 수 있다.
STM 뿐만 아니라 다양한 MPU들을 지원을 해준다.

  • Download 
    http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-ides/coide.html


1.2 Eclipse

기본의 Eclipse의 CDT(C/C++ Development Tooling) 기반에 GCC 설치하고 이를 연결하여, 개발하는 방식인 것 같다.
ST Link V2는 외부 Tool로 연결하여,  설정이 상당히 복잡하다.
사실 이 방식보다는 위의 CoIDE가 간편하고 사용하기가 편하다.

  • 자세한 설명
    http://www.jkelec.co.kr/img/lecture/stm32_eclipse/stm32_eclipse.html


1.2 IAR Embeded WorkBench IDE Program

처음부터 이 Program을 사용하게 되었으며 사용하기도 간편하며, MPU Check 부터 Source Download가 쉽다.
하지만, Opensource가 아니며, IAR이라는 회사에서 제작이되고 보니 주로 유료로 사용해야하는 것 같다.
STM 뿐만 아니라 다양한 MPU들을 지원을 해준다.

사용방법도 너무 쉽기때문에, 별다른 메뉴얼이 필요 없을 것 같다.

  • MPU 지원여부 Check
    https://www.iar.com/iar-embedded-workbench/partners/stmicroelectronics/
    https://www.iar.com/kr/iar-embedded-workbench2/?focus=wbselector#!?amp%3Barchitecture=ARM&architecture=


  • STM32F103C8T6 인 경우
    https://www.iar.com/kr/iar-embedded-workbench2/?focus=wbselector#!?device=STM32F103C8&architecture=ARM


  • IAR WARM 관련내용 링크들 

    http://www.epnc.co.kr/news/articleView.html?idxno=69706

2. CoIDE

현재 저의 관심은 CoIDE이며, 지금 현재 CoIDE는 Version 문제로 약간 문제가 있다.
Version2로 가면서 많이 변경이 되면서, 기존에 지원되는 것이 지원이 안되고, 불안한 상태이지만,
Version2로 가면서, *.coproj 이외, 문서기능 기본저장으로 파일구조도 풍부한 기능을 제공하는 것 같다. 그리고 약간 변경이 된것 같다.
  • CoIDE 1.7.8          (이 Version으로 현재 선택해서 사용중)
  • CoIDEV2 Beta       (TEST 해보니, 아직 불안함)

2.1 MPU Check 및 Download 

Version2로 가면서, GUI Interface가 더 쉽게 변하였으며, 사용하기도 더 편하다.
다만 기존에 제공하던 기능이 잘 지원이 안된다. Beta Version이라서 그런 것 같다.

  • 본인의 MPU가 이 Tool이 지원되는지 확인
    http://www.coocox.org/book/coocox/coide-dev-manual/2-Introduction/2.2-Support-list

  • CoIDE Download (CoSMart & CoFlash)
    http://www.coocox.org/software.html


2.2 GCC Download 및 설치 & 설정 

CoIDE에서 너무쉽게 설명을 해주고 있다.
GCC를 Download를 한 다음 PATH를 연결하면된다.

    http://www.coocox.org/book/coocox/coide-dev-manual/1-Quickstart/1.2-Compiler-Setting


  • 현재사용중인 GCC

    https://launchpad.net/gcc-arm-embedded/+download

    gcc-arm-none-eabi-5_4-2016q2-20160622-win32.exe


2.3 CoIDE 의 Project 생성 및 설정

처음 이 Tool을 사용하면서 최근에 왜 STM을 많이 사용하는지를 알게되었다.
손쉽게 MPU Interface들을 구성을 할 수 있다.
기존에 구현해 놓은 Interface API를 유저가 추가하는 방식으로 선택만 하면된다.


   1. Project->New Project를 할 경우, user default path를 해제하고 본인원하는 PATH에 저장한다.


   2. 본인이 원하는 Chip을 선택하거나, 이 곳에서 지원하는 Board가 있다면 Board를 선택하자.


   3.  나의 경우는 CHIP을 선택 한 후  ST 다음 본인의 MPU를 선택하고 Finish 를 한다.




   4.  아래의 와 같이 Repository에서 사용가능한 Components를 확인가능하다. 
       이 곳에서 본인이 원하는 Interface API 및 Code를 구축하여 넣어 보자.  


  • CoIDE V2 메뉴얼 
    http://www.coocox.org/book/coocox/coide-dev-manual.en/01-Getting-Started/01.02-Getting-Started

  • 이제 Repository 메뉴에서 본인 필요한 Components을 선택해서 넣자. 
        다만 선택시 오른쪽 Help의 Dependency 확인하고 선택하자.
     

2.4 Repository 의 Components 선택 및 추가

아래의 Component는 거의 필수로 사용이 되어 질것이기 때문에 간단히 설명을 하겠다.

A. COMMON
  • Retarget printf:        Implementation of printf(), sprintf()
  • CMSIS core:           CMSIS core for Cortex M3 V3.01

1. printf는 별로 좋은거 같지가 않다. 추후 다른것으로 교체를 해보던지, 다른 예제를 참조하여
  다시 해보도록 해보겠다. (시간이 있다면)

2. ARM에서 제공하는 CMSIS CORE 란 (Cortex Microcontroller Software Interface Standard)으로 Cortex-M을 위해 사용되어지며, 거의 필수적인 모듈이다.
사용되는 목적은 호환성이다.

아래와 같이 CMSIS-CORE는 우리가 사용하는 Application Code 아래에서 돌아가며,
CPU 및 NVIC(Nested Vectored Interrrupt Contoller), Debug 및 각종 Peripheral와 연결해주고 있다.

IAR Dev Tool에서도 이 Interface를 사용하며, 다른 Interface 역시 거의 모두 동일하다.
IAR Dev Tool 사용을 하여도, 쉽게 CoIDE에 적용이 가능하고 둘다 쉽게 호환이 가능하다.


  • 참고사항 
    아래와 같이 CMSIS 관련부분을 제공하고 있다. 하지만 우리는 CORE만 사용한다.
  1. CMSIS-CORE
  2. CMSIS-Driver
  3. CMSIS-DSP
  4. CMSIS-RTOS API
  5. CMSIS-Pack
  6. CMSIS-SVD
  7. CMSIS-DAP

     자세한 내용은 아래의 사이트에서 확인
    http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php


B. BOOT

  • CMSIS Boot: CMSIS boot for STM32
    이는 Boot에 관련된 부분 Clock 및 Start Up Code가 이곳에 포함이 된다.

C. PERIPHERAL ST

이제 사용하고 싶은 Peripheral들을 선택하여, 넣어 보자.
  1. RCC  :  Reset 과 Clock Control 이다.
  2. GPIO
  3. EXTI
  4. FLASH : STM에 내부에 있는 FLash Driver  //RCC 내 Flash 설정 
  5. TIM :  Timer 
  6. USART : UART  필수
  7. MISC   :  NVIC과 SysTick을 위해 사용한다. 

흥미로운 것은 이곳에서 OS까지 지원을 해준다는 것이다. 나중에 기회가 되면 사용을 해보겠다.
본인 필요하면, Repository에 가서 추후에도 추가가 가능하지만 가입이 필수.


*참고사항
CoIDE는 OS에서 제공을 하고 있는 RTOS는 CMSIS-RTOS API 사용하지 않고 별도의 Layer를 가지고,
사용하는 것 같다. 이 부분은 본인도 확인을 아직 못했다.

2.5  Main 수정을 위한 기본 이해 

  • cmsis_boot->startup->startup_stm32f10x_md.c     
reset과 Interrupt handler 이며, interrupt handler를 등록은 하지 않으면, default_handler로 동작.

  • stm_lib->inc->stm32f10x_rcc.h 
clock을 조절하기에 설정은 필수이며, 초기 PLL을 설정 한 후에는
Peripheral을 동작하기 위해서는 버스의 구조상 APB1,2 두개로 나누어져 있어 주의하자

RCC는 중요하며, 필요하지 않는 부분은 사용하지 하도록 하자.
Clock을 조절은 Power 소비하고도 밀접하다.

  • stm_lib->inc->stm32f10x_gpio.h 
이 칩은 Pinmux가 필요없으며, Pin의 상태를 직접설정을 해줘야 한다.
STM32이 이 칩은 모든 PIN이 GPIOA~E 로 구성이 되어있으며, 이는 각각의 Peripheral과 중복이 된다.
그래서 GPIO의 설정은 필수다. 
반드시 구조도와 PINMAP을 Datasheet에서 확인하자.
  1. 먼저 GPIOA~E사이의 원하는 CLOCK을 RCC로 등록하자. (APB1에 구성) 
  2. 그리고, Peripheral을 CLOCK 설정을 하자. (APB1 or APB2) 
  3. 이 후에 관련 GPIOA-E에서 필요한 PIN의 상태를 설정하자.  

    // APB2 Clock enable for USART(GPIOA9, A10)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |  RCC_APB2Periph_AFIO, ENABLE);

    /* USART2 clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

    /* Configure the GPIO ports( USART2 Transmit and Receive Lines) */
    /* Configure the USART2_Tx as Alternate function Push-Pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure the USART2_Rx as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure the USART2 */
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;


    기본구조도
    http://ahyuo79.blogspot.com/2016/05/stm32f103x.html
    http://www.keil.com/forum/20579/
  • weak 구현된 함수
쉽게 말하면, 내가 선언을 하지 않고 사용하면, 기존에 weak로 구현된 함수로 동작된다.
함수의 중복을 허용을 하되,  동일함수가 두 개일 경우 weak는 동작이 되지 않는다.

    http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0205g/CIACBCDA.html

    현재사용되는 방법은 약간 다르나, 좋은 예제이다.
    https://en.wikipedia.org/wiki/Weak_symbol

  • STM에서 제공하는 함수 DOC (Version 확인)
    http://stm32.kosyak.info/doc/


2.5  Main 수정 및 기타 UART 수정

함수과 Interface들은 쉽게 제공은 되지만, 어떻게 사용해야 할지가 궁금하거라 생각이 든다.
아래와 같이 각 Components를 선택하면, 다양한 examples들을 확인가능하며 이 Exmaples을 추가가능하다.
나의 경우는 그저 참조만 했다.

예를 들면, 부팅이 중요하니까,
  1. Componets창을 선택 
  2. Peripheal.ST->RCC 를 클릭하시면 우측에 RCC의 Examples들을 확인 . 
  3. RCC_Exp.c를 저는 참조하여, 관련부분 복사 저의 Main을 구성수정.   




  • stdio->printf 에 UART2 연결  
printf 소스를 보니, UART소스와 연결이 되지 않고, 나의 경우는 UART2를 사용해야 했기에,
아래와 같이 수정하였다.

void PrintChar(char c)
{
 USART_SendData(USART2,c);
 while (USART_GetFlagStatus(USART2, USART_FLAG_TXE)==RESET);
    return 1;
}

  • Main 수정
중요한 Clock 설정과, UART2 관련 설정
(UART2 Interrupt handler는 LED용 TEST)
만약 LED가 있다면, GPIO 설정하고 나의 경우는 입력이 오면 USART2_IRQHandler을 이용하여 LED 번갈아 가면 켜지도록하였다.
그 소스는


//CMSIS_BOOT
#include <stm32f10x.h>
#include <system_stm32f10x.h>

//STM_LIB
#include <stm32f10x_exti.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_flash.h>
#include <stm32f10x_tim.h>
#include <stm32f10x_usart.h>

//printf
#include <stdio.h>

//NVIC
#include <misc.h>

ErrorStatus HSEStartUpStatus;

/**
  * @brief  Sets System clock frequency to 72MHz and configure HCLK, PCLK2
  *   and PCLK1 prescalers.
  * @param  None
  * @retval : None
  */
void SetSysClockTo72(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);

    /* 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)
    {
    }
  }

}

void USART2_test_interrupt(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // APB2 Clock enable for USART(GPIOA9, A10)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |  RCC_APB2Periph_AFIO, ENABLE);

    /* USART2 clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

    /* Enable the USART2 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    /* Configure the GPIO ports( USART2 Transmit and Receive Lines) */
    /* Configure the USART2_Tx as Alternate function Push-Pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure the USART2_Rx as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure the USART2 */
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART2, &USART_InitStructure);

    // Rx Not empty interrupt enable
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

    /* Enable the USART2 */
    USART_Cmd(USART2, ENABLE);

}

void USART2_IRQHandler(void)
{
    char receive_data;
    int i;

    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {
        receive_data = USART_ReceiveData(USART2) & 0xFF;

        for(i=0; i< 10; i++)
        {
            USART_SendData(USART2, receive_data);
            while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET );
        }

        USART_ClearITPendingBit(USART2, USART_IT_RXNE);

    }
}



int main(void)
{

    SetSysClockTo72();
    USART2_test_interrupt();

    while(1)
    {

     printf("hello world \n\r");

    }
}


  • 추가 TEST용 Program 

//아래와 같이 설정하시려면, 먼저 CLock과 GPIO설정을 따로 해야한다. 

#define LED_BLUE           GPIO_Pin_12  // PB6
#define LED_BLUE_ON   GPIOB->BSRR=LED_BLUE // ON
#define LED_BLUE_OFF   GPIOB->BRR=LED_BLUE // OFF
#define LED_BLUE_CHK            (GPIOB ->IDR & LED_BLUE)

#define LED_GREEN         GPIO_Pin_13  // PB6
#define LED_GREEN_ON  GPIOB->BSRR=LED_GREEN // ON
#define LED_GREEN_OFF   GPIOB->BRR=LED_GREEN // OFF
#define LED_GREEN_CHK           (GPIOB ->IDR & LED_GREEN)

#define LED_RED                 GPIO_Pin_14  // PB6
#define LED_RED_ON   GPIOB->BSRR=LED_RED // ON
#define LED_RED_OFF         GPIOB->BRR=LED_RED // OFF
#define LED_RED_CHK         (GPIOB ->IDR & LED_RED)

// Interrupt handler에 아래와 같이 추가 

        if(LED_BLUE_CHK){
         LED_BLUE_OFF;
         LED_GREEN_ON;
     }else {
      LED_GREEN_OFF;
                LED_BLUE_ON;
  }



위 Test Program은 printf 부분을 더 수정해야 할 것 같고, 말 그대로 Test program이다
Printf는 동작이 되나, linefeed와 carriage return를 넣어야한다.
나는 운이 좋게 한번에 동작이 되었고, 너무 쉽게 연결이 가능했다. 너무 편한 Interface 인 것 같다.
Interrupt handler도 등록하면 사용이 쉽고, 다른 Interface이도 무리없이 사용가능할 것 같다.


2.6 ST-LINK/V2 연결 및 확인 

나의 경우는 Start Debug 및 Download 기능 ST-Link이 문제가 없었고 디버그도 잘 동작하였다.
아마 이미 ST-Link USB Driver가 설치가 되어서 있어 동작이 잘된 것 같다.
만약 동작이 되지 않는다면 Driver를 설치하시기 바란다.

    http://www.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html


2.7 CoIDE의 장점

  • 개발의 용이성의 장점 
  1. 무료이며, 사용하기 쉬운 Interface 제공 
  2. Repsotitory 창에서 무료 Component 형식으로 손쉽게 Source 및 Driver 등 추가가능
  3. Comonents 창에서 무료 Example 제공 

  • 개발시 소스 분석 및 Debugging 의 장점
  1. JTAG을 이용한 손쉬운 Debugging  제공  
  2. Source Insight 과 유사한 기능 제공
  3. Open Declaration  : 정의된 함수로 이동
  4. Open Call Hierarchy : 함수 구조도 파악용이
  5. Quick OutLine:  구현된함수의 Outline을 보여준다.  

이외에도 많은 기능을 제공을 하지만, 완벽히 동작되지 않는 기능도 있으니 본인이 파악해서 사용하는게 좋겠다.


Eclipse 기반의 Tool이기에 아래의 설명에서 이용법을 찾자.
    http://help.eclipse.org/mars/index.jsp


단점은 Tool의 안정성인 것 같다.


3. STM 관련 Examples

Google에서 STM examples을 치면 많이 나오고, 검색을 하면 상당하며, github에도 많은 프로젝트가 진행이
되고 있어 본인이 관심이 있다면, 찾기가 쉬울 것 같다.
다만 Examples의 검증들과 확인과 포팅이 중요할 것 같다.


3.1 STM SITE에서 제공해주는 Example

STM에 가서 직접 찾아보고 문서를 보기위해서, 다양하게 검색을 해본 결과, STM은 문서와 Software를 많이 제공을 하는것 같으며,
본인도, 이 프로그램들을 다 Download를 해보지 못했다.다만 이렇게 사용을 하면 되겠구나, 알뿐이다.

  • SOFTWARE DEVELOPMENT TOOLS
    http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series/stm32f103/stm32f103c8.html


  • STM32 Embedded Software 
    http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software.html?querycriteria=productId=SC961


  • STM32Cube Embedded Software  
    http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32cube-embedded-software.html?querycriteria=productId=LN1897


3.2 이외  Example


  • 기본설명과 예제를 제공
    UART예제는 이곳에서 참조.
    http://www.jkelec.co.kr/img/lecture/cortex_app/cortex_app_3.html

  • 다양한 Example을 제공을 해줘서 참고하기가 좋았다.
    http://nexp.tistory.com/474

  • Main을 찾지못했고, 그냥 추후 Peripheral이 없을 경우만 봐야할 것 같다.
    http://www.micro4you.com/store/stm32f103-development-board.html


  • STM에서 제공했다고 하는데, 예제가 쉽고 간결하다.
    RCC예제는 이곳에서 참조 (본인 XTAL 확인 및 사용 CLOCK 결정)
    http://www.e2box.co.kr/entry/STM32F103-%EA%B8%B0%EB%8A%A5%EB%B3%84-%ED%8E%8C%EC%9B%A8%EC%96%B4-%EC%98%88%EC%A0%9C


  • 구조도와 Main 함수만 참조만하고 Download 포기했음, 가입귀찮음. 
    http://www.devgee.com/soft/sort014/sort017/sort090/down-1080210.html 


댓글 없음 :