저의 경우는 처음부터 어쩔 수 없이 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 포기했음, 가입귀찮음.
댓글 없음 :
댓글 쓰기