KG_KAIROS/MCU (Arduino & STM32)

[KG_KAIROS] EXTI와 Rx/Tx 제어 설명

projectlim 2024. 9. 2. 12:55
728x90
반응형
SMALL

EXTI는 External Interrupt의 약자로, 외부 인터럽트를 처리하는 기능을 의미합니다.

외부 인터럽트는 마이크로컨트롤러가 외부 장치에서 발생하는 신호를 감지하고,

이를 처리하기 위해 프로그램의 흐름을 잠시 변경하는 메커니즘입니다.

EXTI의 주요 기능

  1. 엣지 감지: EXTI는 신호의 상승 엣지 또는 하강 엣지를 감지하여 인터럽트를 발생시킬 수 있습니다.
  2. 마스크 레지스터: 특정 인터럽트를 활성화(Enable)하거나 비활성화(Disable)할 수 있습니다.
  3. 펜딩 레지스터: 인터럽트가 발생했는지 여부를 기록합니다.
  4. 우선순위 설정: 여러 인터럽트가 동시에 발생할 경우, 우선순위를 설정하여 처리 순서를 결정합니다.

EXTI의 동작 과정

  1. 신호 감지: 외부 장치에서 신호가 발생하면, EXTI가 이를 감지합니다.
  2. 트리거 모드 설정: 설정된 엣지 감지 모드에 따라 신호를 파악합니다.
  3. 마스크 확인: 마스크 레지스터를 통해 해당 인터럽트가 활성화되어 있는지 확인합니다.
  4. 펜딩 레지스터 설정: 인터럽트가 발생하면 펜딩 레지스터의 해당 비트를 설정합니다.
  5. 인터럽트 서비스 루틴(ISR) 실행: 인터럽트가 발생하면, 프로세서는 ISR을 실행하여 해당 인터럽트를 처리합니다.

ISR은 Interrupt Service Routine의 약자로, 인터럽트가 발생했을 때 실행되는 특별한 함수나 코드 블록을 의미합니다.

ISR은 마이크로컨트롤러나 프로세서가 외부 또는 내부 이벤트를 처리하기 위해 사용됩니다.

ISR의 주요 특징

  1. 빠른 응답: ISR은 인터럽트가 발생하면 즉시 실행되어야 하므로, 일반적으로 짧고 빠르게 실행됩니다.
  2. 우선순위: 여러 인터럽트가 동시에 발생할 수 있기 때문에, ISR은 우선순위에 따라 실행됩니다.
  3. 상태 저장: ISR이 실행되기 전에 현재 프로세서의 상태(레지스터 값 등)를 저장하고, ISR이 끝난 후 복원합니다.
  4. 재진입 불가: 대부분의 ISR은 재진입이 불가능하도록 설계되어 있어, 하나의 ISR이 실행되는 동안 다른 인터럽트가 발생해도 해당 ISR이 끝날 때까지 대기합니다.

ISR의 동작 과정

  1. 인터럽트 발생: 외부 또는 내부 이벤트가 발생하여 인터럽트 신호가 생성됩니다.
  2. 인터럽트 감지: 프로세서가 인터럽트를 감지하고 현재 실행 중인 작업을 중단합니다.
  3. 상태 저장: 현재 프로세서의 상태를 저장합니다.
  4. ISR 실행: 해당 인터럽트에 대응하는 ISR을 실행합니다.
  5. 상태 복원: ISR 실행이 완료되면 저장된 상태를 복원하고, 중단된 작업을 재개합니다.

 

시리얼 핀 2개만 사용할거라

 

 클락 셋팅

 

RCC에서 HSE랑 LSE는 왜 쓰는거지?

HSE는 마이크로 컨트롤러 돌릴 때

LSE는 시간 쓸 때

이건 왜 써?
디버거

 

INTERUPT 사용하려면 NVIC를 가서 선택 해야함.

 

제네레이터 돌리면

 

요래 나옵니다

 

