EXTI는 External Interrupt의 약자로, 외부 인터럽트를 처리하는 기능을 의미합니다.
외부 인터럽트는 마이크로컨트롤러가 외부 장치에서 발생하는 신호를 감지하고,
이를 처리하기 위해 프로그램의 흐름을 잠시 변경하는 메커니즘입니다.

EXTI의 주요 기능
- 엣지 감지: EXTI는 신호의 상승 엣지 또는 하강 엣지를 감지하여 인터럽트를 발생시킬 수 있습니다.
- 마스크 레지스터: 특정 인터럽트를 활성화(Enable)하거나 비활성화(Disable)할 수 있습니다.
- 펜딩 레지스터: 인터럽트가 발생했는지 여부를 기록합니다.
- 우선순위 설정: 여러 인터럽트가 동시에 발생할 경우, 우선순위를 설정하여 처리 순서를 결정합니다.
EXTI의 동작 과정
- 신호 감지: 외부 장치에서 신호가 발생하면, EXTI가 이를 감지합니다.
- 트리거 모드 설정: 설정된 엣지 감지 모드에 따라 신호를 파악합니다.
- 마스크 확인: 마스크 레지스터를 통해 해당 인터럽트가 활성화되어 있는지 확인합니다.
- 펜딩 레지스터 설정: 인터럽트가 발생하면 펜딩 레지스터의 해당 비트를 설정합니다.
- 인터럽트 서비스 루틴(ISR) 실행: 인터럽트가 발생하면, 프로세서는 ISR을 실행하여 해당 인터럽트를 처리합니다.
ISR은 Interrupt Service Routine의 약자로, 인터럽트가 발생했을 때 실행되는 특별한 함수나 코드 블록을 의미합니다.
ISR은 마이크로컨트롤러나 프로세서가 외부 또는 내부 이벤트를 처리하기 위해 사용됩니다.
ISR의 주요 특징
- 빠른 응답: ISR은 인터럽트가 발생하면 즉시 실행되어야 하므로, 일반적으로 짧고 빠르게 실행됩니다.
- 우선순위: 여러 인터럽트가 동시에 발생할 수 있기 때문에, ISR은 우선순위에 따라 실행됩니다.
- 상태 저장: ISR이 실행되기 전에 현재 프로세서의 상태(레지스터 값 등)를 저장하고, ISR이 끝난 후 복원합니다.
- 재진입 불가: 대부분의 ISR은 재진입이 불가능하도록 설계되어 있어, 하나의 ISR이 실행되는 동안 다른 인터럽트가 발생해도 해당 ISR이 끝날 때까지 대기합니다.
ISR의 동작 과정
- 인터럽트 발생: 외부 또는 내부 이벤트가 발생하여 인터럽트 신호가 생성됩니다.
- 인터럽트 감지: 프로세서가 인터럽트를 감지하고 현재 실행 중인 작업을 중단합니다.
- 상태 저장: 현재 프로세서의 상태를 저장합니다.
- ISR 실행: 해당 인터럽트에 대응하는 ISR을 실행합니다.
- 상태 복원: ISR 실행이 완료되면 저장된 상태를 복원하고, 중단된 작업을 재개합니다.

클락 셋팅


HSE는 마이크로 컨트롤러 돌릴 때
LSE는 시간 쓸 때




제네레이터 돌리면

RCC는 Reset and Clock Control의 약자로, STM32 마이크로컨트롤러에서 시스템의 리셋과 클럭을 관리하는 중요한 모듈입니다. RCC는 다양한 클럭 소스를 선택하고, 이를 분주하여 시스템의 각 부분에 적절한 클럭을 제공하는 역할을 합니다.
RCC의 주요 기능
- 클럭 소스 선택: 내부 고속 클럭(HSI), 외부 고속 클럭(HSE), 내부 저속 클럭(LSI), 외부 저속 클럭(LSE) 등 다양한 클럭 소스를 선택할 수 있습니다.
- PLL 설정: Phase-Locked Loop(PLL)를 사용하여 클럭 주파수를 증폭하거나 조정할 수 있습니다.
- 분주기 설정: AHB, APB1, APB2 버스에 대한 클럭 분주기를 설정하여 각 버스에 적절한 클럭을 제공합니다.
- 리셋 관리: 시스템 리셋, 주변 장치 리셋 등을 관리합니다.
STM32 마이크로컨트롤러에서 사용되는 주요 클럭 소스는 HSE, LSE, HSI, LSI입니다.
각 클럭 소스의 특징과 차이점을 설명드릴게요.

