레이블이 MCU-STM32인 게시물을 표시합니다. 모든 게시물 표시
레이블이 MCU-STM32인 게시물을 표시합니다. 모든 게시물 표시

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://ahyuo.blogspot.kr/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 


6/07/2016

STM32F103x and ESP8266

1. STM32F10x

IOT에 관련된 개인일이 있어 잠시 STM과 ESP8266 조합으로 사용하여 Interface를 UART를 이용하여 IOT Device를 만든적이 있는데,
너무 쉽고 다양한 기능을 제공하여 간단히만 소개한다.
사실 MCU는 본인이 직접 선택하여 다른 것을 사용되며, MCU라서 금방배우고, 익힐 수 있기 때문에 구지 ST사 것을 사용할 필요 없다.
더 싼 Device가 있다면 그것으로 사용하면 그뿐이다.
ESP8266은 WIFI Module(AP/STA/AP+STA) 기능 및 다양한 기능을 제공하고 있어 많은 개발하기 편한 걸로 기억한다.

2. ESP8266

UART(Serial Interface)로 손쉽게 Wifi 기능은 물론 (STA와 AP) 선택도 쉽게 선택가능하며,
다양한 Server들을 자체 제공을 해주고 있어 HTTP,DHCP,FTP Server 같은 것들을 기본으로 제공하고 있어 IOT 개발에 있어서 편하게 사용되었다.
다만, Parser의 크기가 상당히 좀 큰 거 같아, Internet을 검색해보면 다 수정을 해서 사용한 것  같다.

내가 이것을 개발했을 때문만 해도 인터넷에 자료가 많이 없었는데, 최근들어 풍부하게 자료들이 많이 늘어 더욱 쉽게 개발이 가능할 것 같다.
자세히 더 다루고 싶지만, 현재 관련 IOT보드를 지인에게 돌려주었기 때문에 현재 기억나는부분과 관련사이트를 Link만 한다.

  https://en.wikipedia.org/wiki/ESP8266
  http://www.hardcopyworld.com/ngine/aduino/index.php/archives/1257

2.1 ESP8266 AT Commands Parser

  http://esp8266at.com/index.html#sect_requirements

    A. How to upgrade to latest firmware

  http://bbs.espressif.com/viewtopic.php?f=16&t=1613

    B. Flash Download Tool

  http://bbs.espressif.com/viewtopic.php?f=57&t=433

2.2 ESP8266 API Function 

  http://esp8266at.com/group___e_s_p8266___a_p_i.html
  http://esp8266at.com/group___e_s_p8266___functions.html

  http://www.espressif.com/en/support/download/sdks-demos?keys=&field_type_tid%5B%5D=14

5/28/2016

STM32F103x and IR Code

1. STM32F103x 기본설명 

우선 아래와 같이 STM32F103x 전체 구조도를 이해하고, 그 다음에 Clock부터 보는 것이 순서인 것 같다.

  • STM32F103x 의 전체구조
MCU or MPU로써 왠만한 기능들은 거의 다 있지만, 다만 Flash 와 SRAM이 아쉬울 뿐이다.



  • STM32F103x 의 Clock Tree 의 기본구성 
  1. PLLMUL(Multiplier): PLL의 설정으로 실질적인 PLL 설정 
  2. AMBA의 AHB : MCU의 사용되어지는 Main Bus로 Cortex와 연결된 부분.
  3. AMBA의 APB1 Peripheral를 위한 BUS1
  4. AMBA의 APB2 Peripheral를 위한 BUS2
  5. USB Clock 
  6. RTC Clock 


상위에서 설명했듯이, FHCLK과 FPCLK1,2 은 ARM의 Bus에 적용되는 Clock 이며 다만 FCLK은 좀 다른 것 같다.
interrupt와 debug 부분하고 관련 있는거 같다. 자세한 내용 아래에서 확인하자.
     http://infocenter.arm.com/help/topic/com.arm.doc.ddi0337e/DDI0337E_cortex_m3_r1p1_trm.pdf


  • STM Series
STM32 F Series의 각 차이점을 알수 가 있다. 차이라고 해봐야 공통 F시리즈의 차이는 SRAM과 FLASH SIZE 차이인 것 같고,
F의 변경 여부에 따라 주변 Deivce와 PIN이 변경되는 것 같다.

     https://en.wikipedia.org/wiki/STM32#Series

1.2 STM GPIO Manual

     http://stm32.kosyak.info/doc/group___g_p_i_o___exported___types.html
     http://stm32.kosyak.info/doc/group___g_p_i_o___exported___functions.html
     http://patrickleyman.be/blog/stm32f4-gpio-configuration/


1.3 STM Timer Manual

     http://embejide.tistory.com/86
     http://www.cs.indiana.edu/~bhimebau/f3lib/html/group__TIM__Group1.html
     http://visualgdb.com/tutorials/arm/stm32/timers/

     http://nexp.tistory.com/474


2. STM IR sample code

예전처럼, GPIO로 IR를 구현할 일 있어 아래의 Source 참조하여 쉽게 구현을 하였다.
오래전에는, 직접 각 회사 리모콘 가지고 IR 을 GPIO로 읽어서 했는데, 요즘 Github가 잘되어있어 너무 좋다.
  https://github.com/ppkt/stm32f1-irhttps://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol


2.1 NEC IR Remocon Protocol (LG)

NEC IR Protocol의 기본구성은 다음과 같다.

Default Code
  • 9ms high 
  • 4.5ms low
  • 8bit address,
  • 8bit inverse of address
  • 8bit command,
  • 8bit inverse of command
  • 560us 다음  1bit 일 경우 1.69ms   ( 전체 2.25ms)
  • 560us 다음  0bit 일 경우 560us    ( 전체 1.12ms)
  • 마지막은 560us high로 

Repeat Code
  • 9ms High
  • 2.25ms low 

     https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol
     http://www.sbprojects.com/knowledge/ir/nec.php


2.2 Samsung IR Remocon Protocol 

Samsung도 기본이 NEC 이지만, Timing이 다르다. 이부분을 변경을 해주면 된다.
아래 Samsung 부분을 참고하자.
  https://rusticengineering.com/2011/02/09/infrared-room-control-with-samsung-ir-protocol/