| ZETI...

| ZETIN

1.    Feature    3

A.    Harvard Bus    3

B.    On-Chip Memory    3

C.    128-Bit Security Key/Lock    3

D.    Boot ROM (4K x 16)    4

E.    External Interface (2812)    4

2.    메모리 맵    5

A.    기본 개념    5

B.    내부 RAM 영역    6

C.    Non-volatile(비휘발성) 메모리 영역    7

D.    MMR(Memory Mapped Register)영역    7

E.    외부 메모리 영역    8

3.    Flash Memory 굽기    9

A.    플래시 메모리는 왜 필요한가?    9

B.    CMD 파일 수정    10

C.    On-Chip Flash Programmer의 사용    13

 

 

  1. Feature
  1. Harvard Bus

       Harvard Bus Architecture
       Unified Memory Programming Model

   내부 버스 구조는 명령어 처리 속도를 높이기 위해서, 하버드 버스 구조를 채택하고 있다. 하버드 버스 구조라는 것은, 사용자가 작성한 코드에서, 데이터 성분은 데이터 버스로, 프로그램 성분은 프로그램 버스로 실어 나를 수 있도록 고안된 버스 구조로 명령어 처리 효율을 높일 수 있기에 많이 쓰인다.

   메모리도 마찬가지로, 하버드 메모리 구조라는 것이 있다. 프로그램 메모리와 데이터 메모리로 구분된다. 명령어 수행 효율이 높아지는 장점은 있지만, C 언어와는 궁합이 썩 안 좋다. 24나 54계열 DSP가 하버드 메모리 구조를 채택하고 있다. 데이터와 메모리 구분 없이 하나의 메모리에 모든 것을 담는 구조를 'Unified(단일) Memory' 이라고 한다. C언어의 효율이 매우 좋다.

 

  1. On-Chip Memory

       Flash Devices: Up to 128K x 16 Flash (Four 8K x 16 and Six 16K x 16 Sectors)
       ROM Devices: Up to 128K x 16 ROM

   TMS320F2812에는, 128K Word(1 word는 2 byte)의 플래시 메모리가 탑재되어 있다. 이 플래시 메모리는 총 10개의 섹터로 구성되어 있으며, 섹터에 따라서 8K Word 혹은 16K Word도 구분된다. TI에서는 이 플래시 메모리를 자유롭게 다룰 수 있는 API(Application Program Interface)를 제공하고 있다. 예를 들어, 1 섹터 이상의 빈 공간이 있다면, 동작 중에 중요한 데이터 등을 빈 섹터에 기록할 수도 있다. TMS320C2812에는 이름에 F대신 C가 들어있는 것처럼, TMS320F2812의 플래시 메모리가 CMOS ROM으로 이뤄져 있다. 대체로 TMS320F2812와 같은 플래시 메모리 내장형으로 개발과 초도 양산 과정을 마치고, 양산 품질이 확보되면, CMOS ROM이 탑재된 TMS320C2812로 옮겨간다. CMOS ROM 제품이 플래시보다 꽤 싸다.

       1K x 16 OTP ROM

   1K Word 크기의 OTP(One Time Program) ROM은 시스템 개발 현장에서 단 한 번 구울 수 있도록 설계된 메모리다. 주용도는 사용자 정의 부트로더라던지, 중요한 시스템 상수 등을 저장한다.

       L0 and L1: 2 Blocks of 4K x 16 Each Single-Access RAM (SARAM)
       H0: 1 Block of 8K x 16 SARAM
       M0 and M1:2 Blocks of 1K x 16 Each SARAM

   칩 내부에 RAM도 있다. 모두 SARAM(Single Access RAM) 형태로, 281x DSP에는 모두 18K Word가 탑재되어 있다. 각각은 L0, L1, H0, M0, M1으로 구성되어져 있다. 자세한 내용은 "4.메모리 맵"에서 살펴보도록 하자.

  1.   128-Bit Security Key/Lock


       - Protects Flash/ROM/OTP and L0/L1 SARAM
       - Prevents Firmware Reverse Engineering

   칩 내부 메모리 내용을 보호하는 기능으로 128비트 암호를 채택하고 있다. 보호 대상은 비휘발성 메모리(Flash 또는 CMOS ROM, 그리고, OTP) 전부와 L0와 L1의 SARAM 을 포함한다. 내부 RAM까지 Reverse Engineering(코드 추출)으로부터 보호된다는 것이 매우 획기적이다. 중요한 시스템 상수들은 플래시 메모리에 저장되기에 저장된 상태로는 보호를 받는다.

 

  1. Boot ROM (4K x 16)


       - With Software Boot Modes
       - Standard Math Tables

   TMS320C/F28XX에는 TI가 심어놓은 코드(부트 로더)와 데이터(각종 수학 함수표)가 있다. MC(Micro Computer) 모드로 설정하고 칩을 구동하면, 이 부트롬이 접근가능해지고, 실행도 된다. 칩의 시동과 관련된 내용이기에, 이 영역을 '부트 롬'이라고 부른다. TMS320C/F28XX는 규모가 상당히 큰 칩이어서 다양한 형태의 부트를 지원한다. 시리얼 포트를 통한 부트, 일반 입출력 포트(GPIO-B Port)를 이용한 패러렐 부트, 내부 플래시나 OTP, H0 메모리로 부터의 부트 모드등 매우 다양하다. 다양한 만큼 복잡하기도 하지만, 이러한 다양함을 통해서 원가 경쟁력이 매우 강한 시스템을 설계할 수 있다. 여기에 추가로 삼각함수 값과 같은 몇몇 중요한 수학 함수 표도 기록되어져 있기에, 별도의 Look-up Table등을 만들 필요가 없다.

  1. External Interface (2812)


       - Up to 1M Total Memory
       - Programmable Wait States
       - Programmable Read/Write Strobe Timing
       - Three Individual Chip Selects

   TMS320C/F2812는 외부 메모리를 장착할 수 있는 회로(이하, EMIF = External Memory Interface)를 탑재하고 있다. 이 회로를 통해서 약 1M Word가 조금 넘는 외부 메모리를 장착할 수 있다. 외부 메모리 영역은 세 개의 칩 선택 핀( XZXS0AND1, ZXCS2, XZCS6AND7)을 통해서 각각 활성화된다.

   또한, 다양한 속도의 외부 메모리와 연결이 가능하도록 외부 메모리 접근 시간을 제어하는 회로도 탑재하고 있다.( Programmable Wait States ) 기본 값은 가장 느리도록 설정이 되어 있다. 칩 초기화 과정에서 적절한 속도로 맞추어 주어야 요구하는 속도로 움직인다. 단, SDRAM과 같은 동기형 메모리를 탑재하기 위해서는 별도의 회로가 요구된다.

 

 

  1. 메모리 맵
  1. 기본 개념