F3으로 들어가면 요래 연결됨

 

GPIO에도 클락이 들어가있음.

 

RCC는 Reset and Clock Control의 약자로, STM32 마이크로컨트롤러에서 시스템의 리셋과 클럭을 관리하는 중요한 모듈입니다. RCC는 다양한 클럭 소스를 선택하고, 이를 분주하여 시스템의 각 부분에 적절한 클럭을 제공하는 역할을 합니다.

RCC의 주요 기능

  1. 클럭 소스 선택: 내부 고속 클럭(HSI), 외부 고속 클럭(HSE), 내부 저속 클럭(LSI), 외부 저속 클럭(LSE) 등 다양한 클럭 소스를 선택할 수 있습니다.
  2. PLL 설정: Phase-Locked Loop(PLL)를 사용하여 클럭 주파수를 증폭하거나 조정할 수 있습니다.
  3. 분주기 설정: AHB, APB1, APB2 버스에 대한 클럭 분주기를 설정하여 각 버스에 적절한 클럭을 제공합니다.
  4. 리셋 관리: 시스템 리셋, 주변 장치 리셋 등을 관리합니다.

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. 이벤트 처리 (대세)

 

 

extern 선언 안해주면 에러뜸

 

 

안 돌아감...

 

왜지??

 

SH의 캐리로 해결함.

메인으로 싹 다 넣으라고 함.

 


 

 

특강!!

stm32로 로봇 slave 만들기

 

이제는 uart로!!

시리얼 통신 공부!!

시리얼 통신은 두 장치 간에 데이터를 주고받기 위한 기본적인 통신 방법입니다.

UART(Universal Asynchronous Receiver/Transmitter)는 시리얼 통신을 구현하는 데 사용되는 하드웨어 모듈입니다.

시리얼 통신의 기본 개념

  1. 보레이트(Baud Rate): 초당 전송되는 비트 수를 의미합니다. 예를 들어, 9600bps는 초당 9600비트를 전송합니다.
  2. 데이터 비트(Data Bits): 한 번에 전송되는 데이터의 비트 수입니다. 일반적으로 8비트를 사용합니다.
  3. 패리티 비트(Parity Bit): 오류 검출을 위한 비트입니다. 짝수(Even), 홀수(Odd), 없음(None)으로 설정할 수 있습니다.
  4. 스톱 비트(Stop Bits): 데이터 전송의 끝을 나타내는 비트입니다. 1비트 또는 2비트로 설정할 수 있습니다.

RS-232는 Recommended Standard 232의 약자로, 1960년에 도입된 직렬 통신 표준입니다.

주로 컴퓨터와 모뎀, 터미널 등 다양한 장치 간의 데이터 통신에 사용됩니다

232 번 규칙

RS-232의 주요 특징

  1. 전송 방식: 비동기식 시리얼 통신 방식을 사용합니다.
  2. 전송 속도: 일반적으로 9600bps에서 115200bps까지 다양한 보레이트를 지원합니다.
  3. 전압 레벨: 논리 1은 -3V에서 -15V, 논리 0은 +3V에서 +15V로 정의됩니다.
  4. 커넥터: 주로 DB9 또는 DB25 커넥터를 사용합니다.

RS-232의 구성 요소

  1. DTE (Data Terminal Equipment): 데이터 단말 장치로, 컴퓨터나 터미널이 해당됩니다.
  2. 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의 주요 특징

  1. 양방향 통신: I2C는 반이중(Half-Duplex) 통신을 지원하여, 데이터 송신과 수신을 동일한 라인에서 번갈아 가며 수행합니다.
  2. 두 개의 와이어:
    • SDA (Serial Data): 데이터 전송 라인
    • SCL (Serial Clock): 클럭 신호 라인
  3. 마스터-슬레이브 구조: 하나의 마스터와 여러 슬레이브 장치가 연결될 수 있으며, 마스터가 클럭 신호를 제어합니다.
  4. 주소 지정: 각 슬레이브 장치는 고유한 주소를 가지며, 마스터는 이 주소를 사용하여 특정 슬레이브와 통신합니다.
  5. 속도: 표준 모드(100kHz), 패스트 모드(400kHz), 패스트 모드 플러스(1MHz), 고속 모드(3.4MHz) 등 다양한 속도를 지원합니다

