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

-
- 1️⃣ 폴링 (Polling)
- CPU가 주기적으로 특정 장치나 메모리 위치를 확인하여 이벤트 발생 여부를 검사하는 방식입니다.
- 구현이 간단하며, 특정 조건을 지속적으로 모니터링할 수 있습니다.
- CPU 자원을 많이 소모하며, 다른 작업을 수행하는 동안 이벤트를 놓칠 수 있습니다.
2️⃣ 인터럽트 (Interrupt)- 특정 이벤트가 발생하면 장치가 CPU에 신호를 보내 작업을 중단하고 이벤트를 처리하도록 하는 방식입니다.
- CPU가 다른 작업을 수행하는 동안에도 이벤트를 처리할 수 있어 효율적입니다.
- 인터럽트 처리 루틴이 복잡할 수 있으며, 우선순위 설정이 필요합니다.
3️⃣ DMA (Direct Memory Access)- CPU를 거치지 않고 메모리와 장치 간에 직접 데이터를 전송하는 방식입니다.
- CPU 개입 없이 대량의 데이터를 빠르게 전송할 수 있어 시스템 성능이 향상됩니다.
- DMA 컨트롤러의 설정이 복잡할 수 있으며, 메모리 충돌을 방지하기 위한 관리가 필요합니다.
- 1️⃣ 폴링 (Polling)
-
⏲️ 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
'KG_KAIROS > MCU (Arduino & STM32)' 카테고리의 다른 글
[KG_KAIROS]SMT32 미니 프로젝트 (0) | 2024.09.04 |
---|---|
[KG_KAIROS] 서보모터 각도제어, HEX 프로토콜 (0) | 2024.09.04 |
[KG_KAIROS] EXTI와 Rx/Tx 제어 설명 (0) | 2024.09.02 |
[KG_KAIROS] STM32_CUBE IDE (0) | 2024.08.30 |
🦾[KG_KAIROS] RobotArm 제작!! (0) | 2024.07.19 |