아래 그림은 TMS320F2812의 메모리 맵이다.
   28x는 단일 메모리를 탑재한 DSP 이지만, 프로그램 버스와 데이터 버스 따로 가지고 있다. 메모리 각각에 입출력 창구가 두 개 있어서 프로그램 버스와 데이터 버스 모두가 붙을 수 있다. 즉, 프로그램 버스든, 데이터 버스든 메모리 전 영역에 접근할 수 있다. 따라서 하버드 메모리 구조에 맞게끔 설계된 24x DSP의 코드도 문제없이 구동할 수 있게 된다.

   그 밖에 중요한 점은 C2000계열에 해당한 모든 DSP 의 메모리는 접근할 수 있는 최소 단위가 16비트라는 것이다. 즉 바이트 단위가 아닌 워드 단위로만 메모리 접근이 가능하다.

   위 의 메모리 맵은 상당이 복잡해 보이지만 단순히 RAM영역, Non-volatile(비휘발성) 메모리 영역, MMR영역, PIE Vector 영역, 외부 메모리 영역 6가지로 구분할 수 있다.

2811과 2810은 양산용을 목표로 하고 있다. 2812에 비해서 외부 메모리 인터페이스에 필요한 핀이 삭제 가능하기에 크기가 대폭 줄어들고 전력소비도 현격이 줄어들어서 여러모로 양산에 유리하기 때문이다. 프로그램 코드가 크다면 당연히 2812가 되겠다. 한편, 2811이나 2810을 최종 목표 프로세서로 삼을지라도 개발은 2812로 해야 한다. 코드를 플래시 메모리가 아닌 램에서 수행을 하기에 디버깅과 튜닝이 매우 자유스럽기 때문이다. 

 

  1. 내부 RAM 영역


  