1. HSE (High-Speed External)
- 설명: 고속 외부 클럭 소스입니다.
- 주파수: 4MHz에서 16MHz 사이의 주파수를 지원합니다.
- 정확도: 외부 크리스탈이나 세라믹 공진기를 사용하여 높은 정확도를 제공합니다.
- 용도: 시스템 클럭 소스로 주로 사용되며, 정확한 타이밍이 필요한 경우에 적합합니다
2. LSE (Low-Speed External)
- 설명: 저속 외부 클럭 소스입니다.
- 주파수: 32.768kHz의 주파수를 지원합니다.
- 정확도: 외부 크리스탈을 사용하여 높은 정확도를 제공합니다.
- 용도: RTC(Real-Time Clock)와 같은 저전력 타이밍 애플리케이션에 주로 사용됩니다
3. HSI (High-Speed Internal)
- 설명: 고속 내부 클럭 소스입니다.
- 주파수: 8MHz의 주파수를 지원합니다.
- 정확도: RC 발진기를 사용하여 정확도가 외부 클럭보다 낮습니다.
- 용도: 초기 부팅 시 기본 클럭 소스로 사용되며, 외부 클럭이 없는 경우에 적합합니다
4. LSI (Low-Speed Internal)
- 설명: 저속 내부 클럭 소스입니다.
- 주파수: 약 40kHz의 주파수를 지원합니다.
- 정확도: RC 발진기를 사용하여 정확도가 낮습니다.
- 용도: 독립적인 워치독 타이머(IWDG)와 같은 저전력 애플리케이션에 사용됩니다.
이 네 가지 클럭 소스는 각각의 특성과 용도에 따라 선택적으로 사용됩니다. 더 궁금한 점이 있으면 언제든지 물어보세요!

얘를 누르면


여기서 콜백 걸림
웹 하면서 버튼을 누르면 반응법
1. WHILE문에서 응답할 때까지
2. 이벤트 처리 (대세)
안 돌아감...
왜지??

SH의 캐리로 해결함.
메인으로 싹 다 넣으라고 함.
특강!!
stm32로 로봇 slave 만들기
이제는 uart로!!
시리얼 통신 공부!!

시리얼 통신은 두 장치 간에 데이터를 주고받기 위한 기본적인 통신 방법입니다.
UART(Universal Asynchronous Receiver/Transmitter)는 시리얼 통신을 구현하는 데 사용되는 하드웨어 모듈입니다.
시리얼 통신의 기본 개념
- 보레이트(Baud Rate): 초당 전송되는 비트 수를 의미합니다. 예를 들어, 9600bps는 초당 9600비트를 전송합니다.
- 데이터 비트(Data Bits): 한 번에 전송되는 데이터의 비트 수입니다. 일반적으로 8비트를 사용합니다.
- 패리티 비트(Parity Bit): 오류 검출을 위한 비트입니다. 짝수(Even), 홀수(Odd), 없음(None)으로 설정할 수 있습니다.
- 스톱 비트(Stop Bits): 데이터 전송의 끝을 나타내는 비트입니다. 1비트 또는 2비트로 설정할 수 있습니다.
RS-232는 Recommended Standard 232의 약자로, 1960년에 도입된 직렬 통신 표준입니다.
주로 컴퓨터와 모뎀, 터미널 등 다양한 장치 간의 데이터 통신에 사용됩니다
232 번 규칙
RS-232의 주요 특징
- 전송 방식: 비동기식 시리얼 통신 방식을 사용합니다.
- 전송 속도: 일반적으로 9600bps에서 115200bps까지 다양한 보레이트를 지원합니다.
- 전압 레벨: 논리 1은 -3V에서 -15V, 논리 0은 +3V에서 +15V로 정의됩니다.
- 커넥터: 주로 DB9 또는 DB25 커넥터를 사용합니다.
RS-232의 구성 요소
- DTE (Data Terminal Equipment): 데이터 단말 장치로, 컴퓨터나 터미널이 해당됩니다.
- DCE (Data Circuit-terminating Equipment): 데이터 회로 종단 장치로, 모뎀이나 라우터가 해당됩니다.
RS-232의 핀 구성 (DB9 커넥터 기준)
- 핀 1: 데이터 캐리어 검출 (DCD)
- 핀 2: 수신 데이터 (RXD)
- 핀 3: 송신 데이터 (TXD)
- 핀 4: 데이터 단말 준비 (DTR)
- 핀 5: 신호 그라운드 (GND)
- 핀 6: 데이터 세트 준비 (DSR)
- 핀 7: 요청 송신 (RTS)
- 핀 8: 송신 준비 (CTS)
- 핀 9: 링 표시 (RI)
RS-232의 장점과 단점
- 장점:
- 간단한 구현
- 널리 사용되는 표준
- 단점:
- 전송 거리 제한 (최대 약 15m)
- 낮은 전송 속도
- 전압 레벨이 높아 전력 소모가 큼
I2C(Inter-Integrated Circuit)는 필립스(Philips)에서 1980년에 개발한 직렬 통신 프로토콜입니다.
I2C는 두 개의 와이어만을 사용하여 여러 장치 간에 데이터를 주고받을 수 있는 간단하고 효율적인 통신 방법입니다

