비트필드 사용시


SCI 인터럽트 처리 루틴

easyDSP MCU SCI통신을 사용하여 PC MCU간 통신을 구현합니다 . 따라서 사용자의 MCU 프로그램은 easyDSP 가 제공하는 SCI인터럽트 처리 루틴 (Interrupt Service Routine,이하 ISR)을 포함하여야 합니다 .
관련된 파일은 아래와 같습니다 .
주의) F2838x CM은 비트필드 기반 소스를 사용할 수 없으며, DriverLib 기반 소스를 사용하셔야 합니다 .

 C2000 시리즈  ISR 프로그램 파일
F28001x
F28002x
F28003x

F28004x
F2807x
F2837x
F2838xS CPU1
F2838xD CPU1/CPU2
F28P55x
F28P65x
 

easy28x_bitfield_v11.2.c
easy28x_bitfield_v11.2.h

C2834x
F2823x/2833x
F2802x/2802x0
F2803x
F2805x
F2806x
F280x
F281x
F28044
 

easy28x_gen2_bitfield_v9.4.c
easy28x_gen2_bitfield_v9.4.h


ISR 프로그램 파일내의 대표적인 함수 이름 및 기능은 하기와 같습니다 .
easyDSP_SCI_Init(void) : SCI
통신 채널 초기화
easy_RXINT_ISR(void) : RX_INT
ISR
easy_TXINT_ISR(void) : TX_INT
ISR
easyDSP_SPI_Flashrom_Init(void) : C2834x  
외부 SPI 플래쉬 부팅
easyDSP_Boot_Sync(void) : 2837xD/2838xS/2838xD
멀티코어의 부팅 및 동기화


사용자의 보드 환경에 맞춰서, 헤더 파일을 수정하셔야 함에 유의하세요 .
예를 들어 아래 선택은 F2807x 사용, CPU 클럭 150MHz, LSP 클럭 = CPU클럭/4, easyDSP 통신 bps = 115200으로 선택한 예제입니다.

#define F28P65xS                   0
#define F28P65xD_CPU1           0
#define F28P65xD_CPU1_CPU2    0
#define F28002x                    0
#define F28003x                    0
#define F28004x                    0
#define F2807x                     0
#define F2837xS                    0
#define F2837xD_CPU1            0
#define F2837xD_CPU1_CPU2     0
#define F2838xS_CPU1                 0
#define F2838xS_CPU1_CM            0
#define F2838xD_CPU1                 0
#define F2838xD_CPU1_CPU2         0
#define F2838xD_CPU1_CM           0
#define F2838xD_CPU1_CPU2_CM    1
#define CPU_CLK                   150000000L
#define LSP_CLK                    (CPU_CLK/4)
#define BAUDRATE                115200L

주의 : MotorWare™ 에서는 클럭 분주를 하지 않게 되어 있습니다. 이 경우, LSP_CLK CPU_CLK과 동일하게 설정하셔야 합니다 .
참고로 easyDSP가 통신에 사용하는 모든 변수의 이름은 ezDSP_*와 같은 식의 첨자가 추가되어 있습니다. easyDSP 사용중 ezDSP_ 로 시작되는 변수 값은 변경하지 마세요
.

인터럽트 네스팅 (Interrupt Nesting) 처리

C2000 MCU 에서 하나의 ISR(인터럽트 서비스 루틴)이 수행될 때기본적으로는 다른 ISR이 수행될 수 없게 되어 있습니다. , 아무런 조치 없이는, easyDSP ISR이 수행될 때, 다른 중요한 사용자의 인터럽트가 수행될 수 없음을 의미합니다. 대부분의 경우 사용자는 리얼타임 제어를 유지하기 위해서, easyDSP ISR 수행여부에 상관없이, easyDSP보다 상위 개념의 인터럽트를 수행시켜야 합니다 .
easyDSP ISR
소스 코드에서는 INT_NESTING_START, INT_NESTING_END를 기본 제공하며, easyDSP ISR의 인터럽트 순위는 최하위로 설정됩니다.

인터럽트간 다양한 우선순위를 구현하기 위해서는 TI에서 예제 파일 (SW Prioritized ISR)를 사용하십시요. 이에 대해서는 하기 링크를 참조하셔서 사용자가 직접 코딩하시기 바랍니다. , 사용자가 직접, easyDSP ISR easy_RXINT_ISR ()의 첫단/마지막단 해당 부분을 수정하셔야 합니다 .
http://processors.wiki.ti.com/index.php/Interrupt_Nesting_on_C28x

 플래쉬롬 동작시 easyDSP ISR 의 빠른 동작을 위해

프로그램이 플래쉬롬에서 작동하는 경우, easyDSP ISR 함수의 빠른 동작을 위해서는 해당 코드를 램에서 동작시키는 것이 좋습니다. 이를 위해 헤더 파일에서 #progma 를 제공합니다. ramfuncs 또는.TI.ramfunc 섹션을 위한 제반 코딩은 TI 자료를 참조하십시오 .