I2C의 동작 원리

  1. 시작 조건(Start Condition): 마스터가 SDA 라인을 낮게 유지하면서 SCL 라인을 낮게 하여 통신을 시작합니다.
  2. 주소 전송: 마스터는 슬레이브 주소와 읽기/쓰기 비트를 전송합니다.
  3. ACK/NACK 비트: 슬레이브는 주소를 인식하면 ACK 비트를 보내고, 인식하지 못하면 NACK 비트를 보냅니다.
  4. 데이터 전송: 마스터와 슬레이브 간에 데이터를 주고받습니다.
  5. 정지 조건(Stop Condition): 마스터가 SDA 라인을 높게 유지하면서 SCL 라인을 높게 하여 통신을 종료합니다

I2C의 장점과 단점

  • 장점:
    • 두 개의 와이어만 사용하여 간단한 배선
    • 여러 마스터와 슬레이브를 지원하는 유연한 구조
    • 널리 사용되는 표준 프로토콜
  • 단점:
    • SPI보다 느린 데이터 전송 속도
    • 하드웨어 구현이 다소 복잡할 수 있음

I2C는 마이크로컨트롤러, 센서, 메모리 장치 등 다양한 임베디드 시스템에서 널리 사용됩니다. 

 

 


시리얼 통신(Serial Communication)은 데이터를 한 비트씩 순차적으로 전송하는 통신 방식입니다.

이 방식은 적은 수의 신호선을 사용하여 데이터를 주고받기 때문에, 비용이 저렴하고 배선이 간단합니다

시리얼 통신의 주요 특징

  1. 단순한 배선: 데이터 전송을 위한 TX(송신)와 RX(수신) 두 개의 라인만 필요합니다.
  2. 비동기 및 동기 통신: 시리얼 통신은 클럭 신호를 사용하지 않는 비동기 통신과 클럭 신호를 사용하는 동기 통신으로 나뉩니다.
  3. 다양한 프로토콜: UART, SPI, I2C 등 다양한 시리얼 통신 프로토콜이 있습니다.

시리얼 통신의 종류

  1. UART (Universal Asynchronous Receiver/Transmitter):
    • 비동기 통신: 클럭 신호 없이 데이터 전송
    • 구성: TX, RX 라인 사용
    • 용도: 마이크로컨트롤러 간 통신, PC와의 통신 등
  2. SPI (Serial Peripheral Interface):
    • 동기 통신: 클럭 신호 사용
    • 구성: SCLK(클럭), MOSI(마스터 출력 슬레이브 입력), MISO(마스터 입력 슬레이브 출력), SS(슬레이브 선택) 라인 사용
    • 용도: 고속 데이터 전송, 센서 인터페이스 등
  3. I2C (Inter-Integrated Circuit):
    • 동기 통신: 클럭 신호 사용
    • 구성: SDA(데이터), SCL(클럭) 라인 사용
    • 용도: 여러 슬레이브 장치와의 통신, 센서 인터페이스 등

시리얼 통신의 장점과 단점

  • 장점:
    • 적은 수의 신호선으로 간단한 배선
    • 다양한 장치와의 호환성
    • 저렴한 비용
  • 단점:
    • 상대적으로 낮은 데이터 전송 속도
    • 긴 전송 거리에서 신호 저하 가능성

 

 

RS232는 컴퓨터에 바로 못 넣음

그래서 MCU에 CH340을 연결해서 연결함

그래서 초반에 받은 TTL처럼 생긴 거 사용

 


RCC Conectivity 설정

 

nvic가서 usart설정 완료
새로 생김

구조체가 엄청 많이 생김