I2C의 주요 특징
- 양방향 통신: I2C는 반이중(Half-Duplex) 통신을 지원하여, 데이터 송신과 수신을 동일한 라인에서 번갈아 가며 수행합니다.
- 두 개의 와이어:
- SDA (Serial Data): 데이터 전송 라인
- SCL (Serial Clock): 클럭 신호 라인
- 마스터-슬레이브 구조: 하나의 마스터와 여러 슬레이브 장치가 연결될 수 있으며, 마스터가 클럭 신호를 제어합니다.
- 주소 지정: 각 슬레이브 장치는 고유한 주소를 가지며, 마스터는 이 주소를 사용하여 특정 슬레이브와 통신합니다.
- 속도: 표준 모드(100kHz), 패스트 모드(400kHz), 패스트 모드 플러스(1MHz), 고속 모드(3.4MHz) 등 다양한 속도를 지원합니다
I2C의 동작 원리
- 시작 조건(Start Condition): 마스터가 SDA 라인을 낮게 유지하면서 SCL 라인을 낮게 하여 통신을 시작합니다.
- 주소 전송: 마스터는 슬레이브 주소와 읽기/쓰기 비트를 전송합니다.
- ACK/NACK 비트: 슬레이브는 주소를 인식하면 ACK 비트를 보내고, 인식하지 못하면 NACK 비트를 보냅니다.
- 데이터 전송: 마스터와 슬레이브 간에 데이터를 주고받습니다.
- 정지 조건(Stop Condition): 마스터가 SDA 라인을 높게 유지하면서 SCL 라인을 높게 하여 통신을 종료합니다
I2C의 장점과 단점
- 장점:
- 두 개의 와이어만 사용하여 간단한 배선
- 여러 마스터와 슬레이브를 지원하는 유연한 구조
- 널리 사용되는 표준 프로토콜
- 단점:
- SPI보다 느린 데이터 전송 속도
- 하드웨어 구현이 다소 복잡할 수 있음
I2C는 마이크로컨트롤러, 센서, 메모리 장치 등 다양한 임베디드 시스템에서 널리 사용됩니다.
시리얼 통신(Serial Communication)은 데이터를 한 비트씩 순차적으로 전송하는 통신 방식입니다.
이 방식은 적은 수의 신호선을 사용하여 데이터를 주고받기 때문에, 비용이 저렴하고 배선이 간단합니다
시리얼 통신의 주요 특징
- 단순한 배선: 데이터 전송을 위한 TX(송신)와 RX(수신) 두 개의 라인만 필요합니다.
- 비동기 및 동기 통신: 시리얼 통신은 클럭 신호를 사용하지 않는 비동기 통신과 클럭 신호를 사용하는 동기 통신으로 나뉩니다.
- 다양한 프로토콜: UART, SPI, I2C 등 다양한 시리얼 통신 프로토콜이 있습니다.
시리얼 통신의 종류
- UART (Universal Asynchronous Receiver/Transmitter):
- 비동기 통신: 클럭 신호 없이 데이터 전송
- 구성: TX, RX 라인 사용
- 용도: 마이크로컨트롤러 간 통신, PC와의 통신 등
- SPI (Serial Peripheral Interface):
- 동기 통신: 클럭 신호 사용
- 구성: SCLK(클럭), MOSI(마스터 출력 슬레이브 입력), MISO(마스터 입력 슬레이브 출력), SS(슬레이브 선택) 라인 사용
- 용도: 고속 데이터 전송, 센서 인터페이스 등
- I2C (Inter-Integrated Circuit):
- 동기 통신: 클럭 신호 사용
- 구성: SDA(데이터), SCL(클럭) 라인 사용
- 용도: 여러 슬레이브 장치와의 통신, 센서 인터페이스 등
시리얼 통신의 장점과 단점
- 장점:
- 적은 수의 신호선으로 간단한 배선
- 다양한 장치와의 호환성
- 저렴한 비용
- 단점:
- 상대적으로 낮은 데이터 전송 속도
- 긴 전송 거리에서 신호 저하 가능성
RS232는 컴퓨터에 바로 못 넣음
그래서 MCU에 CH340을 연결해서 연결함
그래서 초반에 받은 TTL처럼 생긴 거 사용
구조체가 엄청 많이 생김
MCU 통신에서 구조체를 사용하는 것은 데이터를 효율적으로 관리하고 전송하는 데 매우 유용합니다.
구조체는 여러 개의 변수를 하나의 단위로 묶어 새로운 데이터 타입을 만드는 방법입니다.
이를 통해 관련된 데이터를 그룹화하여 코드의 가독성과 유지보수성을 높일 수 있습니다.