F281x 계열 DSP 는 모두 36KByte의 SARAM을 탑재 하고 있다. 메모리 맵의 M0, M1 / L0, L1 / H0 영역들이 이에 해당한다. 이들 중 L0, L1은 CSM(Code Security Module)의 보호를 받는다. CSM을 사용할 경우 L0, L1영역의 코드는 실행만 가능하고 읽기와 쓰기는 불가능 하다. 따라서 중요한 데이터 상수들을 램에 올려 연산을 해야 할 경우에는 L0, L1영역을 이용하는 것이 좋다. 128비트 암호로 보호된다.
   내부 램은 DSP 와 동일한 속도로 구동된다. DSP가 메모리 속도 때문에 대기해야 하는 일이 없다. 하지만 외부 메모리나 내부 플래시 메모리는 느리다. 따라서 외부 메모리나 플래시에 담겨 있는 코드는 281x DSP의 최고 속도인 150MHz로 구동할 수 없다. 외부 메모리나 플래시에 프로그램을 담을 때는 이 점을 항상 주의해야 한다.

M0와 M1

M0와 M1영역은 24계열 코드를 호환시키기 위해서 탑재된 메모리로 24계열의 데이터 메모리를 대신한다.

28X 칩은 리셋벡터를 포함해서 인터럽트 벡터영역이 이동가능하다.(relocatable) ST1레지스터의 VMAP 비트를 0으로 두면, 32개의 벡터가 M0 영역으로 이동한다. 28X를 C로 구동할 경우, M1 영역은 주로 스택으로 사용 된다. M1영역이 1K Word에 불과하기에 과도한 스택 사용은 운영도중 오류를 일으킬 가능성이 크다는 것을 메모리 맵을 통해서 알 수 있다.

L0와 L1

이 영역은 주로 데이터를 취급하는 용도로 쓰인다. 이 영역은 램 영역임에도 불구하고, 'Code Security' (코드 보안) 기능이 적용되어서, 사용자 데이터의 유출을 막아준다. 시스템을 다룰 때, 코드도 중요하지만 시스템 파라미터들도 이에 못지않게 중요한 경우가 많다. 램까지 128비트 암호로 보호한다는 것은 획기적이다.

H0

H0 영역은  주로 코드를 다루는 데 쓰인다. 24 계열과 호환시킬 경우, 이 영역은 프로그램 메모리로 사용된다. 리셋 벡터에서도 다루겠지만, 28X는 GPIO핀의 상태에 따라서 부트과정이 결정이 되는데, H0 영역에서 코드를 시작하는 부트 모드도 있다. H0영역에서 코드를 시작할 수 있다는 것은 많은 장점을 시사한다. 외부에 램을 장착할 필요도 없이 내부 램에 바로 코드를 실어서 실행을 시켜볼 수 있기에 개발과정이 많이 편리해지는 것도 장점 중 하나다.

 

  1. Non-volatile(비휘발성) 메모리 영역


   비휘발성(Non-Volatile)· 메모리라는 것은 전원에 상관없이 그 내용을 기록 보존하는 메모리로 ROM이나 플래시 메모리 같은 것을 가르킨다. 281x DSP에 탑재된 비휘발성 메모리는 Flash, OTP, Boot ROM 영역이 있다.

OTP

OTP는 일종의 ROM으로 개발자가 딱 한번 구울 수 있는 메모리다. 사용자 정의 부트코드라든지, 중요한 시스템 상수 등을 저장할 수 있도록 고안된 메모리다. 역시 Code Security 기능으로 보호를 받는다.

FLASH 혹은 ROM

Flash 메모리는 주로 사용자의 프로그램 코드를 저장하는 공간으로 DSP가 stand-alone으로 동작하기 위한 필수적인 영역이다. 또한 이 플래시 영역의 제일 마지막 8Word는 CSM의 패스워드를 지정하는 중요한 공간이 있다. 부주의하게 이 영역에 데이터를 기록했다가는 플래시 메모리를 영영 못 쓸 수 있으니 주의해야 한다.

Boot ROM 및 BROM

