XMC7 설정


easyDSP 연결

easyDSP는 CM7 코어만 지원하며, CM0 코어는 지원하지 않습니다.
경우에 따라 하기와 같이 여러 케이스로 easyDSP 연결이 가능합니다.

케이스 1 : 하나의 CM7 코어를 가지는 MCU와 통신하는 경우입니다.
케이스 2 : 두개의 CM7 코어와 통신할 경우 각 코어별로 easyDSP를 연결할 수 있습니다.
             케이스 3, 4와 달리 사용 조건 및 리소스 할당이 필요 없으며, 코어의 성능을 최적화할 수 있기에 추천하는 구성입니다.
케이스 3 : 두개의 CM7 코어와 통신할 경우 두 코어가 데이타캐시를 사용하지 않는다면 하나의 easyDSP를 사용하여 두 코어의 변수를 모니터링할 수 있습니다. 
             easyDSP는 CM7 코어 둘 중 어느 곳에도 연결할 수 있습니다.
케이스 4 : 두개의 CM7 코어와 통신할 경우 두 코어중 하나라도 데이타캐시를 사용한다면 코어간 IPC 통신을 사용하므로써 하나의 easyDSP를 사용할 수 있습니다. 
             easyDSP는 CM7 코어 둘 중 어느 곳에도 연결할 수 있습니다.
             IPC 통신을 위한 리소스가 할당되어야 하며 부가적인 작업으로 인해 상대적으로 모니터링 속도 성능이 저하됩니다.

실질적인 회로 구성은 하기와 같습니다.
먼저 사용자 보드 환경에 맞춰 easyDSP와 MCU 사이 통신에 사용될 UART의 SCB 채널 및 핀을 선정합니다.
만약 easyDSP 제공하는 부트로더 (아래 부분 참조)를 사용하지 않는 경우에는, -BOOT와 -RESET은 연결할 필요가 없습니다.
케이스 2 경우, 두개의 easyDSP가 두개의 SCB에 연결되어야 합니다. 

Device Configurator 설정

easyDSP는 device configurator 기반 생성된 코드를 사용하여 SCB를 설정합니다.
하기에서는 device configurator 5.3기준으로 설명드립니다.
먼저 Peripherals 탭에서 easyDSP를 연결할 SCB를 선택한 후, 이름을 scb_ez1로 변경하고 UART 모드를 선택합니다.
scb_ez1은 단일 CM7 코어를 가지는 MCU에, 또는 두개의 CM7를 가지는 MCU의 CM7_0에 사용됩니다.
아래 화면은 SCB8을 사용하고 RX, TX핀을 각각 P12.0, P12.1을 선택한 경우의 화면입니다.



해당 SCB의 파라미터를 아래와 같이 설정합니다.
보드레이트는 사용자가 적절히 선정합니다. 단, easyDSP 프로젝트 설정값과 동일해야 합니다.
8 bit data, 1 stop bit, no parity bit의 데이타 규격을 사용하며, SCB 핀을 선정합니다.
API 모드는 Low Level를 사용하며, 인터럽트는 RX FIFO not Empty만을 사용합니다.
기타 부분은 하기 그림 참조 바랍니다.

 


Peripheral-Clocks 탭에서 해당 SCB의 클럭을 설정합니다. 앞서 설정된 클럭 연결의 경우 하기를 참조하세요. 보드 레이트 등의 설정에 따라 파라미터 값이 달라질 수 있습니다.
 

Pins탭에서 RX, TX에 할당된 핀을 설정합니다.
먼저 싱글 코어거나 듀얼코어의 CM7_0일 경우 핀 이름을 EZ_RX1, EZ_TX1으로 설정하며, 듀얼코어의 CM7_1일 경우 EZ_RX2, EZ_TX2로 설정합니다.
그리고 Drive Mode를 설정합니다.

 

케이스 2의 경우 CM7_1에 연결할 SCB를 하나 더 선택해야 하며, 이름을 scb_ez2로 설정하고, 나머지 사항은 scb_ez1과 동일하게 설정합니다.
마지막으로 파일을 저장합니다. 
 

