KG_KAIROS/MCU (Arduino & STM32)

⏳ DMA,Falling,인터럽트란?

projectlim 2024. 9. 3. 17:45
728x90
반응형
SMALL

임베디드 시스템에서 데이터 전송 및 처리는 폴링(Polling), 인터럽트(Interrupt), DMA(Direct Memory Access) 등의 방식으로 이루어집니다. 각 방식의 특징을 살펴보겠습니다.

    • 1️⃣ 폴링 (Polling)
      • CPU가 주기적으로 특정 장치나 메모리 위치를 확인하여 이벤트 발생 여부를 검사하는 방식입니다.
      장점:
      • 구현이 간단하며, 특정 조건을 지속적으로 모니터링할 수 있습니다.
      단점:
      • CPU 자원을 많이 소모하며, 다른 작업을 수행하는 동안 이벤트를 놓칠 수 있습니다.

      2️⃣ 인터럽트 (Interrupt)
      • 특정 이벤트가 발생하면 장치가 CPU에 신호를 보내 작업을 중단하고 이벤트를 처리하도록 하는 방식입니다.
      장점:
      • CPU가 다른 작업을 수행하는 동안에도 이벤트를 처리할 수 있어 효율적입니다.
      단점:
      • 인터럽트 처리 루틴이 복잡할 수 있으며, 우선순위 설정이 필요합니다.

      3️⃣ DMA (Direct Memory Access)
      • CPU를 거치지 않고 메모리와 장치 간에 직접 데이터를 전송하는 방식입니다.
      장점:
      • CPU 개입 없이 대량의 데이터를 빠르게 전송할 수 있어 시스템 성능이 향상됩니다.
      단점:
      • DMA 컨트롤러의 설정이 복잡할 수 있으며, 메모리 충돌을 방지하기 위한 관리가 필요합니다.

 

애썻다...

 


 

  • ⏲️ STM32 마이크로컨트롤러의 타이머 종류

    STM32 마이크로컨트롤러에는 다양한 타이머가 내장되어 있어 여러 가지 시간 기반 작업을 수행할 수 있습니다. 주요 타이머의 종류와 특징을 소개합니다.
  • 1️⃣ 기본 타이머 (Basic Timer) 
    • 기능: 입출력 기능이 없으며, 주로 시간 기반 타이머로 사용됩니다.
    • 용도: DAC 트리거, 간단한 시간 지연 등.

    2️⃣ 범용 타이머 (General-Purpose Timer)
    • 기능: 다양한 기능을 제공하며, 입력 캡처, 출력 비교, PWM 생성 등을 지원합니다.
    • 용도: 모터 제어, 센서 인터페이스, 주기적인 이벤트 생성 등.

    3️⃣ 고급 타이머 (Advanced Timer)
    • 기능: 범용 타이머보다 더 많은 기능을 제공하며, 주로 모터 제어와 디지털 파워 변환에 사용됩니다.
    • 용도: 3상 PWM 출력, 비상 셧다운 입력 등.

    4️⃣ 채널 타이머 (Channel Timer)
    • 기능: 범용 타이머와 유사하지만, 채널 수가 1~2개로 제한됩니다.
    • 용도: 간단한 타이밍 작업, 주기적인 인터럽트 생성 등.

    5️⃣ SysTick 타이머
    • 기능: Cortex-M 코어에서 제공하는 24비트 타이머로, 주로 OS의 틱 타이머로 사용됩니다.
    • 용도: 시스템 틱 생성, 주기적인 인터럽트 발생 등.

    6️⃣ Watchdog 타이머
    • 기능: 시스템 오류 발생 시 MCU를 재부팅하는 역할을 합니다.
    • 용도: 시스템 안정성 확보, 오류 복구 등.

타이머 설정 예제

다음은 STM32에서 기본 타이머를 설정하는 간단한 예제입니다:

// 타이머 핸들러 선언
TIM_HandleTypeDef htim1;

// 타이머 초기화 함수
void MX_TIM1_Init(void)
{
    __HAL_RCC_TIM1_CLK_ENABLE();

    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 7999;
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 9999;
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
    {
        Error_Handler();
    }
}

// 타이머 시작 함수
void Start_Timer(void)
{
    HAL_TIM_Base_Start_IT(&htim1);
}

// 타이머 인터럽트 콜백 함수
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM1)
    {
        // 타이머 주기마다 실행할 코드
    }
}

이 예제에서는 기본 타이머를 설정하고, 주기적으로 인터럽트를 발생시켜 특정 작업을 수행할 수 있습니다

 


 

🕒 STM32 타이머 레지스터: 개요와 주요 기능

 

1️⃣ TIMx_CNT (Counter Register)

  • 🛠️ 기능: 현재 카운터 값을 저장합니다.  
    📏 특징:  1.  16비트 또는 32비트 레지스터, 2.카운터 값은 0에서 최대값까지 증가 또는 감소  
    📌 활용: 실시간 카운터 값 확인.

2️⃣ TIMx_PSC (Prescaler Register)

  • ⏳ 기능: 타이머 클럭의 분주비를 설정합니다.  
    ⚙️ 특징:  
    - 16비트 레지스터  
    - 분주비는 0에서 65535까지 설정 가능  
    📌 활용: 타이머 주기의 정밀 조정.

3️⃣ TIMx_ARR (Auto-Reload Register)

  • 🔄 기능: 카운터가 도달해야 하는 최대값을 설정합니다.  
    📏 특징:  
    - 카운터 값이 이 레지스터 값에 도달하면 오버플로우 또는 언더플로우 발생  
    📌 활용: 반복적인 타이머 이벤트 생성.

4️⃣ TIMx_CCRx (Capture/Compare Register x)

  • 📸 기능: 캡처/비교 값을 저장합니다.  
    ⚙️ 특징:  -PWM 신호 생성 및 입력 캡처에 사용  
    📌 활용: 신호 처리와 타이밍 비교.

예제 코드

다음은 기본 타이머 설정 예제입니다:

// 타이머 핸들러 선언
TIM_HandleTypeDef htim1;

// 타이머 초기화 함수
void MX_TIM1_Init(void)
{
    __HAL_RCC_TIM1_CLK_ENABLE();

    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 7999;
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 9999;
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
    {
        Error_Handler();
    }
}

// 타이머 시작 함수
void Start_Timer(void)
{
    HAL_TIM_Base_Start_IT(&htim1);
}

// 타이머 인터럽트 콜백 함수
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM1)
    {
        // 타이머 주기마다 실행할 코드
    }
}

이 예제에서는 기본 타이머를 설정하고, 주기적으로 인터럽트를 발생시켜 특정 작업을 수행할 수 있습니다. 

 



다시!!!

 

이번엔 타이머 사용하는 거

 

6.5주기는

1 클락당 뭣기기

코드 수정하면 됩니다

 

이거 보고 설정 똑같이

 

설정하는 게 귀찮다 할 수 도 있는데 모든 걸 다 작성해 주는 것보단

generator 쓰는 게 얼마나 행복한지 IAR Work Bench를 쓰다 보면 알 수 있습니다!!

그러니까 그냥 하기...

728x90
반응형
LIST