Boot ROM은 부트와 관련된 코드가 기록된 ROM이다. 여기에 추가로 각종 수학 함수표도 실려있다.

 

  1. MMR(Memory Mapped Register)영역


   MMR은 281x DSP의 주변회로를 컨트롤 하기 위한 레지스터들은 어셈블리로만 접근이 가능하다. C는 메모리를 다루는 언어이기 때문에 레지스터에 직접 접근이 불가능하다. 따라서 28x DSP들은 레지스터들 메모리처럼 다룰 수 있도록 주소를 부여하여 메모리 맵핑 시켰다. 따라서 C로도 메모리에 접근하듯이 자유롭게 접근을 가능하게 해준다. 메모리 맵상에서 PF0, PF1, PF2로 표시된 영역으로 Peripherals Frame의 약자다. 주변회로를 제어하는 각종 레지스터가 메모리에 맵핑되어 있다.

 

 

 

PF0는 주로 메모리와 CPU 내부 제어와 관련된 레지스터가 맵핑되어 있다.

PF1은 CAN에 관련된 레지스터가 맵핑되어 있다. CAN 만 별도로 맵핑한 이유는 28X에 주변회로 중에 CAN만 32비트의 회로로 구성되어 있기 때문이다. 이로 인해 CAN의 확장된 규격인 2.0B를 완벽히 지원한다.

PF2에는 ADC, EV, SPI, SCI, McBSP 등등 각종 주변회로용 제어 레지스터가 맵핑되어 있다.

 

  1.  PIE Vector 영역


   PIE라는 말은 Peripheral Interrupt Expansion 의 약자로, 우리 말로 하자면, '개별 인터럽트 확장 정도'가 되겠다. 28x 코어가 받아 들이는 인터럽트 수는 16개 이지만 이 PIE 회로를 통해서 최대 96개까지 확장 가능하다. PIE Vector 영역은 PIE회로를 사용할 때 고유의 개별 인터럽트들의 벡터가 가르키는 주소가 저장되는 영역이다.

 

  1. 외부 메모리 영역


   281x의 제품군 중 2812 DSP 경우 외부 메모리 확장이 가능하다. 최대 2MByte 까지 확장이 가능하다. 외부 메모리는 매모리 맵에 볼 수 있듯이 XINT Zone 0, 1, 2, 6, 7 과 같은 영역으로 나뉘어 져있다. 각 Zone 셀렉트 핀을 통해서 접근이 가능하다. 그리고 281x의 외부 메모리의 데이터 버스는 원가 절감을 위해 내부와는 달리 16비트이다. 따라서 32비트 데이터 접근은 단일 사이클로 이뤄지지 못한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Flash Memory 굽기
  1. 플래시 메모리는 왜 필요한가?

임베디드 시스템에 있어서 프로세서의 stand alone 상태의 동작은 필수 불가결한 조건이다. 즉 개발자가 설계한 프로그램이 프로세서 상에서 외부 도움 없이 단독으로 동작해야 한다는 것이다.
  이때 만약 개발한 시스템의 프로그램이 램에 저장 되어 있다면 당신이 원하는 단독 동작은 물 건너간 것이다. 램은 휘발성 소자이기 때문에 전원을 한번 빼면 저장되어 있는 프로그램이 지워진다. 따라서 다시 전원을 공급해도 이미 칩의 램에는 동작시킬 프로그램이 없는 것이다.

  그래서 필요한 것이 전원이 중단되더라도 저장된 내용을 유지할 수 있는 롬이나 플래시 메모리이다. 여기서 롬은 읽기만 가능한 메모리이기에 한번 저장된 내용을 변경 할 수 없다. 따라서 개발과정에서 빈번하게 바뀌는 프로그램을 계속 담을 수가 없다. 이에 반해 플래시는 비휘발성 소자이면서, 일정 횟수에 한해 계속적으로 저장된 내용을 바꿀 수 있기 때문에 개발단계에서 사용되고 상대적으로 플래시에 비해 아주 싼 롬의 경우는 완전한 개발이 끝나고 양산단계에서 사용되게 된다.

  좀 전에 플래시는 저장된 내용을 일정횟수에 한해 바꿀 수 있다고 했다. 램도 저장된 내용을 계속해서 바꿀 수 있다. 하지만 플래시는 램과 달리 저장된 내용을 전원공급이 없어도 유지 할 수 있다. 언뜻 보기에 램보다 플래시 메모리가 좋아 보인다. 그렇다면 왜? 281x DSP는 모든 메모리를 플래시 메모리로 사용하지 않고 램을 사용하는 것일까? 여러 가지 이유가 있지만 가장 큰 이유는 플래시와 램의 데이터 쓰기 방식에 차이가 있기 때문이다.
  램의 경우는 CPU가 자유롭게 접근하여 읽고 쓰기가 가능하지만, 플래시의 경우는 CPU를 통해 읽기는 자유롭게 가능하지만 쓰기의 경우는 그렇치 못하다는 단점이 있다. 플래시의 경우 데이터를 쓰기 위해 따로 "굽는다"라는 별도의 과정이 필요하다. 램처럼 CPU가 마음대로 접근하여 데이터를 쓸 수 없다는 것이다. 또한 플래시는 물리적인 한계로 인해 램보다 동작속도가 느리기에 이것 또한 고려해야 한다.

  따라서 추천되는 프로그램의 개발 과정은 다음과 같다. 우선 프로그램의 개발을 시작하는 단계에서는 램을 기반으로 프로그램을 디버깅하고, 프로그램이 어느 정도 완성되고 난 후에 프로그램을 플래시 메모리에 기록하여 stand-alone 동작을 확인하는 것이다. 최종적으로 개발이 끝나고 대량!! 양산하기 위해서는 플래시 메모리를 탑재한 TMS320F28X 에서 플래시 대신 CMOS롬을 탑재한 TMS320C28X로의 타겟 DSP 변경을 고려할 수 있다.

  지금부터 우리는 F281x의 내부램에서 개발된 프로그램을 stand alone으로 동작시키기 위한 플래시 프로그래밍에 대해서 알아보겠다.

  1. CMD 파일 수정

