본문 바로가기
DSP, MCU/TMS320F2838x (C28x)

CCS, Code Composer Studio ] 재사용 용이한 Portable Project 만들기 (device_support 와 driverlib 모두 사용)

by eteo 2022. 11. 27.

 

STM32CubeIDE 와 달리 CCS를 사용해보니 프로젝트 하나 생성해 쓰는 것도 쉽지가 않다. 예제 프로젝트에서 변경과 추가를 시작하는게 쉽기는 하지만 그렇게만 하다보면 프로젝트가 어떻게 구성되어 있는지도 모르고 사용을 하게 된다.

 

다음의 세가지로 나누어 설명할텐데 개인적으로 초보인 입장에서 라이브러리를 포함시키고 폴더나 파일을 링크해서 사용하는 것보다는 프로젝트 안에 복사해서 쓰는 것을 선호한다. (나중에 안쓰는 파일은 삭제해 코드크기를 줄이면 된다.)

 

1. driverlib 사용 프로젝트

2. device_support 사용 프로젝트

3. driverlib 와 device_support 모두 사용하는 프로젝트

 

 

공통과정

 

1. File - New - CCS Project

 

 

 

2. Target에서 MCU를 검색해서 선택한다.

 

3. Connection에서 Debug Probe 종류를 선택하고 Verify 를 눌러 연결상태를 확인할 수 있다.

 

4. TMS320F28388D 는 CM(Connectivity Manager)로 ARM core 도 달려있으므로 코어 선택 탭이 2개가 있는데 C28XX를 선택해 준다.

 

5. Use default location 을 해제한 뒤 원하는 위치에 프로젝트 폴더를 만들고 폴더와 동일 이름으로 프로젝트 이름을 정한다.

※ Workspace 폴더는 ccs 설치시 디폴트로 선택된 경로를 쓰지 말고 따로 만들어 사용하는게 편하다. TMS320F28388D 칩은 멀티코어를 사용하므로 같은 Workspace에 각각 코어에 대한 프로젝트들 import할 필요가 있다. 

그리고 Workspace로 지정하면 폴더안에 .jxbrowser.userdata, .metadata, RemoteSystemsTempFiles, dvt 등 폴더가 많이 생겨 지저분해 지니 Workspace 는 따로 두고 코어별 프로젝트 폴더들은 다른 위치에서 모아 관리하며 import 해 사용하는 것도 좋은 방법이다

 

6. Empty Project (with main.c) 선택 후 Finish

 

 

 

 

 

공통과정 끝

 

 

 

1. driverlib 사용 프로젝트

 

1. 프로젝트 폴더를 오른쪽 클릭하여 New - Folder

 

 

 

2. common 폴더를 만든다. 같은 과정으로 common 폴더 안에 include 와 source 파일을 만든다.

 

 

 

3. C:\ti\c2000\C2000Ware_4_02_00_00\device_support\f2838x\common\include 경로에서 device.h, driverlib.h 파일을 복사해 프로젝트 common\include 폴더 안에 paste 한다.

 

4. C:\ti\c2000\C2000Ware_4_02_00_00\device_support\f2838x\common\source 경로에서 f2838x_codestartbranch.asm, device.c 파일을 복사해 프로젝트 common\source 폴더 안에 paste 한다.

 

4. C:\ti\c2000\C2000Ware_4_02_00_00\device_support\f2838x\common\cmd 경로에서 2838x_RAM_lnk_cpu1.cmd 파일을 복사해 프로젝트 폴더 안에 paste 한다. 그럼 프로젝트 폴더 내의 cmd(링커커맨드)파일이 두 개가 되는데 램빌드일 땐 2838x_flash_lnk_cpu1.cmd 파일을 오른쪽 클릭해 Exclude from Build 를 클릭하고, 플래시 빌드일 땐 2838x_RAM_lnk_cpu1.cmd 을 Exclude 한다.

 

5. C:\ti\c2000\C2000Ware_4_02_00_00\driverlib\f2838x 경로에서 driverlib 폴더를 통째로 복사해 common 폴더 안에 paste 한다. 그리고 driverlib 폴더 안의 ccs 폴더는 삭제한다.

 

 

 

 

6. 프로젝트 오른쪽 클릭 Properties

 

 

 

 

7. 컴파일러에게 헤더파일이 있는 곳의 위치를 알려주어야 한다. CCS Build - C2000 Compiler - Include Options 에서 + 버튼을 누르고 Directory: 에 Workspace...를 누른다.

 

 

 

8. 프로젝트 내의 common\include 와 common\driverlib path를 선택해 준다.

 

 

 

 

