본문 바로가기
코딩취미/프로그램 지식

[ARM]Cortex-M3 Peripherals map : SysTick Timer 설정 방법

by 브링블링 2024. 1. 6.
반응형

Cortex-M3 Peripherals map : SysTick Timer 설정 방법

ARM Cortex-M3 마이크로컨트롤러에 내장된 SysTick 타이머는 시스템 레벨 타이머로, 주로 운영체제의 타이머 서비스나 단순한 지연(loop) 구현에 사용됩니다. 이 타이머는 프로그래밍이 간단하고 효율적인 인터럽트 기반 타이밍 기능을 제공합니다.

1. SysTick 타이머의 특징

  1. 24비트 다운 카운터: 24비트 리셋 가능한 다운 카운터로 구성되어 있습니다.
  2. 선택 가능한 클럭 소스: 프로세서 클럭 또는 외부 클럭 소스 중에서 선택할 수 있습니다.
  3. 자동 리로드: 0에 도달하면 자동으로 재설정되어 반복 카운트를 수행합니다.
  4. 인터럽트 기능: 0에 도달할 때마다 인터럽트를 발생시킵니다.
  5. 간단한 구성: 운영 체제의 타이머 서비스 구현에 적합합니다.

2. SysTick 타이머의 주요 레지스터

  1. SysTick Control and Status Register (SysTick_CTRL):
    • 주소: 0xE000E010
    • 기능: 타이머 활성화, 인터럽트 활성화, 클럭 소스 선택, 카운트 플래그 등을 제어합니다.
  2. SysTick Reload Value Register (SysTick_LOAD):
    • 주소: 0xE000E014
    • 기능: 타이머가 0에 도달했을 때 자동으로 로드되는 값입니다.
  3. SysTick Current Value Register (SysTick_VAL):
    • 주소: 0xE000E018
    • 기능: 현재 카운터 값을 읽거나 쓸 때 사용합니다.
  4. SysTick Calibration Value Register (SysTick_CALIB):
    • 주소: 0xE000E01C
    • 기능: 클럭 주파수 정보와 스킵 기능을 제공합니다.

3. SysTick 타이머 사용 방법 (스텝 바이 스텝)

1단계: SysTick 타이머 초기화

  1. SysTick_LOAD 설정:
    • SysTick->LOAD 레지스터에 카운트 다운할 값 설정.
    • 예: SysTick->LOAD = 0xFFFFFF; // 최대 카운트 값으로 설정
  2. SysTick_VAL 초기화:
    • SysTick->VAL 레지스터를 0으로 설정하여 현재 카운터 값을 초기화.
    • 예: SysTick->VAL = 0;

2단계: SysTick 타이머 시작

  1. SysTick_CTRL 설정:
    • 클럭 소스 선택 (프로세서 클럭 사용 권장).
    • 인터럽트 활성화.
    • 타이머 활성화.
    • 예: SysTick->CTRL = SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;

3단계: 인터럽트 핸들링

  1. SysTick_Handler 구현:
    • 타이머가 0에 도달할 때마다 호출되는 인터럽트 핸들러 구현.
    • 이 과정을 통해 SysTick 타이머를 설정하고 사용할 수 있습니다. SysTick 타이머는 특히 RTOS(RTOS에서 사용되는 컨텍스트 스위칭 등)에서 매우 유용하게 사용됩니다.
void SysTick_Handler(void) {
    // 인터럽트 발생 시 수행할 작업
}
반응형

Cortex-M3 주요 주변 장치 및 레지스터 정보 표

이 표는 Cortex-M3의 주요 주변 장치들과 그들의 핵심 레지스터들을 요약한 것입니다. 각 레지스터는 특정 기능을 수행하며, 해당 주소를 통해 프로그램에서 직접 접근할 수 있습니다.

  1. NVIC (Nested Vectored Interrupt Controller) : 인터럽트 처리 및 관리를 담당합니다.
    레지스터 이름 주소 기능
    ISER 0xE000E100 - 0xE000E104 인터럽트 활성화
    ICER 0xE000E180 - 0xE000E184 인터럽트 비활성화
    ISPR 0xE000E200 - 0xE000E204 인터럽트 보류 설정
    ICPR 0xE000E280 - 0xE000E284 인터럽트 보류 해제
    IPR 0xE000E400 - 0xE000E4EF 인터럽트 우선순위 설정
  2. SysTick Timer : 간단한 타이밍 및 지연 기능을 제공합니다.
    레지스터 이름 주소 기능
    SysTick_CTRL 0xE000E010 타이머 제어 및 인터럽트 설정
    SysTick_LOAD 0xE000E014 리로드 값 설정
    SysTick_VAL 0xE000E018 현재 카운터 값
    SysTick_CALIB 0xE000E01C 타이머 보정 값
  3. SCB (System Control Block) : 시스템 제어 및 구성을 담당합니다.
    레지스터 이름 주소 기능
    CPUID 0xE000ED00 CPU 식별 정보
    ICSR 0xE000ED04 인터럽트 제어 및 상태
    VTOR 0xE000ED08 벡터 테이블 오프셋
    AIRCR 0xE000ED0C 시스템 제어
    SCR 0xE000ED10 시스템 제어 및 구성
    CCR 0xE000ED14 구성 제어
  4. MPU (Memory Protection Unit) : 메모리 영역의 보호 및 접근 제어를 담당합니다.
    레지스터 이름 주소 기능
    TYPE 0xE000ED90 MPU 타입 및 지원 영역
    CTRL 0xE000ED94 MPU 제어
    RNR 0xE000ED98 영역 선택
    RBAR 0xE000ED9C 영역 기준 주소
    RASR 0xE000EDA0 영역 속성 및 크기
  5. Debug Components : 디버깅 및 추적 기능을 제공합니다.
    레지스터 이름 주소 기능
    DHCSR 0xE000EDF0 디버그 할트 상태 및 제어
    DCRSR 0xE000EDF4 디버그 코어 레지스터 선택
    DCRDR 0xE000EDF8 디버그 코어 레지스터 데이터
    DEMCR 0xE000EDFC 디버그 예외 및 모니터 제어
반응형