앞에서 기존 램에서 디버깅 하던 프로그램은 섹션들의 메모리 배치가 모두 램에 배치되도록 작성되어 있기 때문에 CMD 파일을 수정해야 한다고 했다. 이제 제공된 예제파일 중 F281x_exercise.cmd 파일을 열도록 하자. CMD 파일은 크게 두 부분으로 구분된다. MEMORY{}와 SECTION{}이다. MEMORY{}는 메모리의 영역을 정의하는 부분이고, SECTION{}는 정의된 메모리의 영역에 섹션들의 배치를 지시하는 부분이다. F281x_exercise.cmd 에서 MEMORY{}는 F2812의 메모리맵상의 메모리 이름, 크기와 위치를 정확하게 일치시켜서 정의하고 있다. 무슨 말인지 잘 모르겠다면 CMD 파일과 아래의 F2812 메모리 맵 그림과 잘 비교해서 살펴보면 알 수 있을 것이다.

 

[그림 1] TMS320F2812 메모리 맵


  굳이  MEMORY{}의 메모리의 정의를 메모리 맵과 일치시킬 필요는 없다. 사용자의 필요에 알맞게 재 구성해서 쓰면 된다. 단 메모리 맵에 표시되어 있는 메모리의 범위들은 꼭 지켜주어야 한다. 사용자가 코드 및 데이터의 저장용도로 활용할 수 있는 부분은 굵은 테두리로 표시되어 있다.

  MEMORY{}에서 플래시 메모리에서의 코드수행을 위해 아래 [코드 1]의 밑출 친 부분을 수정해야 한다.

[코드 1] Code Start 주소 수정


  BEGIN 메모리 영역은 사용자 코드의 시작위치 정보를 담기 위한 공간이다. 플래시 메모리에서의 동작을 위해 부트모드를 플래시로 바꾸고 BEGIN 메모리 영역의 시작주소를 [코드 1]과 같이 플래시 메모리 영역인 0x3F7FF6으로 수정해야 한다. 부트 모드를 바꾸는 방법은 다음 [그림 2]와 같이 해당 GPIO 핀의 상태를 변경하는 것으로 가능하다.

[그림 2] TMS320F2812 의 부트모드 선택 핀

   다음은 SECTION{} 를 수정할 차례다. 다음 [코드 2]의 밑출진 부분을 수정해 주자.

