본문 바로가기
개발/TI_TMS320

초기화 코드 정리: InitSysCtrl , InitInt 등 : TMS320

by 즐기며 2025. 10. 24.

 

 


TMS320F2806x 초기화 코드 정리


1. main() 및 인터럽트 초기화

void main(void) 
{
    Uint16 Loop_count = 0;  
    
    DINT;    // Disable Global Interrupt                                          

    // 고속 CLOCK 설정
    EALLOW;	// 보호 레지스터 쓰기 허용
    /* HSPCLK = SYSCLKOUT/(HISPCP*2) 
     * HSPCLK = 150MHz/(1*2) = 75MHz */
    SysCtrlRegs.HISPCP.bit.HSPCLK = 1;                  
    EDIS;   // 보호 레지스터 쓰기 금지         

    // 시스템 컨트롤 초기화
    InitSysCtrl();    
    InitInt();    

    EINT;   // Enable Global interrupt INTM
    ERTM;   // Enable Global realtime interrupt DBGM

    for(;;)
    {  
        Loop_count++;
    }
}

 

2. 매크로 정의 (인라인 어셈블리)

#define  EINT   __asm(" clrc INTM")  // 전역 인터럽트 ON
#define  DINT   __asm(" setc INTM")  // 전역 인터럽트 OFF
#define  ERTM   __asm(" clrc DBGM")  // 리얼타임 인터럽트 ON
#define  DRTM   __asm(" setc DBGM")  // 리얼타임 인터럽트 OFF
#define  EALLOW __asm(" EALLOW")     // 보호 레지스터 쓰기 허용
#define  EDIS   __asm(" EDIS")       // 보호 레지스터 쓰기 금지
#define  ESTOP0 __asm(" ESTOP0")     // 에뮬레이션 정지 (디버그용)

 

3. InitSysCtrl(void)  –  시스템 제어 초기화

void InitSysCtrl(void)
{
    DisableDog();  // 와치독 타이머 비활성화

    // ADC 및 오실레이터 캘리브레이션 (OTP → TRIM 레지스터 복사)
    EALLOW;				// 보호 레지스터 쓰기 허용
    SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;  // ADC 클럭 일시 활성화
    (*Device_cal)();                       // 자동 캘리브레이션 함수 호출
    SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 0;  // ADC 클럭 원복
    EDIS;				// 보호 레지스터 쓰기 금지

    IntOsc1Sel();                          // 내부 오실레이터 1 선택 (기본)
    InitPll(DSP28_PLLCR, DSP28_DIVSEL);    // PLL 설정 → SYSCLKOUT 생성
    InitPeripheralClocks();                // 주변 장치 클럭 활성화
}

> 초기화 단계 요약

Step 1 DisableDog()와치독 OFF
Step 2 InitPll()PLLCR 설정으로 SYSCLKOUT 생성
Step 3 Pre-scaler 설정 → 고속/저속 주변장치 클럭 조정
Step 4 InitPeripheralClocks()주변장치에 클럭 공급 ON

주의: 디버그 중 Boot ROM 우회 시 (*Device_cal)() 반드시 호출!


 

4. InitInt(void)  –  인터럽트 시스템 초기화

> 인터럽트 초기화 단계

static void InitInt(void)	// 인터럽트 초기화
{  
    InitPieCtrl();         // Step 1: PIE 설정 레지스터 초기화
    IER = 0x0000;          // Step 2: CPU 인터럽트 활성화 레지스터 클리어
    IFR = 0x0000;          // Step 3: CPU 인터럽트 플래그 레지스터 클리어
    InitPieVectTable();    // Step 4: PIE 벡터 테이블 초기화
}
단계함수설명
Step 1 InitPieCtrl() PIE 개별 인터럽트 설정 플래그 모두 클리어
Step 2 IER = 0x0000 CPU 인터럽트 활성화 레지스터 초기화
Step 3 IFR = 0x0000 CPU 인터럽트 플래그 레지스터 클리어
Step 4 InitPieVectTable() PIE 벡터 테이블 초기화 (ISR 연결 준비)

참고 자료

spru712h-TMS320x280x, 2801x, 2804x DSP System Control and Interrupts.pdf
0.68MB