9. Compiler 밑의 Predefined Symbols 에서 + 버튼을 눌러 CPU1을 추가해준다.

빌드 설정에 따라 _FLASH 또는 _RAM 문구를 추가해 줄 수도 있다.

 

 

 

 

테스트

 

내가 사용하는 컨트롤 카드는 GPIO31이 LED에 연결되어 있어 아래 코드로 테스트 했을 때 정상 작동하면 driverlib를 사용해서 프로젝트 작성을 할 준비가 된 것이다.

 

참고.

컨트롤카드의 회로도 경로 : C:\ti\c2000\C2000Ware_4_02_00_00\boards\controlCARDs\TMDSCNCD28388D\Rev.B

 

#include "driverlib.h"
#include "device.h"
//
// Main
//
void main(void)
{
    //
    // Initializes system control, device clock, and peripherals
    //
    Device_init();

    //
    // Initializes PIE and clear PIE registers. Disables CPU interrupts.
    // and clear all CPU interrupt flags.
    //
    Interrupt_initModule();

    //
    // Initialize the PIE vector table with pointers to the shell interrupt
    // Service Routines (ISR).
    //
    Interrupt_initVectorTable();

    //
    // Board Initialization
    //
//    Board_init();
    EALLOW;
    // GPIO0 -> myGPIOOutput0 Pinmux
    GPIO_setPinConfig(GPIO_31_GPIO31);
    GPIO_setPadConfig(31, GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode(31, GPIO_QUAL_SYNC);
    GPIO_setDirectionMode(31, GPIO_DIR_MODE_OUT);
    GPIO_setMasterCore(31, GPIO_CORE_CPU1);
    EDIS;


    //
    // Enables CPU interrupts
    //
    Interrupt_enableMaster();

    //
    // Loop.
    //
    for(;;)
    {
        GPIO_togglePin(31);
        DEVICE_DELAY_US(1000000);
    }
}

 

 

 

+ 추가로 GUI 환경에서 driverlib 를 사용하는 코드를 생성할 수 있는  syscfg 파일도 추가해보자.

 

10. 프로젝트 오른쪽 클릭 - New - File

 

 

11. 프로젝트이름.syscfg 파일을 만들고 더블클릭 한다.

 

 

 

 

12. Board를 선택하고 START를 누른다.

선택한 Board는 나중에 툴에서 switch 할 수 있다.

 

Board 설정이 더 번거로운 것 같아 None으로 바꿨다.

 

그리고 테스트를 위해 GPIO를 아래와 같이 설정해준다.

 

 

 

13. 프로젝트 우클릭 - Properties, CCS General 을 누르고 Products 에서 Add를 눌러 C2000Ware 버전을 선택한다.

 

 

14. 그리고 Build 아래 SysConfig 탭이 나타났는데 .syscfg 파일이 있는 예제를 보고 참고해서 똑같이 설정해 주었다.

 

 

 

 

이렇게 하고 빌드를 누르면 빌드 결과물 폴더 안의 syscfg 폴더가 있고 그 안의 board.c, board.h 파일이 생성된다.

 

 

 

테스트

 

board.h 를 include 하고 main 함수 안 초기화 부분에 Board_init() 함수를 위치시킨다. 

 

#include "driverlib.h"
#include "device.h"
#include "board.h"
//
// Main
//
void main(void)
{
    //
    // Initializes system control, device clock, and peripherals
    //
    Device_init();

    //
    // Initializes PIE and clear PIE registers. Disables CPU interrupts.
    // and clear all CPU interrupt flags.
    //
    Interrupt_initModule();

    //
    // Initialize the PIE vector table with pointers to the shell interrupt
    // Service Routines (ISR).
    //
    Interrupt_initVectorTable();

    //
    // Board Initialization
    //
    Board_init();
//    EALLOW;
//    // GPIO0 -> myGPIOOutput0 Pinmux
//    GPIO_setPinConfig(GPIO_31_GPIO31);
//    GPIO_setPadConfig(31, GPIO_PIN_TYPE_STD);
//    GPIO_setQualificationMode(31, GPIO_QUAL_SYNC);
//    GPIO_setDirectionMode(31, GPIO_DIR_MODE_OUT);
//    GPIO_setMasterCore(31, GPIO_CORE_CPU1);
//    EDIS;


    //
    // Enables CPU interrupts
    //
    Interrupt_enableMaster();

    //
    // Loop.
    //
    for(;;)
    {
        GPIO_togglePin(myLED);
        DEVICE_DELAY_US(1000000);
    }
}

 

+ 다만 SysConfig 툴의 경우 아직 불안정한 부분이 많아서 프로젝트에 포함시키기 보다 코드를 생성해서 참고용으로 보는 정도가 적당할 것 같다.

 

 

 

 

2. device_support 사용 프로젝트

 

1. 프로젝트 안에 common 폴더를 만들고 common 폴더 안에 include 와 source 폴더를 만든다.

 

2. C:\ti\c2000\C2000Ware_4_02_00_00\device_support\f2838x\common\include 경로에서 "cm.h, device.h, driverlib.h, driverlib_cm.h" 파일을 제외한 나머지 파일을 전부 복사해 프로젝트의 common\include 폴더 안에 paste 한다.

 

3. C:\ti\c2000\C2000Ware_4_02_00_00\device_support\f2838x\common\source 경로에서 f2838x_ 로 시작하는 모든 파일을 복사해 프로젝트의 common\source 폴더 안에 paste 한다. 단, f2838x_swprioritizedpievect.c 파일은 우클릭하여 Exclude from Build 한다.

 

4. C:\ti\c2000\C2000Ware_4_02_00_00\device_support\f2838x\common\cmd 경로에서 2838x_RAM_lnk_cpu1.cmd 파일을 복사해 프로젝트 폴더 안에 paste 한다. 프로젝트에서 램빌드일 땐 2838x_flash_lnk_cpu1.cmd 파일을 오른쪽 클릭해 Exclude from Build 를 클릭하고, 플래시 빌드일 땐 2838x_RAM_lnk_cpu1.cmd 을 Exclude 한다.

 

5. C:\ti\c2000\C2000Ware_4_02_00_00\device_support\f2838x\headers\include 경로에서 모든 파일을 복사해 프로젝트의 common\include 폴더 안에 paste 한다.

 

6. C:\ti\c2000\C2000Ware_4_02_00_00\device_support\f2838x\headers\source 경로에서 f2838x_globalvariabledefs.c 파일을 복사해 프로젝트의 common\source 폴더 안에 paste 한다.

 

7. C:\ti\c2000\C2000Ware_4_02_00_00\device_support\f2838x\headers\cmd 경로에서 f2838x_headers_nonBIOS_cpu1.cmd 파일을 복사해 프로젝트의 common\source 폴더 안에 paste 한다.

 

 

8. 프로젝트 우클릭 Properties, Build - Compiler - Include Option 에서 프로젝트 안의 common\include 경로를 추가한다.

 

9. Predefined Symbols 에 CPU1을 추가한다.

 

 

테스트

 

1E6은 10^6 으로 1초간격으로 LED가 토글되게 된다.

 

#include "f28x_project.h"

int main(void)
{
    InitSysCtrl();

    EALLOW;
    GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;

    while (1)
    {
        //delay for 1 second
        DELAY_US(1E6);
        //toggle the light
        EALLOW;
        GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1;

    }
}

 

 

 

3. driverlib 와 device_support 모두 사용하는 프로젝트

 

그냥 1번과 2번의 과정을 합치고 Predefined symbol 에 _DUAL_HEADERS 만 추가해주면 된다.

 

 

만약 2번 프로젝트에서 driverlib도 사용하고 싶다면 common\include 폴더에 device.h, driverlib.h 를 복사해 추가하고 common\source 폴더에 device.c 를 추가한다. 그리고 1번에 추가했던 것처럼 common 폴더 밑에 driverlib 폴더를 추가해 넣고 Properties - Build - Compiler - Include Options 에서 추가한 driverlib 폴더 경로를 추가해준다. 그리고 Predefined symbol 에 _DUAL_HEADERS 를 추가한다.

 

그러면 이제 프로젝트에서 레지스터를 직접 제어하는 device_support API와 driverlib API 를 전부 사용할 수 있다.

 

 

 

이렇게 해봤으면 이제 폴더 상하구조는 본인이 원하는 방식으로해서 구성할 수 있다.

참고로 헤더파일은 Exclude from Build 가 안되니 삭제해야한다.

그리고 빌드 설정은 램/플래시 별로 해주어야 하기 때문에 이 과정을 한번 더 반복해야 한다. 플래시 빌드의 경우 Predefined Symbols 에 _FLASH 문구를 추가해준다.

 

CPU2 프로젝트 같은 경우 Predefined Symbols에 CPU2 문구를 대신 추가하고 cmd 파일도 cpu1이 아니라 cpu2 용으로 교체한다. 또 cpu1만 접근할 수 있는 레지스터를 제어하는 소스코드가 포함된 경우 빌드오류를 낼 수 있으니 Exclude 하는 과정이 필요하다.