FLASH API
📌 Flash API (Flash Application Program Interface)
📌 Flash API가 제공하는 함수들
함수명 | 설명 |
Flash_Erase() | Flash 에서 선택한 섹터를 Erase 해주는 함수 |
Flash_Program() | Flash 에서 데이터를 Program해주는 함수 |
Flash_Verify() | Flash 에서 데이터가 올바로Program 됐는지 검증해주는 함수 |
Flash_ToggleTest() | 프로그램의 Flash API 사용을 위한 클럭 설정이 올바로 됐는지 테스트 해주는 함수 |
Flash_DepRecover() | Flash 에서 Depletion된 섹터를 찾아내고 복구해주는 함수 |
Flash_APIVersionHex() | Flash API의 버전 정보를 출력해주는 함수 |
Flash_APIVersion() | Flash API의 버전 정보를 출력해주는 함수 |
📌펌웨어 업그레이드를 위해 에뮬레이터와 CSS의 도움 없이 플래시에 저장된 프로그램을 업그레이드 할 수 있음.
📌 데이터 로그를 위해
📌 Flash Burning KIT
📌 원격 플래시 업데이트 솔루션
CCS 상단 메뉴 View > Resource Explorer 에서 "F2833x FLASH API" 검색 후 Libraries 다운로드
📌 API을 사용하기 전 체크
📌 사용자 어플리케이션에서 Flash API 함수를 사용하기 전 체크
📌 사용자 코드에서 Flash API 사용 시 체크
📌 Step 1. User's 프로젝트에 Flash API Library 추가
📌 Step 2. 프로그램 소스에 Include the API Header File
사용자 코드(main.c)
📌 Step 3. Flash2833x_API_Config.h 파일 수정
Flash2833x_API_Config.h
사용할 프로세서를 "1"정의하고 나머지를 "0"으로 정의
알맞은 CPU 클럭을 지정한다. 사용할 CPU_RATE만을 주석에서 해제 한다.
Flash API가 정상적으로 동작하기 위한 소프트웨어 딜레이 정의. 절대 수정하면 안 된다.
📌 Step 4. PLL Control Register (PLLCR) 초기화
사용자 코드(main함수)
DSP2833x_SysCtrl.c
📌 Step 5-1. Flash API를 Internal SARAM으로 복사
사용자 CMD 파일
Flash283x_API_Library.h
📌 Step 5-2. Flash API를 Internal SARAM으로 복사
사용자 코드(main 함수)
DSP2833x_MemCopy.c
📌 Step 6. Flash_CPUScaleFactor 초기화
Flash2833x_API_Config.h
SCALE_FACTOR 공식은 이미 Flash281x_API_Config.h에 정의 되어 있다. 이 공식은 절대 수정되선 안된다.
CPU_RATE는 Step 3에서 설정했다.
Flash2833x_API_Library.h
API에서 사용될 Flash_CPUScaleFactor의 매개변수가 Flash283x_API_Library.h에 선언돼 있다.
사용자 코드(main함수)
📌 Step 7. Callback Function Pointer 초기화
사용자 코드(main함수)
📌 Step 8. Disable Global Interrupts
Flash28335_API_V210.lib
📌 Step 9. Unlock the Code Security Module(CSM)
📌 Step 10. Frequency and PLL configuration toggle test
📌 Step 11-1. Flash API 사용시 알아야 할 룰
📌 Step 11-2. Flash API 사용시 알아야 할 룰
📌 Step 11-3. Flash API 사용시 알아야 할 룰
📌 해야 할 것 (DOs)
📌 하지 말 것 (DON'Ts)
SyncWorks TR28335 LAB7.c
/*============================================================================================
헤더파일 선언 및 선행처리 지시구문 정의
============================================================================================*/
#include "DSP28x_Project.h"
#include "Flash2833x_API_Library.h"
#define BUFFER_LENGTH 128
#pragma DATA_SECTION(ADC_buffer, "DMARAML7"); /* ADC 버퍼를 사용자 정의 섹션(DAMRAML7)에 배치 */
#pragma CODE_SECTION(MyCallbackFunction,"ramfuncs");
#pragma CODE_SECTION(Example_Done,"ramfuncs");
#define NULL 0
#define STATE_ON 0x0001
#define STATE_FLASH_ERASE 0x0002
#define STATE_FLASH_PROGRAM 0x0003
#define STATE_FLASH_VERIFY 0x0004
#define STATE_OFF 0x0005
/*============================================================================================
예제에서 사용되는 함수들 선언
============================================================================================*/
/* Callback function. Function specified by defining Flash_CallbackPt */
void MyCallbackFunction(void);
Uint32 MyCallbackCounter; /* Just increment a counter in the callback function */
void Example_Error(Uint16); /* If an error, stop here */
void Example_Done(void); /* If done, stop here */
/*============================================================================================
예제에서 사용되는 전역 변수들 선언
============================================================================================*/
FLASH_ST FlashStatus;
extern Uint32 Flash_CPUScaleFactor;
Uint16 Status;
Uint16 State = STATE_ON;
Uint32 LEDcnt;
Uint16 ADC_buffer[4][BUFFER_LENGTH];
Uint16 i,j;
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
/*============================================================================================
메인 함수 - 시작
============================================================================================*/
void main(void)
{
/*============================================================================================
단계 1. 전역 인터럽트 비-활성화 및 인터럽트 플래그 초기화
============================================================================================*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*============================================================================================
단계 2. 시스템 컨트롤 초기화 (DSP2833x_SysCtrl.c 파일 참조)
============================================================================================*/
InitSysCtrl();
// MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
// InitFlash();
// MemCopy(&Flash28_API_LoadStart, &Flash28_API_LoadEnd, &Flash28_API_RunStart);
/*============================================================================================
단계 3. 범용 입출력 포트(GPIO) 초기화
============================================================================================*/
EALLOW;
GpioCtrlRegs.GPAMUX1.all = 0x00000000; /* GPIO0 ~ GPIO5, GPIO 기능으로 설정 */
GpioCtrlRegs.GPADIR.all = 0x0000003F; /* GPI00 ~ GPIO5, 출력으로 설정 */
EDIS;
GpioDataRegs.GPACLEAR.all = 0x0000003F;
/*============================================================================================
단계 4. Flash_CPUScaleFactor 설정
============================================================================================*/
/* Flash _CPUScaleFactor는 FLash API 함수에서 정의된 32비트 전역 변수다.
Flash API는 실행 중 소프트웨어적인 지연을 여러번 사용한다.
이 소프트웨어 지연의 올바른 타이밍은 API 함수가 실행되는데 있어서 극히 중요하다.
Flash _CPUScaleFactor는 칩의 시스템클럭(SYSCLKOUT)을 기초로 API 함수들이 정확한 시간의
소프트웨어 지연을 사용할 수 있도록 해준다.
SCALE_FACTOR는 Flash2833x_API_Config.h 파일에 다음과 같이 정의되어 있다.
#define SCALE_FACTOR 1048576.0L*( (200L/CPU_RATE) ) */
Flash_CPUScaleFactor = SCALE_FACTOR;
/*============================================================================================
단계 5. Flash_CallbackPtr 설정
============================================================================================*/
Flash_CallbackPtr = &MyCallbackFunction;
LEDcnt = 0; /* LED 점멸수 스케일링 */
MyCallbackCounter = 0; /* Increment this counter in the callback function */
/*============================================================================================
단계 6. 변수 초기화
============================================================================================*/
for(i=0 ; i<BUFFER_LENGTH ; i++)
{
ADC_buffer[0][i] = 0;
ADC_buffer[1][i] = 0;
ADC_buffer[2][i] = 0;
ADC_buffer[3][i] = 0;
}
/*============================================================================================
단계 7. 전역 인터럽트 및 리얼타임 디버깅 인터럽트 활성화
============================================================================================*/
EINT; /* Enable Global interrupt INTM */
ERTM; /* Enable Global realtime interrupt DBGM */
/*============================================================================================
옵션. Flash Sector H 영역 초기화 (Flash Sector H의 초기 값을 임의의 값들로 설정하기 위함)
RAML0 영역(Start Address : 0x008000, Length : 0x400)의 데이터들을
Flash Sector H 영역(Start Address : 0x300000, Length : 0x400)에 기록
============================================================================================*/
Status = Flash_Erase((SECTORH),&FlashStatus);
if(Status != STATUS_SUCCESS)
{
Example_Error(Status);
}
Status = Flash_Program((Uint16 *)0x300000,(Uint16 *)0x008000,0x400,&FlashStatus);
if(Status != STATUS_SUCCESS)
{
Example_Error(Status);
}
/*============================================================================================
단계 8. 유휴대기 루프 (Idle-loop)
============================================================================================*/
for(;;)
{
switch(State)
{
case STATE_ON:
/*--------------------------------------------------------------------------
Flash API 예제 시작
---------------------------------------------------------------------------*/
State = STATE_FLASH_ERASE;
break;
case STATE_FLASH_ERASE:
/*--------------------------------------------------------------------------
섹터 H 영역 ERASE
---------------------------------------------------------------------------*/
asm(" ESTOP0");
MyCallbackCounter = 0;
Status = Flash_Erase((SECTORH),&FlashStatus);
if(Status != STATUS_SUCCESS)
{
Example_Error(Status);
}
State = STATE_FLASH_PROGRAM;
break;
case STATE_FLASH_PROGRAM:
/*--------------------------------------------------------------------------
Flash Sector H 영역(Start Address : 0x300000, Length : 0x200)에
ADC_Buffer(Start Address : &ADC_buffer, Length : 0x200)의 데이터들을 기록
---------------------------------------------------------------------------*/
asm(" ESTOP0");
MyCallbackCounter = 0;
Status = Flash_Program((Uint16 *)0x300000,(Uint16 *)ADC_buffer,0x200,&FlashStatus);
if(Status != STATUS_SUCCESS)
{
Example_Error(Status);
}
State = STATE_FLASH_VERIFY;
break;
case STATE_FLASH_VERIFY:
/*--------------------------------------------------------------------------
Flash Sector H 영역(Start Address : 0x300000, Length:0x200)에
ADC_buffer 영역(Start Address : &ADC_buffer, Length:0x200)의
데이터들이 올바르게 기록되었는지 확인
---------------------------------------------------------------------------*/
asm(" ESTOP0");
MyCallbackCounter = 0;
Status = Flash_Verify((Uint16 *)0x300000,(Uint16 *)ADC_buffer,0x200,&FlashStatus);
if(Status != STATUS_SUCCESS)
{
Example_Error(Status);
}
State = STATE_OFF;
break;
case STATE_OFF:
/*--------------------------------------------------------------------------
Flash API 예제 끝
---------------------------------------------------------------------------*/
Example_Done();
break;
}
}
}
/*============================================================================================
메인 함수 - 끝
============================================================================================*/
/*============================================================================================
함수 정의
============================================================================================*/
void MyCallbackFunction(void) /* Callback function - must be executed from outside flash/OTP */
{
if(LEDcnt == 10000)
{
GpioDataRegs.GPATOGGLE.all = 0x0000003F;
LEDcnt = 0;
}
else
{
LEDcnt++;
}
MyCallbackCounter++;
}
/*--------------------------------------------------------------------------
예제 실행 중, 오류가 발생되면 여기서 프로그램이 멈춤
---------------------------------------------------------------------------*/
void Example_Error(Uint16 Status)
{
/* Error code will be in the AL register */
asm(" ESTOP0");
asm(" SB 0, UNC");
}
/*--------------------------------------------------------------------------
예제가 이상 없이 종료되면, 여기서 프로그램이 멈춤
---------------------------------------------------------------------------*/
void Example_Done(void)
{
asm(" ESTOP0");
asm(" SB 0, UNC");
}
/*============================================================================================
끝 - 예제 코드 종료
============================================================================================*/
💡 125 Line 옵션 풀이
datasheet 159page
0x00 8000 L0 SARAM 영역의 임의의값들을 0x30 0000 FLASH 영역에 Flash_Program()
함수를 통해 값을 기록한다.
datasheet 162page
옵션 주석내용 중 Flash Sector H에 대한 주소는 위의 그림을 참고한다.
📌 API를 사용하기 전 체크사항
CCS 상단메뉴 Run > Resume을 선택하거나 Resume 아이콘을 클릭하여, 프로세서에 Load된 예제 프로그램을 실행한다. 그리고 프로그램이 아래 그림과 같은 코드에서 멈추는 것을 확인한다.
Sector H를 삭제(Erase)하기 전에 멈춘 프로그램
ADC_buffer 영역에 현재 저장된 값 확인
Memory Browser의 Load Memory 메뉴 실행
Load Memory 창이 나타나면 임의의 ADC.dat 파일 경로를 지정하고 아래와 같이 설정한다.
위 과정이 완료되었으면 Memory Browser 창을 통해, 설정했던 경로에 위치한 파일로부터 데이터가 Load 되었는지 확인한다. (ADC_buffer_data.dat => ADC_buffer)
Flash Memory Sector H 영역에 현재 저장되어 있는 값 확인
Sector H 영역을 Program 하기 전, 멈춘 프로그램
Erase 된 Flash Sector H 영역
Flash Sector H 영역을 Verify 하기 전, 멈춘 프로그램
ADC_buffer 데이터가 Program 된 Flash Sector H 영역
이상 없이 종료된 예제 프로그램
Graph Properties 설정
설정이 완료되면 "OK" 버튼을 클릭하고, 그래프 창을 통해 Flash Sector H 영역에 저장된 데이터를 관찰한다.
그래프로 데이터 관찰
DSP TMS320F281x ADC 분석 (4) | 2024.01.09 |
---|---|
TR28335 모듈 PWM 사용하 (0) | 2018.12.27 |
TR28335 개발 KIT eCAP (Enhanced Capture Module) (0) | 2017.07.03 |
TR28335 개발 KIT IC2(Inter integrated circuit) 통신 (2) | 2017.06.27 |
TR28335 개발 KIT Potentiometer 가변저항 ADC 로 Control (0) | 2017.06.26 |