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

TMS320F28388D ] Flash API 사용

by eteo 2023. 4. 20.

 

 

 

일단 아래 경로에 있는 FlashAPI 라이브러리를 복사해 프로젝트 안에 가져온다.

 

C:\ti\c2000\C2000Ware_[Version No]\libraries\flash_api\f2838x\cm\lib

 

 

 

 

그리고 아래 경로의 FlashAPI를 사용하기 위한 헤더가 모여있는 폴더도 복사해서 프로젝트에 가져온다.

 

C:\ti\c2000\C2000Ware_[Version No]\libraries\flash_api\f2838x\cm\include\FlashAPI

 

 

 

그리고 Include search path에 추가해준다. 복사해서 가져오지 않아도 c2000ware 폴더 내 경로를 추가하면 되긴하지만 선호하지 않는방법이다.

 

 

 

 

 

 

 

이제 아래 헤더를 include하면 FlashAPI를 가져다 쓸 수 있다.

#include "F021_F2838x_CM.h"

 

 

 

 

이제 이 API와 driverlib_cm을 사용해서 좀 더 범용적인 사용을 위한 상위 드라이버를 만들면 되는데 이때 data sheet의 memory map을 참조하면 된다. 

 

 

Sector 가 16K짜리가 있고 64K짜리가 있다.

 

 

// Bank0 Sector start addresses

#define FlashStartAddress           0x200000
#define Bzero_Sector0_start         0x200000
#define Bzero_Sector1_start         0x204000
#define Bzero_Sector2_start         0x208000
#define Bzero_Sector3_start         0x20C000
#define Bzero_Sector4_start         0x210000
#define Bzero_Sector5_start         0x220000
#define Bzero_Sector6_start         0x230000
#define Bzero_Sector7_start         0x240000
#define Bzero_Sector8_start         0x250000
#define Bzero_Sector9_start         0x260000
#define Bzero_Sector10_start        0x270000
#define Bzero_Sector11_start        0x274000
#define Bzero_Sector12_start        0x278000
#define Bzero_Sector13_start        0x27C000
#define FlashEndAddress             0x27FFFF


// Sector length in number of 32bits

#define Sector16KB_u32length   0x1000
#define Sector64KB_u32length   0x4000

 

 

 

 

좀더 자세한 API 사용법은 예제와 아래 문서를 참조한다.

 

spnu501d.pdf
0.17MB

 

 

 

 

 

 

 

 

Flash 초기화함수

Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, 2);

 

세번째 매개변수를 통해 waitstate를 설정하는데 CPU 동작 클락에 따라 설정값이 다르다.

 

적정값은 데이터 시트에 나와있다. 그리고 Write/Erase Cycle 보장횟수는 20000이다.

 

 

 

 

 

 

 

 

 

 

 

Flash Pump Ownership Semaphore

// Pump access must be gained by the core using pump semaphore
Flash_claimPumpSemaphore(FLASH_CM_WRAPPER);

// Release the pump access
Flash_releasePumpSemaphore();


모든 CPU는 각자 임베디드 플래시를 가지고 있는데 Single Charge Pump는 하나를 공유해서 쓴다. Single Charge Pump란 플래시 메모리의 Program / Erase operation을 위해 전압을 제어하는 모듈인데 이게 하나밖에 없다는 말인즉슨 한순간에 하나의 CPU만 자신의 임베디드 플래시에 program 또는 erase 할 수 있다.

 

 

 

 

이렇게 Flash Pump 공유자원에 대한 동시접근을 제어하기 위해 세마포어가 쓰이며, erase 또는 program 작업전에 먼저 세마포어를 획득하고 작업 후 release 해주는 과정이 필요하다.

 

 

출처 : TRM

 

 

 

 

 

 

Erase

Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32 *)Bzero_Sector6_start);

 

Erase는 위와 같이 섹터 단위로 수행하며, 플래시 메모리의 내용을 변경하려면 특성상 덮어쓰는게 불가능하므로 먼저 해당 섹터를 지우고 Program 작업을 수행할 수 있는 상태로 만들어야한다.

 

 

 

Program

 

Fapi_issueProgrammingCommand((uint32 *)u32Index, Buffer+i, 16, 0, 0, Fapi_AutoEccGeneration);

 

설명을 읽어보니 플래시 메모리는 64-bit aligned 되어있어야하기 때문에 최소 8 byte 또는 16 byte 단위로 프로그램할 수 있다. 만약 16 byte보다 큰 버퍼를 program 하려면 반복문을 돌면서 해야한다.

세번째 매개변수인 16이 16 byte 단위로 program 한다는 뜻이다.

 

 

 

Read

 

그냥 읽으면 된다. NAND와 비교하여 NOR 플래시의 장점이 읽기 속도가 빠르고 주소에 직접 액세스하여 읽을 수 있다는 것이다.