STM32와 블루투스 개발 가이드: 기본부터 실전 프로젝트까지

블루투스 기초 및 STM32 개발 준비

1.1 블루투스 기술 개요

블루투스는 주로 짧은 거리(보통 10-100m)에서 데이터를 전송하기 위한 글로벌 무선 통신 표준입니다. 현대의 블루투스 기술은 크게 두 가지로 나뉩니다:

  • 클래식 블루투스(BR/EDR): 오디오 전송, 파일 공유 등에 사용됩니다. 예: HC-05 모듈
  • 저전력 블루투스(BLE): IoT 장치에 최적화되어 있으며 매우 낮은 전력을 소비합니다. 예: nRF51822 모듈

STM32 마이크로컨트롤러는 다양한 방식으로 블루투스 개발을 지원합니다:

  • 외부 모듈 연결: UART/SPI를 통해 블루투스 모듈(HC-05, JDY-31 등)을 연결합니다.
  • 내장 무선 솔루션: STM32WB 시리즈는 BLE 5.0 RF를 내장하고 있습니다.

1.2 개발 환경 설정

하드웨어 준비:

  • STM32 보드 (예: STM32F103C8T6 또는 STM32F407 Discovery)
  • 블루투스 모듈 (HC-05/HC-06 - 클래식 블루투스, nRF51 시리즈 - BLE)
  • USB to TTL 모듈 (AT 명령어 설정용)
  • 다양한 도프트 선

소프트웨어 도구 체인:

  1. IDE 선택:- STM32CubeIDE (공식 추천, CubeMX 통합) - Keil MDK (기존 ARM 개발 환경) - IAR Embedded Workbench
  2. 핵심 소프트웨어 컴포넌트:- STM32CubeMX: 그래픽 설정 도구 - HAL/LL 라이브러리: 하드웨어 추상화 레이어 드라이버 - BLE 스택 (예: BlueNRG-MS)
  3. 디버깅 도구:- 시리얼 디버깅 도우미 (SSCOM, Putty) - BLE 디버깅 앱 (nRF Connect, LightBlue)

하드웨어 연결 및 설정

2.1 블루투스 모듈 하드웨어 인터페이스

HC-05 모듈의 일반적인 연결 방법:


HC-05    STM32
VCC  →  3.3V
GND  →  GND
TXD  →  USART_RX (예: PA10)
RXD  →  USART_TX (예: PA9)
KEY  →  제어 핀 (AT 모드 전환용)

주의 사항:

  • 전압 매칭: 일부 블루투스 모듈은 3.3V에서 작동하며, 이를 5V 시스템에 직접 연결하면 모듈이 손상될 수 있습니다.
  • 신호 레벨: 5V MCU를 사용하는 경우 레벨 변환 회로가 필요할 수 있습니다.
  • 플로우 컨트롤: 고속 전송 시 RTS/CTS 하드웨어 플로우 컨트롤을 활성화하는 것이 좋습니다.

2.2 CubeMX 프로젝트 설정

  1. 클럭 설정:
  • 칩셋 모델에 따라 주 클럭(HSE/MSI) 설정
  • USART 클럭 활성화 확인
  1. USART 파라미터:
  • 보레이트: 9600/115200 등 (모듈과 일치해야 함)
  • 데이터 비트: 8비트
  • 정지 비트: 1비트
  • 검사 비트: 없음
  1. 인터럽트/DMA 설정:
  • USART 전역 인터럽트 활성화
  • DMA 채널 설정 (선택사항, 효율적인 데이터 전송용)
  1. GPIO 설정:
  • KEY 핀을 GPIO 출력으로 설정
  • 상태 핀 초기화 (예: STATE)

예제 코드:

UART_HandleTypeDef huart1;

void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  HAL_UART_Init(&huart1);
}

블루투스 모듈 초기화 및 AT 명령어

3.1 AT 모드 진입 방법

HC-05 모듈에는 두 가지 작업 모드가 있습니다:

  • 명령 모드(AT 모드):
  • 보레이트는 고정된 38400bps
  • 모듈 전원을 켜기 전 KEY 핀을 HIGH로 설정해야 합니다.
  • 상태 LED는 천천히 깜빡입니다(1초에 1회).

데이터 모드(패스스루 모드):

  • 설정된 보레이트로 통신합니다.
  • 상태 LED는 빠르게 깜빡입니다(1초에 2회).

모드 전환 프로세스:

// AT 모드 진입
HAL_GPIO_WritePin(KEY_GPIO_Port, KEY_Pin, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(KEY_GPIO_Port, KEY_Pin, GPIO_PIN_RESET);

3.2 일반적인 AT 명령어 집합

시리얼 포트를 통해 AT 명령어를 보내 모듈 설정을 변경합니다:

명령 기능 예시
AT 연결 테스트 AT\r\n
AT+NAME 장치 이름 설정 AT+NAME=MyDevice\r\n
AT+PSWD 페어링 비밀번호 설정 AT+PSWD=1234\r\n
AT+UART 보레이트 설정 AT+UART=115200,0,0\r\n
AT+ROLE 마스터/슬레이브 모드 설정 AT+ROLE=0\r\n (0=슬레이브)

AT 명령어 전송 코드:

void Send_AT_Command(char *cmd)
{
  HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), HAL_MAX_DELAY);
  HAL_Delay(100);
  
  uint8_t response[100];
  HAL_UART_Receive(&huart1, response, sizeof(response), 100);
  printf("응답: %s\n", response);
}

데이터 통신 실전

4.1 기본 송수신 구현

데이터 송신:

char message[] = "Hello Bluetooth!";
HAL_UART_Transmit(&huart1, (uint8_t*)message, strlen(message), HAL_MAX_DELAY);

인터럽트 수신:

uint8_t rx_data;
HAL_UART_Receive_IT(&huart1, &rx_data, 1);

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart->Instance == USART1){
    printf("받음: %c\n", rx_data);
    HAL_UART_Receive_IT(&huart1, &rx_data, 1); // 다시 수신 재개
  }
}

저전력 블루투스(BLE) 개발

5.1 STM32WB 시리즈 개발

STM32WB 시리즈는 Cortex-M4 애플리케이션 코어와 Cortex-M0+ 무선 코어를 포함한 듀얼 코어 아키텍처를 가지고 있으며, BLE 5.0을 지원합니다.

개발 과정:

  1. STM32CubeWB 펌웨어 패키지 설치
  2. 무선 코프로세서(RFU) 설정
  3. BLE 프로토콜 스택 API 사용

핵심 API:

// BLE 프로토콜 스택 초기화
aci_hal_init();

// 장치 주소 설정
aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET, 
                         CONFIG_DATA_PUBADDR_LEN, 
                         bdaddr);

// 광고 시작
aci_gap_set_discoverable(ADV_IND, 
                        ADV_INTERVAL_MIN, 
                        ADV_INTERVAL_MAX, 
                        PUBLIC_ADDR, 
                        NO_WHITE_LIST_USE, 
                        dev_name_len, 
                        dev_name, 
                        0, NULL, 0, 0);

태그: STM32 Bluetooth BLE MCU WirelessCommunication

6월 10일 22:23에 게시됨