easyDSP 제공 헤더 파일 수정

먼저 변수 모니터링을 위해 제공되는 소스파일 (easyXMC7.h, easyXMC7.c)을 사용자 프로젝트에 포함하시기 바랍니다.
만약 easyDSP가 제공하는 부트로더를 사용할 경우, easyXMC7_boot.c 파일도 포함해야 합니다.
해당 파일은 easyDSP 프로그램이 인스톨된 폴더에서 \source\XMC에서 찾을 수 있습니다.
두개의 CM7 코어를 사용하는 프로젝트라면 각각의 CM7 코어 프로젝트에 포함되어야 합니다.
본 소스파일에서
MTB CAT1 PDL 사용하고 있으므로 해당 라이브러리도 프로젝트에 포함되야 합니다.

easyXMC7.h 파일에서 각종 easyDSP 통신용 환경을 설정합니다.
먼저 타켓 MCU를 설정합니다.
타켓 MCU가 두개의 CM7 코어를 가지는 경우에는 각 코어에 easyDSP가 연결되는 것인지, 그리고 IPC가 사용될 것인지 지정합니다. 상세 사항은 아래 기타 부분을 참조하세요.
이후 easyDSP가 사용하는 UART, IPC 인터럽트의 IRQ번호와 순위를 지정합니다.
easyDSP 사용에 필요한 인터럽트에 전용의 IRQ번호를 할당하기를 추천드리며 그 경우 순위는 최하순위를 지정합니다.
해당 IRQ 번호가 easyDSP 외 다른 인터럽트 소스와 겸용된다면, IRQ 순위를 적절히 선정하시기 바랍니다.
IPC를 사용한다면 (케이스 4), IPC pipe 엔드포인트의 IPC 채널및 인터럽트를 지정합니다. 시스템에 의해 사용되는 것과 중복을 피하기 위해 CY_IPC_CHAN_USER, CY_IPC_INTR_USER보다 같거나 큰 값을 사용합니다.
마지막으로 플래시 프로그래밍을 위해 easyDSP가 제공하는 부트로더의 사용 여부를 지정합니다.

easyDSP_init() 함수 호출

먼저 main.c 상단에 easyXMC7.h를 include하고, main 함수에서  각종 초기화가 진행된 이후, 적절한 위치에서 easyDSP_init() 함수를 호출합니다. 이로써, 변수 모니터링이 가능하게 됩니다.
easyDSP 제공 부트로더를 사용하는 경우 main 함수 최앞단에서 easyDSP_boot()를 호출합니다.
두개의 CM7 코어를 사용하는 프로젝트라면 각 코어 프로젝트의 main.c에 동일하게 적용합니다.

 

easyDSP 제공 부트로더