[코드 2] 섹션 배치 수정

 


 
[코드 2]를 보면 모든 섹션을 수정하지 않고 몇 가지 섹션들 만을 플래시로 배치하도록 수정하고 있다. 그렇다면 어떤 섹션을 플래시에 배치해야 하고 어떤 섹션을 램에 배치해야하는 걸까? 간단히 생각해 보면 우선은 가장 중요한 사용자의 실행코드가 플래시에 저장되어야 할 것이다. 그리고 실행 코드에 포함되어 있는 각종 상수들 또한 플래시에 저장되어야 할 것이다.  " if(a==10){ c=b+20; } " 와 같은 코드의 if() 문은 실행코드가 되겠고, 10이 실행 코드에 들어있는 상수가 되겠다. 마찬가지로 c=b+20 의 코드도 실행코드와 상수가 같이 들어있다. 이러한 실행코드와 상수들의 코드가 묶여서 .text 라는 섹션에 들어가게 된다.

  하지만 예외적으로 프로그램 코드중 swich 구문은 명백히 실행코드이지만 .text 섹션에 들어가지 않는다. 대신에 .switch 라는 전용 섹션에 들어가게 된다. 이는 switch 구문이 대부분 분기구문으로 이뤄져있기 때문이다. 분기구문은 메모리상의 위치에 따라 상당한 성능차이를 보인다. 따라서 이러한 구문을 따로 구분하여 효율적으로 관리하기 위해 .text 섹션과 분리하여 별도의 섹션에 통합 배치되도록 한 것이다. 물론 .switch 섹션은 실행코드에 속하므로 플래시에 저장되어야 할 것이다.

  다음은 프로그램에 사용되는 변수들이다. 변수들은 크게 2가지로 나눌 수 있다. 초기화된 변수와 그렇지 않은 변수이다. " int a, b=100; " 라는 코드를 보자 a와 b 두 변수가 선언되어 있다. 여기서, a의 경우가 초기화되지 않은 변수이고 b가 초기화된 변수이다. b같이 초기화된 변수들 또한 값을 유지해야 하므로 플래시에 저장되어야 할 것이다. 이렇게 초기화된 변수들은 .cinit 라는 섹션에 들어가게 된다. 참고로 비초기화 변수의 경우는 .bss 라는 섹션에 들어가게 된다.

  또 .pinit 라는 섹션이 있는데 이녀석은 C++ 에서 사용하는 global object constructor 들이 들어가게 되는데 필자가 C++을 잘 모르는 관계로 일단 그냥 넘어가도록 하겠다. C로만 코드를 짠다면 별로 신경쓰지 않아도 되는 섹션이니 넘어가도록 하자. -_-;

  그리고 초기화된 변수들 중에는 수정이 불가능하도록 " const int b = 30; " 와 같이 const 키워드로 상수형 선언이 된 것도 있다. 이러한 초기화된 상수변수 같은 경우 또한 플래시에 저장돼야 한다. 이러한 상수변수들은 .const 라는 섹션에 들어가게 된다. 이외에도 문자열이나, 전역 정적 변수의 초기값이 이곳에 들어간다.

  모두 정리해서 플래시 프로그래밍을 위해 각 섹션이 배치되어야 할 메모리를 아래와 같은 표로 간단히 나타냈다. 섹션들중 이름앞에 .econst,  .ebss 등 처럼 " e " 가 붙은 것은은 Large Memory Model을 위한 것이다. F2812 도 Large Memory Model 이기에 " e " 붙은 섹션이 사용된다. 주의하도록 하자.

[그림 3] 플래시 프로그래밍시 섹션 배치표


 
위에서 CMD파일의 수정이 끝났으면 프로그램을 빌드해서 실행파일을 만들도록 하자. 이때 CCS Customize (Option → Customize.. → Program/Project Load 탭) 에서 Load Program After Build 옵션을 설정한 상태라면 아래와 같은 에러메시지가 여러번 뜰것이다. 


  CCS가 빌드한 실행(OUT)파일을 CMD 파일에 따라서 램에 로드하듯이 플래시에 프로그램을 로드하려하기 때문에 생기는 에러메시지다. 위에서도 얘기 했듯이 플래시는 램처럼 프로그램을 로드할 수 없다. 즉 굽는 과정이 필요하기 때문에 실행파일을 플래시 메모리 영역에 로드할수 없다고 뜨는 에러메시지다. 확인을 눌러주고 넘어가도 되고 Load Program After Build 옵션설정을 제거하면 뜨지 않는다.

  1. On-Chip Flash Programmer의 사용

