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

TMS320F28388D ] Reset Sources

by eteo 2023. 8. 14.

 

 

유저매뉴얼의 Reset Sources 테이블

 

첫번째 열이 Reset Source 목록이고 첫번째 행이 각 Reset이 발생했을 때 초기화되는 여부를 표시한다. Yes인 것은 해당 회로가 리셋 된다는 뜻이고, - 는 해당회로 기존 상태로 남는다는 뜻이며, Hi-z는 하이 임피던스 상태라는 뜻이다.

 

 

 

 

 

 

 

Power-On Reset (POR)

 

POR 회로는 칩에 전원이 인가되고 안정된 상태에 이르기까지 칩을 계속 리셋 상태로 묶어두는 회로로, GPIO 핀들의 글리치를 억제하고, 칩이 깨끗하게 시동 될 수 있게한다.

POR이 발생하면 칩의 모든 회로는 리셋상태가 되고, IO핀은 Hi-Z 상태가 되며, /XRS 핀은 Low 신호를 출력하게 된다. 이때 /XRS 핀의 출력 신호는 칩과 연결된 다른 IC 소자들을 리셋 시키기 위해서 사용될 수 있고, 대부분의 경우에서 충분한 리셋 시간을 제공한다. 하지만 리셋을 위해 더 긴 펄스를 필요로 하는 IC가 있는 경우 외부 회로가 구성될 필요가 있다.

 

 

 

 

External Reset (/XRSn)

 

실제 리셋 핀(/XRS)을 통해 외부에서 입력되는 신호로 발생하는 리셋을 말한다.

오픈 드레인 /XRS 핀은 주변의 다른 소자들을 리셋하기 위하기 위한 용도의 출력 핀으로 사용될 수 있고, 입력 핀으로 외부 신호를 입력 받아 칩을 리셋 할 수도 있다.

 

 

 

 

Simulate External Reset (SIMRESET.XRSn)

 

소프트웨어로 External Reset을 시뮬레이션하는 방식이다. CPU1 소프트웨어에서 SIMRESET 레지스터의 XRSn 비트를 1로 설정하면 XRS 핀이 토글되어 칩 전체가 리셋된다.

 

 

 

 

Watchdog Reset (/WDRS)

 

와치독 리셋은 와치독 타이머가 풀카운팅 됐을 때 발생하는 리셋이다.

CPU1과 CPU2는 각각 개별적으로 Watchdog 회로를 가지고 있는데 CPU1에서 발생한 Watchdog Reset 은 칩 전체를 리셋시키지만, CPU2에서 발생한 Watchdog Reset은 CPU2 Core와 CPU2 Peripheral 만 리셋하고 CPU1의 NMI를 트리거한다.

 

 

 

 

NMI Watchdog Reset (/NMIWDRS)

 

마찬가지로 CPU1과 CPU2는 각각 시스템의 하드웨어 에러를 감지하기 위해 개별적으로 NMI(Non-maskable interrupt) 모듈을 가지고 있고, 각 NMI 모듈이 가진 watchdog timer는 사용자가 지정한 시간 내에 CPU가 오류에 대응하지 않으면 리셋을 트리거한다. 

CPU1에서 발생한 NMI Watchdog Reset 은 칩 전체를 리셋시키지만, CPU2에서 발생한 NMI Watchdog Reset은 CPU2 Core와 CPU2 Peripheral 만 리셋하고 CPU1의 NMI를 트리거한다.

 

 

 

Debugger Reset (/SYSRS)

 

TI의 IDE인 CCS 툴바에서 Reset버튼을 눌러 디버거에서 발생시키는 리셋을 말한다.

/SYSRS는 CPU1과 CPU2 각각 별도로 수행할 수 있으며 CPU1에 발생하는 /SYSRS은 JTAG debug logic Reset과 /XRS 출력을 제외한 모든 회로가 리셋되는데 반해, CPU2에서 발생하는 /SYSRS은 자기자신의 CPU2 Core와 CPU2 Peripheral 만 리셋된다.

 

 

 

 

Secure Code Copy Reset (/SCCRESET)

 