플래시 프로그래밍을 위해 업체가 제공하는 다양한 방법이 있습니다 (예 : JTAG 디비거).
또한 easyDSP는 개발 과정에서 빈번한 프로그램 수정을 간편하게 easyDSP 통신 채널 UART를 이용하여 수행하는 부트로더를 제공합니다.
하지만 이 방식은 여러 제한 사항, 주의 사항이 있으므로, 사용 여부를 잘 판단하시기 바랍니다.
만약 easyDSP 제공 부트로더를 사용하지 않은다면 (즉, easyXMC7.h에서 #define EZ_USE_BOOTLOADER 0으로 설정) 본 챕터는 생략하여 주세요.


제한 및 주의 사항 :

1. 사용자 프로그램 안에 easyDSP가 제공하는 부트로더가 존재하는 구성이므로 MCU 플래시에 easyDSP 소스파일이 이미 프로그래밍되어 있어야 부트로더도 동작할 수 있습니다. 만약 플래시가 전부 지워져 있거나, easyDSP 소스파일이 플래시에 프로그래밍이 되어 있지 않다면, 플래시 프로그래밍이 지원되지 않으며 (즉, 부트로더 진입이 불가하며), 이 경우 디버거를 사용하여 플래시를 프로그래밍해야 합니다.  따라서 처음 한번은 반드시 디버거를 이용한 플래시 프로그래밍이 수행되야 합니다. 
2. 
만약 플래시 프로그래밍 중 오류가 발생하면 (예를 들어 먼저 플래시를 지운 후 프로그래밍에 오류가 발생) 부트로더는 더 이상 플래시내 존재하지 않아 사용이 불가하게 됩니다. 이 경우 앞 서 주의사항 1번처럼 디버거로 플래시 프로그램을 수행해야 합니다.
3. 플래시 억세스시 사용하는 함수 및 변수를 램에 위치시키기 위해, 일정 크기의 램용량을 소모합니다.
4. CM0 코어용 프로그램의 플래시 프로그래밍은 지원하지 않습니다. CM0 코어용 프로그램 변경시 디버거를 사용해서 플래시 프로그래밍해야 합니다. 

사용 준비 사항 : 

1. 상기에서 언급했듯이, easyXMC7.h에서 EZ_USE_BOOTLOADER를 1로 선언하고, easyXMC7_boot.c 파일을 사용자 프로젝트에 포함하고, main 함수의 앞단에서 easyDSP_boot 함수를 호출합니다.
2. 매 컴파일마다 hex 파일 (인텔 형식) 이 생성되어 출력 파일과 동일한 폴더에 동일한 이름으로 위치하도록 IDE를 설정해주세요. Hex 파일은 플래시 프로그래밍할 때 사용됩니다. 
3. 플래시 프로그래밍에 사용되는 함수 및 변수가 램에 위치하도록 소스 파일을 변경해야 합니다.

3.1. cy_flash_srom.h 파일 마지막 부분 함수 선언부에서 Cy_Srom_CallApi(), Cy_Srom_GetResponseType(), Cy_Srom_ConvertRespToStatus() 함수 앞뒤로 CY_SECTION_RAMFUNC_BEGIN, CY_SECTION_RAMFUNC_END를 붙여서 해당 함수가 램에서 실행되도록 합니다.

3.2. cy_flash_srom.c 파일 앞부분 static 함수 선언부에서 Cy_Srom_Get_DataSize() 함수 앞뒤로 CY_SECTION_RAMFUNC_BEGIN, CY_SECTION_RAMFUNC_END를 붙여서 해당 함수가 램에서 실행되도록 합니다.

3.3. cy_ipc_drv.h 파일 중간 부분에서 Cy_IPC_Drv_SendMsg() 함수 앞뒤로 CY_SECTION_RAMFUNC_BEGIN, CY_SECTION_RAMFUNC_END를 붙여서 해당 함수가 램에서 실행되도록 합니다.


3.4. cy_device.h 파일에서 IPC_BASE_PTR 변수의 선언부에서 const를 삭제합니다.

3.5. cy_device.c 파일에서 IPC_BASE_PTR 변수 정의부에서 const를 삭제하여 해당 변수가 램에 위치하게 합니다.

3.6. 상기에서 램에 위치시킨 함수/변수의 실제 주소가 램에 할당되었는지를 map 파일을 통해 확인합니다.

사용 방법 :  플래시 대화상자 사용법은 여기를 참조합니다.

기타

1. 각 케이스별로 easyDSP를 사용법을 종합하면 다음과 같습니다.

Case 1 :

 설정항목

 CM7

 easyDSP 프로젝트 출력 파일 지정
 easyXMC7.h

타켓 MCU 및 IRQ 번호 및 순위 지정
EZ_USE_BOOTLOADER 지정 

 main.c easyDSP_init() 호출

Case 2 :

설정 항목

CM7_0

CM7_1

 easyDSP 프로젝트 CPU1, CPU2 출력 파일 모두 지정
CPU1 체크 박스 선택
CPU1, CPU2 출력 파일 모두 지정
CPU2 체크 박스 선택
 easyXMC7.h

타켓 MCU 및 IRQ 번호 및 순위 지정
EZ_IS_CM7_0_CONNECTED_TO_EASYDSP = 1
EZ_IS_CM7_1_CONNECTED_TO_EASYDSP = 1
EZ_USE_IPC = 0
EZ_USE_BOOTLOADER 지정

좌동 

 main.c easyDSP_init() 호출

좌동 

Case 3 :

 설정항목

 CM7_n (n = 0 또는 1)

 easyDSP 프로젝트 CPU1, CPU2 출력 파일 모두 지정
CPU1, CPU2 체크 박스 모두 선택
 easyXMC7.h

타켓 MCU 및 IRQ 번호 및 순위 지정
easyDSP가 CM7_0에 연결될 경우에는 
    EZ_IS_CM7_0_CONNECTED_TO_EASYDSP = 1
    EZ_IS_CM7_1_CONNECTED_TO_EASYDSP = 0
easyDSP가 CM7_1에 연결될 경우에는 
    EZ_IS_CM7_0_CONNECTED_TO_EASYDSP = 0
    EZ_IS_CM7_1_CONNECTED_TO_EASYDSP = 1
EZ_USE_IPC = 0
EZ_USE_BOOTLOADER 지정

 main.c easyDSP_init() 호출

Case 4 :

 설정 항목

  CM7_n (n = 0 또는 1)

  CM7_m (m = 1 또는 0)

 easyDSP 프로젝트 CPU1, CPU2 출력 파일 모두 지정
CPU1, CPU2 체크 박스 모두 선택
프로젝트 생성하지 않음
 easyXMC7.h

타켓 MCU 및 IRQ 번호 및 순위 지정
easyDSP가 CM7_0에 연결될 경우에는
    EZ_IS_CM7_0_CONNECTED_TO_EASYDSP = 1
    EZ_IS_CM7_1_CONNECTED_TO_EASYDSP = 0
easyDSP가 CM7_1에 연결될 경우에는 
    EZ_IS_CM7_0_CONNECTED_TO_EASYDSP = 0
    EZ_IS_CM7_1_CONNECTED_TO_EASYDSP = 1

EZ_USE_IPC = 1
EZ_IPC_CHAN_CYPIPE_EP0 = 사용자 설정값
EZ_IPC_INTR_CYPIPE_EP0 = 사용자 설정값
EZ_IPC_CHAN_CYPIPE_EP1 = 사용자 설정값
EZ_IPC_INTR_CYPIPE_EP1 = 사용자 설정값
EZ_USE_BOOTLOADER 지정

좌동
 main.c easyDSP_init() 호출 좌동

2. 프로젝트 설정

프로젝트 세팅의 Basic 탭에서 Flash 뱅크 구성을 지정합니다. easyDSP는 플래시 뱅크 구성을 변경하지 않습니다. 여기서는 그 구성을 easyDSP에게 알려주는 역할입니다.
케이스 3 또는 4의 경우 각 코어의 출력 파일을 모두 지정해야 합니다. 또한 'Communication with easyDSP' 체크박스를 모두 선택합니다.
 

3. 하나의 easyDSP가 두개의 코어를 모니터링할 경우 변수 이름 표기법

하나의 easyDSP가 두개의 CM7 코어와 통신할 때 (즉, 케이스 3 또는 4), 코어간 변수 이름을 구분하기 위해, CPU1(CM7_0) 프로그램 변수에는 "1:"을, CPU2(CM7_1) 프로그램 변수에는 "2:"를 기존 변수 이름 앞에 덧붙입니다. 즉, CPU1 프로그램 변수 이름이 "var1" 일 경우, easyDSP에서 "1:var1" 으로 표기되며, CPU2 프로그램 변수 이름이 "var2" 일 경우, easyDSP에서 "2:var2"로 표기됩니다.

4. MCU > Reload *.out 메뉴

easyDSP 제공 부트로더를 사용하지 않을 경우, MCU 플래시가 디버거 등으로 다시 프로그래밍될 때마다, 본 메뉴를 실행하여 재프로그래밍된 변수 정보를 업데이트해야 합니다.
easyDSP 제공 부트로더를 사용할 경우, 사용자 프로그램이 새로 컴파일되면 아래 메시지에서 Yes를 선택하므로써 재프로그래밍될 변수 정보를 업데이트하므로 본 메뉴를 사용하지 않습니다.