XM10 Extension Module SDK v2.7.0¶
릴리즈 날짜: 2026-09-08 | 대상 보드: Rev 1.1 · Rev 2.0 | 새 API: 범용 Serial (Rev 2.0)
한눈에 보기¶
XM10 이 바깥 장비와 시리얼로 대화할 수 있게 된 릴리즈입니다.
- 범용 Serial API 가 생겼습니다. XM10 의 External UART(PD5/PD6)를
XM_API만으로 쓸 수 있습니다. XM10 두 대를 선으로 잇거나, 아두이노·PC·다른 MCU 와 여러분이 정한 형식으로 통신할 수 있습니다. - 예제 43 이 추가됐습니다. XM10 두 대가 서로 데이터를 주고받는 ping-pong 예제입니다. Rev 2.0 예제가 45 → 46 개가 됐습니다.
- SDK 안의 폴더 이름 두 개가 바뀌었습니다. SDK 를 그대로 쓰시면 할 일이 없지만, 빌드 스크립트를 직접 손보신 분은 확인이 필요합니다 (아래 "꼭 확인할 변경").
- 센서 허브 연결 안정성을 개선했습니다. IMU·EMG 허브가 간헐적으로 끊기던 현상이 줄어들도록 바꿨습니다. 아직 실제 보드에서는 확인하지 못했습니다.
- 삭제되거나 이름이 바뀐 API 는 없습니다. 기존 코드는 재빌드만 하면 됩니다.
Rev 1.1 은 펌웨어 변경이 없습니다. 버전 번호만 맞췄습니다.
꼭 확인할 변경 3 가지¶
0. Xsens MTi-630 을 쓰고 계셨다면 — 기본 빌드에서 그 API 가 빠졌습니다 ⚠️¶
해당되는 분만 보시면 됩니다. XM_AttachXsensMTi630() / XM_ConfigureXsensMTi630() 를
코드에서 부르고 계셨다면, v2.7.0 으로 올린 뒤 "선언되지 않은 함수" 컴파일 에러가 납니다.
왜 그런가: External UART 는 포트가 하나뿐이라 범용 Serial API 와 Xsens 드라이버를 동시에 쓸 수 없습니다. 둘이 겹쳐 쓰다 조용히 오작동하는 대신, 빌드할 때 둘 중 하나만 고르도록 막았습니다.
어떻게 하나 — XM_FW/System/Config/module.h 를 열어 한 줄만 바꾸고 다시 빌드하세요.
1 로 바꾸면 Xsens API 가 돌아오고, 대신 범용 Serial API 쪽이 사라집니다.
Xsens 를 안 쓰시면 아무것도 하실 필요가 없습니다.
1. SDK 안의 폴더 이름 두 개가 바뀌었습니다 (Rev 2.0 만)¶
| 예전 | 지금 |
|---|---|
XM_FW/IOIF/ |
XM_FW/phoundation-ioif/ |
XM_FW/AGR_MW/ |
XM_FW/phoundation-mw/ |
대부분은 아무것도 하실 필요가 없습니다. 동봉된 CMakeLists.txt 와 .cproject 는 이미 새 경로로 맞춰 두었고, #include "ioif_agrb_uart.h" 처럼 파일명만 쓰는 방식은 영향받지 않습니다.
확인이 필요한 경우는 하나입니다 — 본인 빌드 설정에 옛 폴더 경로를 직접 적어 두신 경우입니다. 예를 들어 include 경로에 XM_FW/IOIF/Inc 를 손으로 추가하셨다면 XM_FW/phoundation-ioif/Inc 로 바꿔 주세요. #include "XM_FW/AGR_MW/..." 처럼 경로를 포함해 적은 include 가 있다면 그것도 마찬가지입니다.
Rev 1.1 SDK 는 종전 이름 그대로입니다.
2. 센서 허브 연결 안정성이 개선됐습니다 (Rev 2.0)¶
센서 데이터가 몰릴 때 IMU·EMG 허브와의 CAN-FD 연결이 간헐적으로 끊기던 현상이 줄어들도록 바꿨습니다.
⚠️ 이 변경은 아직 실제 보드에서 확인하지 못했습니다. IMU·EMG 허브를 쓰시는 분은 v2.6.0 대비 이 부분이 바뀌었다는 점을 알아 두시고, 평소와 다른 동작이 보이면 알려 주세요.
새로 생긴 API — 범용 Serial (Rev 2.0)¶
XM10 의 External UART(PD5 = TX, PD6 = RX)를 여러분이 자유롭게 쓸 수 있게 열었습니다. 상대가 무엇이든 상관없습니다 — XM10, 아두이노, PC, 라즈베리파이, 다른 MCU 보드.
void Control_Setup(void)
{
XM_SetExternalUartBaudrate(XM_UART_BAUD_115200); // 상대와 같은 값
XM_AttachExternalUart(OnSerialRx); // 수신 시작
}
void Control_Loop(void)
{
/* 받은 바이트 해석 (콜백이 아니라 여기서!) */
/* 보내기 — 기다리지 않습니다 */
XM_SendExternalUartData(buf, len);
}
| 함수 | 하는 일 |
|---|---|
XM_SetExternalUartBaudrate(baud) |
통신 속도 (9600 ~ 921600) |
XM_AttachExternalUart(콜백) |
수신 시작. Control_Setup() 에서 1 회 |
XM_SendExternalUartData(buf, len) |
보내기 — 기다리지 않음, 1 회 최대 128 바이트 |
XM_SendExternalUartDataBlocking(buf, len) |
보내기 — 완료까지 대기. Control_Setup() 전용 |
XM_EnsureExternalUartRxArmed() |
수신이 멈췄으면 되살림 (100 ms 주기 권장) |
📋 하드웨어 설정 — 상대 장비를 여기에 맞추세요¶
보드 쪽 설정은 이미 고정되어 있습니다. 아래가 실제 값이며, 상대 장비를 이 값에 맞추셔야 통신됩니다.
| 항목 | 값 | 바꿀 수 있나 |
|---|---|---|
| 페리페럴 | USART2 (비동기) | ✗ |
| TX 핀 | PD5 (넷 이름 EXT_UART_TX) |
✗ |
| RX 핀 | PD6 (넷 이름 EXT_UART_RX) |
✗ |
| 로직 레벨 | 3.3 V — 5 V 직결 금지 | ✗ |
| 기본 속도 | 921600 bps | ✅ XM_SetExternalUartBaudrate() (9600 ~ 921600) |
| 데이터 / 패리티 / 스톱 | 8 / 없음 / 1 | ✗ |
| 흐름 제어 | 없음 — RTS/CTS 선 사용 안 함 | ✗ |
| 1 회 송신 상한 | 128 바이트 (XM_EXT_UART_TX_MAX_BYTES) |
✗ |
한 줄로: 921600 8N1, 흐름제어 없음. 속도만 양쪽 똑같이 바꿀 수 있고, 8N1 은 펌웨어에서 바꿀 수단이 없습니다.
GPIO 에는 풀업/풀다운이 없습니다. 상대가 꺼져 있거나 선이 빠지면 RX 선이 떠 있어 잡음을 데이터로 오인할 수 있습니다.
🛑 Rev 1.1 보드에서는 이 배선을 하지 마세요. Rev 1.1 에는 External UART 포트가 아예 없고(시리얼은 발바닥 센서용 UART7/UART8 뿐), PD6 은
USB_PWR_ON— USB 전원을 켜고 끄는 출력 핀입니다. 여기에 상대 보드의 TX 를 물리면 출력끼리 맞부딪칩니다.
알아두셔야 할 3 가지¶
① 통신 형식은 8N1 고정입니다. 데이터 8 비트 / 패리티 없음 / 스톱 1 비트. 바꿀 수 있는 건 속도뿐이니 상대 장비를 8N1 로 맞춰 주세요.
② 수신 콜백에서는 복사만 하세요.
static void OnSerialRx(const uint8_t* data, uint32_t len)
{
/* 내 버퍼로 복사만. 해석은 Control_Loop() 에서 */
}
이 콜백은 발바닥 센서(GRF)의 1 kHz 수신과 같은 곳에서 실행됩니다. 콜백에서 해석·계산·대기를 하면 그만큼 GRF 데이터가 늦어집니다. 그리고 data 포인터는 콜백이 끝나면 무효입니다 — 저장해 두지 말고 내용을 복사하세요.
③ 콜백 한 번이 메시지 하나가 아닙니다. 시리얼은 "메시지"가 아니라 "바이트 흐름"입니다. 5 바이트를 한 번에 보내도 받는 쪽에는 2 + 3 으로 쪼개져 올 수 있고, 다음 메시지가 붙어서 올 수도 있습니다. 메시지 경계는 직접 찾아야 합니다 — 예제 43 의 DrainAndParse() 가 그 방법(헤더를 찾아가며 조립)을 보여 줍니다.
XM_SendExternalUartData() 가 false 를 돌려주는 것은 에러가 아닙니다. "직전 전송이 아직 안 끝났다"는 뜻이니 다음 주기에 다시 부르면 됩니다. 1 kHz 제어 루프에서 매 틱 불러도 루프가 멈추지 않습니다.
예제¶
Ex.43 External UART Ping-Pong 이 추가됐습니다 (🛑 Rev 2.0 전용).
같은 펌웨어를 XM10 두 대에 굽고 선으로 이으면 1 초에 10 번씩 서로 메시지를 주고받습니다.
보드 A 보드 B
PD5 (TX) ───────────────────────► PD6 (RX)
PD6 (RX) ◄─────────────────────── PD5 (TX)
GND ──────────────────────── GND
- TX 와 RX 를 교차해야 합니다. TX-TX 로 이으면 아무것도 오지 않습니다.
- GND 를 반드시 이으세요.
- 3.3 V 로직입니다. 5 V 장비를 직결하면 보드가 손상됩니다.
디버거 Live Expressions 로 g_tx_count · g_rx_frame_ok · g_rx_bad_crc · g_peer_seq 를 보면서 단계별로 확인할 수 있습니다. 자세한 절차와 증상별 원인표는 예제 43 README 에 있습니다.
⚠️ 이 예제도 아직 실제 보드에서 확인하지 못했습니다. 두 보드가 실제로 바이트를 주고받는 것은 확인 전이니, 처음 돌려보실 때는 README 의 표로 단계별로 확인하세요.
Rev 2.0 예제는 이제 46 개, Rev 1.1 은 42 개입니다.
그 밖에 고친 것¶
- IMU 채널 LED 가 늦게 꺼지던 문제 — 허브 연결이 끊겼을 때 LED 상태가 즉시 반영되지 않던 것을 고쳤습니다.
- Ex.09 문서의 패킷 크기 표기 — 425 B 로 적혀 있던 Total Data 패킷 크기를 실제값 365 B 로 정정했습니다 (동작 변경 없음, 표기만).
- 리눅스에서 빌드가 안 되던 문제 — 헤더 파일명 대소문자가 실제 파일과 어긋난 곳 7 군데를 정정했습니다. 윈도우에서는 원래 문제없이 빌드되던 부분입니다.
다운로드¶
| 파일 | 대상 |
|---|---|
Rev2.0.zip |
Rev 2.0 보드용 SDK (예제 46 개) |
Rev1.1.zip |
Rev 1.1 보드용 SDK (예제 42 개) |
AGR_Bootloader.bin |
XM10 부트로더 — v2.6.0 과 동일본(이번 릴리즈에서 변경 없음) |
SUIT_H10_Binary_20260820.zip |
KIT H10 펌웨어 — v2.6.0 과 동일본 |
SUIT_ContentsFiles_20260820.zip |
H10 컨텐츠 파일 — v2.6.0 과 동일본 |
부트로더·H10 관련 3 개 파일은 v2.6.0 것을 그대로 다시 올린 것입니다. 이번 릴리즈는 XM10 펌웨어만 바뀌었고 그쪽은 변경이 없습니다.
압축을 풀 때 짧은 경로(예: C:\xm10\)에 푸세요. 경로가 깊으면 윈도우의 경로 길이 제한 때문에 빌드가 실패할 수 있는데, 이건 코드 문제가 아니라 경로 길이 문제입니다.
호환성¶
| 항목 | 내용 |
|---|---|
| 기존 코드 | 재빌드만 하면 됩니다. 삭제되거나 이름이 바뀐 공개 API 없음 |
| 빌드 설정을 직접 손본 경우 | 폴더 이름 변경 확인 필요 — 위 "꼭 확인할 변경 1" |
| Rev 1.1 | 펌웨어 변경 없음. 버전 번호만 v2.7.0 |
| 범용 Serial API | Rev 2.0 전용 |