MCU 통신에서 구조체를 사용하는 것은 데이터를 효율적으로 관리하고 전송하는 데 매우 유용합니다.

구조체는 여러 개의 변수를 하나의 단위로 묶어 새로운 데이터 타입을 만드는 방법입니다.

이를 통해 관련된 데이터를 그룹화하여 코드의 가독성과 유지보수성을 높일 수 있습니다.

구조체의 기본 개념

구조체는 서로 다른 데이터 타입을 하나의 단위로 묶을 수 있습니다. 예를 들어, 센서 데이터를 처리할 때 온도, 습도, 압력 등의 값을 하나의 구조체로 묶어 관리할 수 있습니다.

typedef struct {
    float temperature;
    float humidity;
    float pressure;
} SensorData;

MCU 통신에서 구조체 사용 예시

MCU 간의 UART 통신에서 구조체를 사용하여 데이터를 전송하는 예제를 살펴보겠습니다.

  1. 구조체 정의: 먼저, 전송할 데이터를 구조체로 정의합니다.
typedef struct {
    uint8_t id;
    uint16_t value;
    uint8_t status;
} DataPacket;
  1. 데이터 송신: 구조체 데이터를 UART로 송신하는 코드를 작성합니다.
void sendData(UART_HandleTypeDef *huart, DataPacket *packet) {
    HAL_UART_Transmit(huart, (uint8_t*)packet, sizeof(DataPacket), HAL_MAX_DELAY);
}
  1. 데이터 수신: 구조체 데이터를 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의 주요 기능

  1. 오작동 감지: 시스템이 일정 시간 동안 정상적으로 동작하지 않으면 WDT가 이를 감지합니다.
  2. 자동 리셋: 오작동이 감지되면 WDT가 시스템을 자동으로 리셋하여 복구합니다.
  3. 주기적 초기화: 시스템이 정상적으로 동작하는 동안 주기적으로 WDT를 초기화하여 타이머가 만료되지 않도록 합니다.

Watchdog Timer의 동작 원리

  1. 타이머 설정: WDT는 미리 정의된 시간 간격으로 설정됩니다.
  2. 타이머 초기화: 시스템이 정상적으로 동작하는 동안 주기적으로 WDT를 초기화합니다. 이를 "킥킹(kicking the dog)"이라고 합니다.
  3. 타이머 만료: 시스템이 오작동하여 WDT를 초기화하지 못하면 타이머가 만료됩니다.
  4. 시스템 리셋: 타이머가 만료되면 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가 시스템을 리셋하여 복구합니다.

 

요롷게 바꿔주면 hse사용

 

 

회로 연결은 요렇게~~

driver에서 uart를 따옵니다

 

Txhalf도 있는데 그건 하나의 선으로 하는 거래요 그건 ㄴㄴ

 

 

폴링 방식 (Polling)

  • 설명: 주기적으로 장치나 센서의 상태를 확인하는 방식입니다.
  • 특징: CPU가 계속해서 장치에 "데이터가 있나요?"라고 묻습니다.
  • 장점: 구현이 간단하고, 제어가 쉬움.
  • 단점: CPU 자원을 많이 소모하고, 효율이 낮음.

인터럽트 방식 (Interrupt)

  • 설명: 장치나 센서에서 데이터가 준비되면 CPU에 신호를 보내는 방식입니다.
  • 특징: 장치가 "데이터가 준비됐어요!"라고 CPU에 알려줍니다.
  • 장점: CPU 자원을 절약하고, 효율이 높음.
  • 단점: 구현이 복잡할 수 있음.

이 두 가지 방식은 각각의 장단점이 있어서 상황에 따라 적절히 선택해서 사용합니다. 

 

<<짧게 줄이면>>

v폴링 방식

받았는지 계속 묻는 것

 

인터럽트 방식은

받으면 알아서 대답해 주는 거

 

오늘도 미친 하루였다...

요기까지

 

728x90
반응형
LIST