주의사항 : 본 글의 이클립스 관련.
본 글이 첫 작성된 시점은 2014년 8월 14일 이며, 그 당시엔 이클립스에서 STM32 개발환경 구축하기도 하였기에 이클립스 포팅예를 보이고 있다. 현재(2019년 11월)는 무료 활용가능한 SW4STM32 (Software Workbench for STM32) 가 배포되고 있고 이것 역시 이클립스 기반한 것에 STM32 개발환경이 완전히 셋팅된 패키지가 배포되므로 본글의 이클립스 대신 SW4STM32 활용 적극 추천.
SW4STM32 설치정보
개요
1. 본 글은 TI사의 SimpleLink Driver를 STM32F(이클립스 GCC ARM)에 포팅하는 방법 정리 문서.
2. SimpleLink 를 STM32F으로 포팅하는 목적은 CC3100 을 STM32F 에서 제어하기 위함이다.
3. CC3100 과 STM32F의 통신수단은 SPI를 이용한다.
4. 본 포팅과정은 http://software-dl.ti.com/ecs/cc31xx/APIs/public/cc31xx_simplelink/latest/html/porting.html 의 STM32에서의 실전구현하는 것이나, 자료가 완전하지 않다. 본 글은 포팅을 위한 완전한 정보가 추가되어 정리된다.
5. 본 글에서 예제로 보이는 STM32F프로젝트는 이클립스에서 생성된 D1F86
본 글은 상기 4번 글에서 설명하는 단계별 과정을 그대로 진행하면서, 특별히 주의할 사항들 및 위 주소에서 설명하지 않고 있는 부분들까지 필요하다면 상세히 정리해둔다. 위 4번 글에서의 설명은 빈약하다. 시작점에 있는 SimpleLink 파일들에 대해서는 전혀 설명도 하지 않고 있다. 그러나, 하기 설명은 포팅위한 모든정보가 정리된 완전한 상태다.
상세
1. 포팅대상 SimpleLink 파일들 확보
TI사에서는 SimpleLink 관련 파일만을 별도 배포하지 않고 있다. CC3100 SDK 를 설치하면 simplelink 폴더와 그아래 파일들이 있다. 이것을 이용하면된다. CC3100 SDK 설치법은 https://igotit.tistory.com/295 의 "CC3100 전용 준비사항" 에 있다. CC3100 SDK 설치폴더 속에 우리가 포팅할 파일들이 있는 곳 simplelink 아래 그림
2. simplelink 파일들 STM32 프로젝트에 포함시키기
위 simplelink 폴더를 모두 복사해서 STM32F4 프로젝트에 포함시켜야 한다. 이를 위해 D1F86 프로젝트에서 Source Folder simplelink 를 새로 생성하고, 아래 2개 그림.
위 대화상자에서 Finish 버튼 클릭하면 프로젝트내에서 simplelink 폴더가 생성되고 프로젝트 폴더내에서도 simplelink 폴더가 만들어진다. 탐색기에서 이 폴더속에 CC3100SDK -> simplelink 폴더속에 있는것을 모두 복사한다. 이클립스 Project Explorer 에서 우마우스 클릭후 refrash 클릭하면 복사한것들이 보이며, 아래 상태로 된다. 달성된것 : simplelink 파일들이 우리 프로젝트에서 빌드 가능한 상태가 된것.
3. 이클립스에서 빌드하면서 오류해결
- 특별한 문법상의 오류등은 없고 헤더파일 simplelink.h 없다는 에러와 user.h 없다는 오류 정도다.
- simplelink.h 못찾는 오류 . 이 파일은 simplelink->source 속에 있으며 이를 우리 프로젝트에서 참조할 수 있게 경로 추가한다. 방법 : 프로젝트 Properties 창에서 -> 왼쪽트리뷰의 C/C++ Build -> Setting 클릭 오른쪽 화면 탭에서 -> Cross ARM C Complier -> Include 선택하여 simplelink/include 폴더를 추가한다. 선택된 결과화면은 아래와 같다.
user.h 파일 조치법.
user.h 파일은 simplelink 에서 기본제공되는 것 아니며, 사용자의 개발환경에서 생성해서 user.h 에서 정의되는 파라메타 값들을 자신의 개발환경에 맞게 설정처리 해야한다.
이에 대한 상세한 설명을 다루고 있는 TI 제공자료가 http://software-dl.ti.com/ecs/cc31xx/APIs/public/cc31xx_simplelink/latest/html/porting.html 이며 user.h 를 우리가 어떻게 처리해야할지 방향을 제시하는 완전한 설명이라 할 수 있다. 따라서 본 글의 user.h 조치 설명은 위 사이트에서 제공하는 지시사항대로 따라하면서 정리된다.
user.h 파일역할이해. - simplelink를 임의의 MCU에서 활용하기 위하여 상기의 소스코드를 프로젝트에 포함시키는 것만으로는 완전하지 않다. 우리의 개발환경에 맞게 설정을 해줘야 하는데, 이를 user.h 에 몰아둔것이다. 따라서, 우리는 이 파일속의 값들을 수정하는것으로 임의의 MCU 개발환경에서 simplelink 가 정상 동작하게 한다.
user.h 조치1. user.h 생성하고, CC3100SDK 샘플프로젝트에서 user.h내용 복사해오기.
우리 프로젝트의 simplelink 폴더에 user.h 를 생성하자,
비어있는 user.h 파일내의 값들은 CC3100 SDK에서 같이 제공되고 있는 소스코드 중에서 MSP430F5529lp 의 user.h를 복사해온다.
이것은 non-os 환경의 설정이 되어있는것이다. 경로는 cc3100sdk 설치 경로 ti-< CC3100SDK->cc3100-sdk->platform->msp430f5259lp 에 있는 user.h 의 내용을 우리의 user.h에 복사해온다.
user.h 조치2. user.h 인클루드 부분 수정
결론적으로 user.h 의 include 부분 아래처럼 수정된다.
사유
- 앞에서 복사해온 user.h의 내용은 msp430 용도로 만들어진 것이라 #inlcude , #include 라는 것이 있는데 우리는 이것 필요없다.
- user.h에서 조건분지 하여, spi.h, uart.h 를 인클루드 시키고 있는데, 이것은 CC3100 과 통신수단을 spi 로 한 경우엔 spi.h 필수 포함시켜야하고, uart 로 한 경우엔 uart.h 가 필수포함되어야 한다. 우리는 spi 를 사용할 것이므로 spi.h 만 절한 조치를 취하면된다.
한편, 파일명은 spi.h, spi.c 일 필요없다.우리의 프로젝트내에서 cc3100 과 spi 통신하기 위하여 만들어둔 cc3100spi.h와 cc3100spi.c 를 include 시킨다.
user.h 조치3. cc3100spi.h 와 cc3100spi.c 에서 필수구현해야는 spi통신관련 함수선언,정의 추가.
simplelink 에서는 필수 요구되는 spi통신함수들을 cc3100spi.h 와 cc3100spi.c 에 구현한다. 일일이 코딩할 필요는 없다. cc3100sdk 에서 같이 배포된 예제코드 중 cc3100sdk 설치 경로 ti-< CC3100SDK->cc3100-sdk->platform->msp430f5259lp 의 spi.h, spi.c를 이용한다.
spi.h에 선언된 함수들은 그대로 복사해서 xx3100spi,h에 복사하면되고, cc3100spi.c 에는 함수정의는 동일하게 하고 각 함수의 구현은 STM32F4에 적합하게 직접 코딩하면된다. 현재 포팅목적에서는 각 함수내부의 구체적인 코딩은 없어도 된다.
이해-simpilnk 체계내에서 spi.h 의 역할
simplelink 내에서 CC3100 과 통신하는 부분은 군데 군데 있다. 예로 device.c 소스를 보면 sl_IfRead 라는 마크로가 있으며 기능은 cc3100 과 SPI통신으로 데이터를 읽어오는 처리를 하는 곳이다. 한편,sl_IfRead의 정의는 user.h에 있으며, #define sl_IfRead spi_Read 로 되어있다. spi_Read 는 spi.h 에서 선언되어있어야 하며, spi.c 에서는 spi_Read 가 정의되어 있다.
spi.c/spi.h 관련 코딩시 지켜야할 규칙.
즉, spi.h와 spi.c 는 CC3100 과 SPI통신하는 함수가 제공되어야 하며, 이는 사용되는 MCU에 따라 각 함수내부의 구현은 달라져도 되나 입출력규격은 반드시 지켜져야한다. spi.h 에서 선언되어있는 함수들의 형식을 그대로 유지하면서 구현되면된다.
필수 함수구현은 아래박스에 있는것들이다. 함수는 4개가 전부며 각 함수의 기능은 spi 열기, 닫기, 읽기, 쓰기 이다.
Fd_t 로 변수형정의가 되어있는 것은 unsigned int 인데, 굳이 이런 자료형을 정의한 이유는 컴파일러 종속성을 피하기 위한 조치일뿐이다. 결국 자료형은 unsigned int 이면 된다. 우리의 이클립스에서의 컴파일러인 GCC ARM Complier 에서의 해당변수형으로 변경해도 되나, 그럴필요없다. simplelink 체계에서 제공된 초기 상태 그냥 두는게 제일 안전하다.
typedef unsigned int Fd_t;
Fd_t spi_Open(char *ifName, unsigned long flags);
int spi_Close(Fd_t fd);
int spi_Read(Fd_t fd, unsigned char *pBuff, int len);
int spi_Write(Fd_t fd, unsigned char *pBuff, int len);
위 함수들 설명.
Fd_t spi_Open(char *ifName, unsigned long flags);
기능 : spi 포트를 open 한다.
인자
- char *ifName : OS 환경에서 필요하다. OS환경아닐때는 NULL전달되면됨.
- unsigned long flags : 옵션플래그.
반환값
spi열기 성공일때는 음수아닌 정수값(file descriptor 를 의미하는)을 반환한다. 성공아닐때는 -1반환.
int spi_Close(Fd_t fd);
기능 : spi 포트 닫기한다.
인자.
- Fd_t fd : 열려있는 SPI의 file descriptor.
반환값.
성공이면 0, 실패시 -1.
int spi_Read(Fd_t fd, unsigned char *pBuff, int len);
기능 : SPI로부터 len byte 만큼 읽어서 pBuffer 에 데이터 받는다.
인자.
- Fd_t fd : SPI 의 file descriptor.
- unsigned char *pBuff : 버퍼 포인트.
- int len : SPI 로부터 읽어들일 바이트 사이즈.
반환값.
성공이면0, 실패면 -1.
int spi_Write(Fd_t fd, unsigned char *pBuff, int len);
기능 : SPI에 len pBuf 를 len byte 만큼 기록한다.
인자.
- Fd_t fd : SPI 의 file descriptor.
- unsigned char *pBuff : 버퍼 포인트. 기록할.
- int len : SPI 로부터 읽어들일 바이트 사이즈.
반환값.
성공이면0, 실패면 -1.
usert.h 조치4. user.h 에 사용자정의자료형 P_EVENT_HANDLER 만들기.
CC3100SDK 샘플코드에서의 user.h 에는 아래와 같은 사용자 정의 자료형이 있다.
typedef P_EVENT_HANDLER SL_P_EVENT_HANDLER;
이 자료형의 선언은 샘플프로젝트에서는 board.h (<- msp430f5529 launchpad configuration 관련이다.) 에 있고 아래와 같다.
typedef void (*P_EVENT_HANDLER)(void* pValue);
우리는 위 사용자정의자료형을 user.h 에 복사해온다. 즉, 우리의 user.h 는 아래와 같다.
typedef void (*P_EVENT_HANDLER)(void* pValue); // <-- 이거 추가함. 샘플프로젝트의 board.h에서 가져옴. typedef P_EVENT_HANDLER SL_P_EVENT_HANDLER; |
simplelink 코드 내에서 SL_P_EVENT_HANDLER 가 사용되고 있는 곳은 device.c 의 sl_Start 함수내에서 아래와 같이 사용되고 있다.
sl_IfRegIntHdlr((SL_P_EVENT_HANDLER)_SlDrvRxIrqHandler, NULL);
대충 짐작되는것은 simplelink에서 이벤트 발생시 호출될 callback함수로 보인다.
일단, 위 단계4까지 처리한 상태에서 빌드해보면 오류없이 성공적인 컴파일이 가능하다. 즉, 문법적인 오류는 없다.
위 단계까지의 컴파일 오류없는 상태 달성만 해도 포팅과정의 90%이상은 달성 상태다.
이후, STM32F 프로젝트에서 세부 코드 구현대상은 크게 2가지이다. spi 4개의 함수들 구현 과 이벤트핸들러 오류없이 작동되게 하는것. spi 4개 함수는 앞에서 박스글에 정리해둔것처럼 처리하면되며 이는 루틴한 코딩과정이다. 반면 이벤트핸들러 처리 부분은 추가의 정보 가 더 필요하며, 본 글에서 마저 정리해두기로 한다. 그외 cc3100 구동하는 함수 호출및 이후 처리과정에서 발생하는 문제들은 통상적인 펌웨어 코딩과정 중에 발생하는 일반적인 문제들이므로 본 글에서는 다루지 않는다.
이벤트 핸들러 처리방법
http://software-dl.ti.com/ecs/cc31xx/APIs/public/cc31xx_simplelink/latest/html/porting.html 의 step7 에서 설명하고 있듯이,
simplelink 는 다양한 상황에서 비동기 이벤트를 발생하며, 우리 코드내에서 이들 이벤트를 처리하는 핸들러 루틴을 만들어둬야한다.
그런데 위 설명에서는 "이벤트 핸들러 만들어야 한다."는 것만 말하고 있고, "이벤트 핸들러 만드는 방법"에 대한 설명은 없다. 샘플프로젝트에서 제공된 것을 보고 분석해서 파악해서 알아서 만들어라는 말이다.
우리가 분석할 예제 프로젝트는 cc3100sdk 에서 제공된것중 MSP430F5529LP용 tcp_socket 이라는것을 이용하기로 한다.
우리가 준비해야할 이벤트핸들러는 총 5개가 있으며, user.h 의 하단에 아래처럼 정의된것을 볼 수 있다. 주석에 있는 설명문을 보면 사용하지 않을것은 주석처리하라고 되어있다.
#define sl_GeneralEvtHdlr SimpleLinkGeneralEventHandler #define sl_WlanEvtHdlr SimpleLinkWlanEventHandler #define sl_NetAppEvtHdlr SimpleLinkNetAppEventHandler #define sl_HttpServerCallback SimpleLinkHttpServerCallback #define sl_SockEvtHdlr SimpleLinkSockEventHandler
|
위 정의문의 sl_ 로 시작하는 것들이 simplelink 내에서 사용되고 있는 것들이다. 각 define문의 뒷부분에 있는 함수명으로 이벤트핸들러들을 코드 추가해야한다. 사용자가 직접 코딩해야한다.
예제프로젝트 중 MSP430F5529LP용 tcp_socket 프로젝트 소스를 보면 이벤드핸들러 함수들이 모두 main.c에 정의되어있고, 게 중에 SimpleLinkWlanEventHandler 만을 보이면 아래와 같다. 전달된 인자를 보고 이것이 wlan 연결끊김인지 연결수립인지에따라 처리하는 사항들이 있다.
\param[in] pWlanEvent is the event passed to the handler \return None \note \warning /* case SL_WLAN_DISCONNECT_EVENT: CLR_STATUS_BIT(g_Status, STATUS_BIT_CONNECTION); pEventData = &pWlanEvent->EventData.STAandP2PModeDisconnected; /* If the user has initiated 'Disconnect' request, 'reason_code' is default: |
이와 같은 이벤트처리부 코드는 각 이벤트발생의 의미에 따라 적절한 처리수행하는 코드를 추가해야한다.
나머지 이벤트 핸들러에 대한 코드도 마찬가지다. 이들 이벤트의 의미등은 WiFi 관련지식과 Socket 등의 지식이 필요하며, 세밀한 구현작업 진행하면서 완성시켜야 한다.
이 부분은 포팅과는 관계없는 것이며, 이벤트핸들러 처리법 까지 방향이 제시된것을 마지막으로 본건 "포팅방법" 설명 완료되었다.
끝. 2014년 8월 16일. SimpleLink 포팅하기
연관
STM32 <-> CC3100 SPI 통신 특성 확인.
https://igotit.tistory.com/654
첫 등록 : 2014년 8월 14일
최종 수정 : 2019년 11월 11일
단축 주소 : https://igotit.tistory.com/2377
'임베디드.일렉트로닉스 > STM32' 카테고리의 다른 글
STM32L4R/S (STM32L4+ 계열) . 부트로더 (0) | 2019.12.07 |
---|---|
STM32. SPI 읽기 쓰기. 동작특성. (0) | 2019.11.11 |
STM32L4R5VI. STM32L4+. LQFP100. (0) | 2019.10.14 |
STM32L4R5VG. STM32L4+. LQFP100. 하자 있음 주의!!! (0) | 2019.10.14 |
STM32. Bootloader (0) | 2019.10.13 |
댓글