구조체의 기본 개념
구조체는 서로 다른 데이터 타입을 하나의 단위로 묶을 수 있습니다. 예를 들어, 센서 데이터를 처리할 때 온도, 습도, 압력 등의 값을 하나의 구조체로 묶어 관리할 수 있습니다.
typedef struct {
float temperature;
float humidity;
float pressure;
} SensorData;
MCU 통신에서 구조체 사용 예시
MCU 간의 UART 통신에서 구조체를 사용하여 데이터를 전송하는 예제를 살펴보겠습니다.
- 구조체 정의: 먼저, 전송할 데이터를 구조체로 정의합니다.
typedef struct {
uint8_t id;
uint16_t value;
uint8_t status;
} DataPacket;
- 데이터 송신: 구조체 데이터를 UART로 송신하는 코드를 작성합니다.
void sendData(UART_HandleTypeDef *huart, DataPacket *packet) {
HAL_UART_Transmit(huart, (uint8_t*)packet, sizeof(DataPacket), HAL_MAX_DELAY);
}
- 데이터 수신: 구조체 데이터를 UART로 수신하는 코드를 작성합니다.
void receiveData(UART_HandleTypeDef *huart, DataPacket *packet) {
HAL_UART_Receive(huart, (uint8_t*)packet, sizeof(DataPacket), HAL_MAX_DELAY);
}
예제 코드
아래는 구조체를 사용하여 데이터를 송수신하는 전체 예제 코드입니다.
#include "main.h"
typedef struct {
uint8_t id;
uint16_t value;
uint8_t status;
} DataPacket;
UART_HandleTypeDef huart2;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
void sendData(UART_HandleTypeDef *huart, DataPacket *packet) {
HAL_UART_Transmit(huart, (uint8_t*)packet, sizeof(DataPacket), HAL_MAX_DELAY);
}
void receiveData(UART_HandleTypeDef *huart, DataPacket *packet) {
HAL_UART_Receive(huart, (uint8_t*)packet, sizeof(DataPacket), HAL_MAX_DELAY);
}
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
DataPacket packetToSend = {1, 1234, 0};
DataPacket packetReceived;
while (1) {
sendData(&huart2, &packetToSend);
HAL_Delay(1000);
receiveData(&huart2, &packetReceived);
}
}
이 예제에서는 DataPacket 구조체를 정의하고, 이를 사용하여 UART 통신을 통해 데이터를 송수신합니다.
구조체를 사용하면 관련된 데이터를 하나의 단위로 묶어 관리할 수 있어 코드의 가독성과 유지보수성이 향상됩니다.
void SystemClock_Config(void);
얘는 클락 세팅
와치독은 검사하다가 반응 없으면 리셋하는 기능
Watchdog Timer(WDT)는 시스템의 오작동을 감지하고 복구하기 위해 사용되는 타이머입니다.
주로 임베디드 시스템에서 사용되며, 시스템이 정상적으로 동작하지 않을 때 자동으로 리셋을 수행하여 시스템을 복구합니다

