저의 경우는 처음부터 어쩔 수 없이 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
1.2 Eclipse
기본의 Eclipse의 CDT(C/C++ Development Tooling) 기반에 GCC 설치하고 이를 연결하여, 개발하는 방식인 것 같다.
ST Link V2는 외부 Tool로 연결하여, 설정이 상당히 복잡하다.
사실 이 방식보다는 위의 CoIDE가 간편하고 사용하기가 편하다.
- 자세한 설명
1.2 IAR Embeded WorkBench IDE Program
처음부터 이 Program을 사용하게 되었으며 사용하기도 간편하며, MPU Check 부터 Source Download가 쉽다.
하지만, Opensource가 아니며, IAR이라는 회사에서 제작이되고 보니 주로 유료로 사용해야하는 것 같다.
STM 뿐만 아니라 다양한 MPU들을 지원을 해준다.
사용방법도 너무 쉽기때문에, 별다른 메뉴얼이 필요 없을 것 같다.
- MPU 지원여부 Check
https://www.iar.com/kr/iar-embedded-workbench2/?focus=wbselector#!?amp%3Barchitecture=ARM&architecture=
- STM32F103C8T6 인 경우
- 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이 지원되는지 확인
- CoIDE Download (CoSMart & CoFlash)
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 메뉴얼
- 이제 Repository 메뉴에서 본인 필요한 Components을 선택해서 넣자.
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
- CMSIS-Driver
- CMSIS-DSP
- CMSIS-RTOS API
- CMSIS-Pack
- CMSIS-SVD
- CMSIS-DAP
자세한 내용은 아래의 사이트에서 확인
http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php
B. BOOT
- CMSIS Boot: CMSIS boot for STM32
C. PERIPHERAL ST
이제 사용하고 싶은 Peripheral들을 선택하여, 넣어 보자.
- RCC : Reset 과 Clock Control 이다.
- GPIO
- EXTI
- FLASH : STM에 내부에 있는 FLash Driver //RCC 내 Flash 설정
- TIM : Timer
- USART : UART 필수
- MISC : NVIC과 SysTick을 위해 사용한다.
흥미로운 것은 이곳에서 OS까지 지원을 해준다는 것이다. 나중에 기회가 되면 사용을 해보겠다.
본인 필요하면, Repository에 가서 추후에도 추가가 가능하지만 가입이 필수.
*참고사항
CoIDE는 OS에서 제공을 하고 있는 RTOS는 CMSIS-RTOS API 사용하지 않고 별도의 Layer를 가지고,
사용하는 것 같다. 이 부분은 본인도 확인을 아직 못했다.
2.5 Main 수정을 위한 기본 이해
- cmsis_boot->startup->startup_stm32f10x_md.c
- stm_lib->inc->stm32f10x_rcc.h
Peripheral을 동작하기 위해서는 버스의 구조상 APB1,2 두개로 나누어져 있어 주의하자
RCC는 중요하며, 필요하지 않는 부분은 사용하지 하도록 하자.
Clock을 조절은 Power 소비하고도 밀접하다.
- stm_lib->inc->stm32f10x_gpio.h
STM32이 이 칩은 모든 PIN이 GPIOA~E 로 구성이 되어있으며, 이는 각각의 Peripheral과 중복이 된다.
그래서 GPIO의 설정은 필수다.
반드시 구조도와 PINMAP을 Datasheet에서 확인하자.
- 먼저 GPIOA~E사이의 원하는 CLOCK을 RCC로 등록하자. (APB1에 구성)
- 그리고, Peripheral을 CLOCK 설정을 하자. (APB1 or APB2)
- 이 후에 관련 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는 동작이 되지 않는다.
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0205g/CIACBCDA.html
현재사용되는 방법은 약간 다르나, 좋은 예제이다.
https://en.wikipedia.org/wiki/Weak_symbol
- STM에서 제공하는 함수 DOC (Version 확인)
2.5 Main 수정 및 기타 UART 수정
함수과 Interface들은 쉽게 제공은 되지만, 어떻게 사용해야 할지가 궁금하거라 생각이 든다.
아래와 같이 각 Components를 선택하면, 다양한 examples들을 확인가능하며 이 Exmaples을 추가가능하다.
나의 경우는 그저 참조만 했다.
예를 들면, 부팅이 중요하니까,
- Componets창을 선택
- Peripheal.ST->RCC 를 클릭하시면 우측에 RCC의 Examples들을 확인 .
- RCC_Exp.c를 저는 참조하여, 관련부분 복사 저의 Main을 구성수정.
- stdio->printf 에 UART2 연결
아래와 같이 수정하였다.
(UART2 Interrupt handler는 LED용 TEST)
만약 LED가 있다면, GPIO 설정하고 나의 경우는 입력이 오면 USART2_IRQHandler을 이용하여 LED 번갈아 가면 켜지도록하였다.
그 소스는
위 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의 장점
이외에도 많은 기능을 제공을 하지만, 완벽히 동작되지 않는 기능도 있으니 본인이 파악해서 사용하는게 좋겠다.
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를 해보지 못했다.다만 이렇게 사용을 하면 되겠구나, 알뿐이다.
3.2 이외 Example
http://www.jkelec.co.kr/img/lecture/cortex_app/cortex_app_3.html
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
void PrintChar(char c)
{
USART_SendData(USART2,c);
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE)==RESET);
return 1;
}
- Main 수정
(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의 장점
- 개발의 용이성의 장점
- 무료이며, 사용하기 쉬운 Interface 제공
- Repsotitory 창에서 무료 Component 형식으로 손쉽게 Source 및 Driver 등 추가가능
- Comonents 창에서 무료 Example 제공
- 개발시 소스 분석 및 Debugging 의 장점
- JTAG을 이용한 손쉬운 Debugging 제공
- Source Insight 과 유사한 기능 제공
- Open Declaration : 정의된 함수로 이동
- Open Call Hierarchy : 함수 구조도 파악용이
- 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
- STM32 Embedded Software
- STM32Cube Embedded Software
3.2 이외 Example
- 기본설명과 예제를 제공
http://www.jkelec.co.kr/img/lecture/cortex_app/cortex_app_3.html
- 다양한 Example을 제공을 해줘서 참고하기가 좋았다.
- Main을 찾지못했고, 그냥 추후 Peripheral이 없을 경우만 봐야할 것 같다.
- STM에서 제공했다고 하는데, 예제가 쉽고 간결하다.
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 포기했음, 가입귀찮음.


댓글 없음 :
댓글 쓰기