각 CPU는 플래시 메모리의 특정 영역에 대한 읽기 접근을 차단할 수 있는 DCSM(dual-zone code security module)라는 보안 모듈이 존재하는데, DCSM이 활성화 된 상태에서 올바르지 않은 접근이 감지된 경우 DCSM은 리셋을 발생시킨다.

이러한 보안 리셋은 CPU1와 CPU2에 각각 개별적으로 발생수 있고, 각각 CPU1./SYSRS와 CPU2./SYSRS 유사한 레벨로 칩을 리셋 시키지만, 잠재적인 공격자에 대한 접근을 거부하기 위해서 JTAG Debug Logic 또한 리셋 시킨다.

 

 

 

 

Hardware BIST Reset (/HWBISTRS)

 

각 CPU는 셀프 테스트 할 수 있는 HWBIST(Hardware Built-In Self Test) 모듈을 내장하고 있는데,  해당 기능는 CPU를 테스트 한 후 원래의 상태로 돌아가기 위해서 리셋을 발생시킨다. 이 리셋은 오직 코어만 리셋시키고 나머지는 이전에 설정된 상태를 유지한다. HWBIST 기능은 특별한 boot ROM 플로우의 일부분으로 보통의 경우 직접적으로 사용하지 않는다.

 

 

Test Reset (/TRST)

 

JTAG 로직은 자기 자신의 리셋을 위한 /TRST 핀을 가지고 있는데 주변 시스템을 리셋하는 데에도 사용될 수 있다.

 

 

 

 

 

 

 

 

Reset Cause Register (RESC) 

 

RESC 레지스터를 확인하면 지난 리셋의 원인이 무엇인지 확인할 수 있다. 그리고 그 값은 외부리셋(POR, XRSn) 또는 소프트웨어로 clear 되기 전까지는 multiple reset동안 유지된다.

 

 

 

driverlib로도 함수가 제공이되는데 POR이나 XRSn 리셋인 경우 RESC 레지스터가 초기화되서 아예 0이 되니까 boot ROM의 Status값을 확인해서 POR 또는 XRSn 비트만 켜주는 것 같다.

 

static inline uint32_t
SysCtl_getResetCause(void)
{
    uint32_t resetCauses;

    //
    // Read CPU reset register
    //
    resetCauses = HWREG(CPUSYS_BASE + SYSCTL_O_RESC) &
                  ((uint32_t)SYSCTL_RESC_POR | (uint32_t)SYSCTL_RESC_XRSN |
                   (uint32_t)SYSCTL_RESC_WDRSN |
                   (uint32_t)SYSCTL_RESC_NMIWDRSN |
                   (uint32_t)SYSCTL_RESC_SCCRESETN
                    | (uint32_t)SYSCTL_RESC_HWBISTN |
                   (uint32_t)SYSCTL_RESC_ECAT_RESET_OUT |
                   (uint32_t)SYSCTL_RESC_SIMRESET_CPU1RSN |
                   (uint32_t)SYSCTL_RESC_SIMRESET_XRSN |
                   (uint32_t)SYSCTL_RESC_XRSN_PIN_STATUS |
                   (uint32_t)SYSCTL_RESC_TRSTN_PIN_STATUS
                   );

    //
    // Set POR and XRS Causes from boot ROM Status
    //
    if((HWREG(SYSCTL_BOOT_ROM_STATUS) & (uint32_t)SYSCTL_BOOT_ROM_POR) ==
       (uint32_t)SYSCTL_BOOT_ROM_POR)
    {
        resetCauses |= SYSCTL_RESC_POR;
    }
    if((HWREG(SYSCTL_BOOT_ROM_STATUS) & (uint32_t)SYSCTL_BOOT_ROM_XRS) ==
       (uint32_t)SYSCTL_BOOT_ROM_XRS)
    {
        resetCauses |= SYSCTL_RESC_XRSN;
    }

    //
    // Return the reset reasons.
    //
    return(resetCauses);
}

static inline void
SysCtl_clearResetCause(uint32_t rstCauses)
{
    //
    // Clear the given reset reasons.
    //
    HWREG(CPUSYS_BASE + SYSCTL_O_RESC) = rstCauses;
}

 

 

참고 : https://m.blog.naver.com/syncworks_28x/220753086523