Watchdog Timer의 주요 기능
- 오작동 감지: 시스템이 일정 시간 동안 정상적으로 동작하지 않으면 WDT가 이를 감지합니다.
- 자동 리셋: 오작동이 감지되면 WDT가 시스템을 자동으로 리셋하여 복구합니다.
- 주기적 초기화: 시스템이 정상적으로 동작하는 동안 주기적으로 WDT를 초기화하여 타이머가 만료되지 않도록 합니다.
Watchdog Timer의 동작 원리
- 타이머 설정: WDT는 미리 정의된 시간 간격으로 설정됩니다.
- 타이머 초기화: 시스템이 정상적으로 동작하는 동안 주기적으로 WDT를 초기화합니다. 이를 "킥킹(kicking the dog)"이라고 합니다.
- 타이머 만료: 시스템이 오작동하여 WDT를 초기화하지 못하면 타이머가 만료됩니다.
- 시스템 리셋: 타이머가 만료되면 WDT가 시스템을 리셋하여 복구합니다
Watchdog Timer의 사용 예시
STM32 마이크로컨트롤러에서 WDT를 설정하고 사용하는 예제를 살펴보겠습니다.
1. WDT 초기화
먼저, WDT를 초기화하는 코드를 작성합니다.
void MX_IWDG_Init(void)
{
IWDG_HandleTypeDef hiwdg;
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
hiwdg.Init.Reload = 4095; // 타이머 만료 시간 설정
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
}
2. WDT 초기화 코드 호출
main.c 파일에서 WDT 초기화 코드를 호출합니다.
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_IWDG_Init(); // WDT 초기화
while (1)
{
// 주기적으로 WDT 초기화
HAL_IWDG_Refresh(&hiwdg);
HAL_Delay(1000); // 1초 대기
}
}
이 예제에서는 WDT를 설정하고, 주기적으로 초기화하여 시스템이 정상적으로 동작하는 동안 타이머가 만료되지 않도록 합니다. 만약 시스템이 오작동하여 WDT를 초기화하지 못하면, WDT가 시스템을 리셋하여 복구합니다.
얘
회로 연결은 요렇게~~
driver에서 uart를 따옵니다
Txhalf도 있는데 그건 하나의 선으로 하는 거래요 그건 ㄴㄴ
폴링 방식 (Polling)
- 설명: 주기적으로 장치나 센서의 상태를 확인하는 방식입니다.
- 특징: CPU가 계속해서 장치에 "데이터가 있나요?"라고 묻습니다.
- 장점: 구현이 간단하고, 제어가 쉬움.
- 단점: CPU 자원을 많이 소모하고, 효율이 낮음.
인터럽트 방식 (Interrupt)
- 설명: 장치나 센서에서 데이터가 준비되면 CPU에 신호를 보내는 방식입니다.
- 특징: 장치가 "데이터가 준비됐어요!"라고 CPU에 알려줍니다.
- 장점: CPU 자원을 절약하고, 효율이 높음.
- 단점: 구현이 복잡할 수 있음.
이 두 가지 방식은 각각의 장단점이 있어서 상황에 따라 적절히 선택해서 사용합니다.

<<짧게 줄이면>>
v폴링 방식
받았는지 계속 묻는 것
인터럽트 방식은
받으면 알아서 대답해 주는 거
오늘도 미친 하루였다...
요기까지

'KG_KAIROS > MCU (Arduino & STM32)' 카테고리의 다른 글
[KG_KAIROS] 서보모터 각도제어, HEX 프로토콜 (0) | 2024.09.04 |
---|---|
⏳ DMA,Falling,인터럽트란? (6) | 2024.09.03 |
[KG_KAIROS] STM32_CUBE IDE (0) | 2024.08.30 |
🦾[KG_KAIROS] RobotArm 제작!! (0) | 2024.07.19 |
🏎️ [KG_KAIROS] 라인트레이싱 도전기 & 바퀴 편차 제어 (0) | 2024.07.18 |