여기까지 잘 따라왔다면 플래시에 구워 실행할 수 있는 결과(OUT)파일을 생성할 것이다. 남은 것은 플래시 굽기 프로그램을 이용해서 결과파일을 DSP에 구워주면 된다. 이 플래시 굽기 프로그램이 CCS의 플러그인인 ON-Chip Flash Programmer 이다. 앞서 설치할때 봤으니 무엇인지는 알 것이다. 이제 이 프로그램을 사용해서 결과파일(*.out)을 플래시에 구워보자. CCS의 번개 모양 아이콘을 클릭하거나 Tools → F28xx ON-Chip Flash Programmer 메뉴을 클릭해서 프로그램을 실행시키자.

[그림 4] On- chip Flash Programmer 실행

 

[그림 5] On- chip Flash Programmer의 사용


 
프로그램을 모듈별로 5가지로 구분지어서 표시해 뒀다. 번호순서대로 차근차근 따라 해보자.

 

 

① Flash Programmer Settings...
  먼저 Flash Programmer Settings 버튼을 클릭하자. 그럼 다음과 같은 새로운 창이 뜰 것이다.

[그림 6] Flash Programmer Settings
 
먼저 Select DSP Device to Program에서 사용하고 있는 해당 DSP를 선택해야 한다. F2812를 선택하자. 다음은 Browse... 버튼을 클릭해서 Flash API Interface를 선택해야 한다. 본 예제에서는 F2812 DSP 를 사용하고 있으므로 경로는 아래와 같다. 하위경로에 다른 28xx API가 있는 폴더가 있으니 참고하도록 하자.
▶ C:\CCStudio_v3.x\plugins\Flash28xx\Algorithms\2812
  위의 경로에서 해당 DSP의 폴더로 들어간 다음 아래와 같은 파일을 선택하면 된다.
▶ FlashAPIInterface2812V2_10.out
  이제 OK 버튼을 클릭해서 세팅을 마치자.

② Clock Configuration
 
다음은 ② Clock Configuration 설정을 한다. OSCCLK은 말 글대로 DSP로 입력되는 오실레이터의 클럭값을 입력한다. 단위가 M(메가)Hz 단위임을 유념해두자. PLLCR Value는 PLL 회로의 클럭 분주 설정 값을 입력하는 것이다. OSCCLK와 PLLCR 설정에 따라 SYSCLKOUT 값이 나온다. 본 예제에서는 이 설정을 바꿀 필요가 없으므로 아무 것도 수정하지 말자. 만약 다른 프로그램에서 다른 OSCCLK과 PLLCR값을 사용한다면 그에 알맞게 설정해 주어야 한다. 주의 하도록 하자.

③ Erase Sector Selection
 
Erase Sector Selection 을 설정한다. 플래시 메모리를 섹터별로 구분해서 섹터단위로 Erase 할 수 있도록 되어있다. 다음 그림과 같이 설정하도록 하자.

[그림 7] Erase Sector Selection

  이것을 제대로 활용하기 위해선 cmd파일에서 플래시의 메모리 설정을 [그림 7]의 섹터크기와 일치시켜 설정해야 할 필요가 있다.

④ Code Security Passwords

Code Security Passwords 을 설정한다. 플래시에 구워진 프로그램의 코드가 밖으로 유출되는 것을 막기 위한 암호를 설정하는 부분이다. 본 예제는 이 부분은 아직 쓰지 않는다. 아무것도 수정하지 말도록 하자. 만약 이 부분을 사용한다면 주의해서 사용해야 한다. 이 부분을 잘못 건드리면 플래시 메모리를 아예 사용하지 못하게 될 수 있기 때문이다.

⑤ Operation
  이제 마지막으로 Operation을 수행 해야한다. 여기서 실제로 플래시 메모리를 지우고, 굽는 과정을 거친다. 먼저 "Browse.." 를 클릭해서 실행파일을 찾아서 선택하도록 한다.

[그림 8] Operation


  실행파일을 선택했으면 [그림 8]과 같이 설정하고 "Execute Operation" 버튼을 클릭하자. 이제 굽기 과정이 수행된다. 약간의 시간이 걸린다. 과정이 끝나고 CCS 화면하단의 디버그 창에서 에러 메시지가 뜨지 않으면 성공적으로 플래시에 프로그램이 구워진 것이다.

 

 

 

 

 

 

Leave Comments