easyDSP
제공 h 파일 에 하기 선언

#if (F2823x || F2833x || C2834x)
#pragma CODE_SECTION(easy_RXINT_ISR, "ramfuncs");
#else
#pragma CODE_SECTION(easy_RXINT_ISR, ".TI.ramfunc");
#endif

주의사항 1) 최신 DSP (ex, 2837x, 2807x, 28004x) 의 경우, 최신 TI support library version에서는  ramfuncs이 아니라 .TI.ramfunc을 사용하고 있습니다. F28x_SysCtrl.c 파일 서두 부분을 보시면 어떤 것을 사용하는 지 파악 가능하니 이를 참조하여 주세요 .
주의사항 2) 특히 작성하신 프로그램이 "플래쉬에서 동작되는 것이면서 플래쉬를 프로그래밍"하는 것이라면 easyDSP ISR를 반드시 램에서 동작시켜야 합니다. TI에서 제공되는 각종 flash API 함수가 수행되는 동안에는 flash가 기본적으로 동작하지 않기 때문에 easyDSP ISR 코드가 flash에서 수행되게 되면 오동작을 하는 것입니다 .
 

단일 코어 프로그래밍  

MCU 프로그램 초기부분에 MCU의 인터럽트(특히 시리얼 인터럽트 부분) easyDSP와 통신할 수 있도록 설정해주어야 합니다. 아래에 사용 예제가 있습니다. 우선 사용자가 원하는 인터럽트를 설정합니다. 그 후에 easyDSP_SCI_Init()를 호출합니다 .
프로그램 설치 폴더의 source/C2000/BitField 폴더의 main_gen2.c 또는 main_gen3.c 파일을 참조하십시요 .
easyDSP_SCI_Init()
에서는
1) SCI
관련 레지스터를 easyDSP용도에 맞게 설정

2) SCI 인터럽트를 사용할 수 있도록 관련 레지스터를 설정합니다


#include " easy28x_bitfield_v11.2.h" 또는....
#include "
easy28x_gen2_bitfield_v9.4.h"
main(void) {


    //
사용자의 인터럽트 관련 설정 이후, while(1) 이전 호출
    easyDSP_SCI_Init();

    while(1) {
    }
}


C2834x 프로그래밍 : 외부 flash rom 설정

2834x의 경우에는 내부 플래쉬 롬이 없으므로, 외부 SPI용 플래쉬 롬을 지원합니다. 현재 지원되는 플래쉬 롬은, ATMEL사의 AT25DF021(2M bit), AT25DF041(4M bit), AT26DF081(8M bit), AT25DF321(32M bit) Numonyx사의 M25P20(2M bit), M25P40(4M bit), M25P80(8M bit), M25P16(16M bit), M25P32(32M bit)입니다. 이를 위한 DSP SPI-A 포트 설정이 필요합니다 .
프로그램 설치 폴더의 source/C2000/BitField 폴더의 main_gen2.c 파일을 참조하십시요 .

#include " easy28x_gen2_bitfield_v9.4.h"
main(void) {


    //
사용자의 인터럽트 관련 설정 이후 호출

    easyDSP_SCI_Init();
    //
외부 플래쉬롬 사용을 위한 SPI-A 포트 설정
    easyDSP_SPI_Flashrom_Init();

    while(1) {
    }

}


F2837xD, F28P65xD, F2838xD 멀티코어 프로그래밍

싱글 코어 MCU와 동일하게, CPU1/CPU2 모두에 대해서 헤더 파일을 설정하고 easyDSP_SCI_Init()함수를 호출합니다 .
다른 부분은 CPU2, CM을 부팅시키고 CPU간  동기를 맞추기 위한  easyDSP_Boot_Sync() 함수의 호출 부분입니다.
easyDSP_Boot_Sync()
함수가 호출되면 CPU1 CPU2, CM을 부팅시킵니다. 램 부팅시에는 CPU2, CM이 램부팅되기까지 CPU1은 기다립니다. 플래시 부팅시에는 CPU2, CM에 플래시 부팅 지령을 내린 후 바로 CPU1 프로그램이 후속 진행됩니다 .
easyDSP_Boot_Sync()
함수는 모든 CPU에서  호출되어야 하며, 기타 사항은 프로그램 설치 폴더의 source/C2000/BitField 폴더 안에 main_gen3.c 파일을 참조하십시요 .

#include "easy28x_bitfield_v11.2.h"
main(void) {

    InitSysCtrl();

    // CPU1 프로그램이라면, easyDSP_Boot_Sync() 호출 이전에  
    // CPU2, CM에 필요한 공유 메모리를 할당하는 코딩 삽입   

    // easyDSP_SCI_Init() 이전 호출
    easyDSP_Boot_Sync();

    easyDSP_SCI_Init();

    while(1) {
    }
}