강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

ghjnbo님의 프로필 이미지
ghjnbo

작성한 질문수

PCB HW설계 실무 : STM32를 활용한 Mixed-signal 보드 설계 프로젝트

32강 debugging pin 설계 강의 관련 질문 드립니다.

해결된 질문

작성

·

29

0

global label로 JTMS_F407을 PB14, PB12에 연결하고 NTRST_F407은 PB13에, JTCLK_F407은 PB0에 연결한 이유가 무엇인지 궁금합니다. PB14, PB12가 SPI2_MISO/ USART3_RTS(9) TIM1_CH2N (9) 이런 기능을 할 수 있다고 datasheet에 나와있던데 매인 mcu와 디버깅용 muc가 spi나 usart 통신을 하게 하기위해 PB14, PB12에 연결한건가요? 그렇다면 PB14,PB12가 아니여도 통신 방식에 맞게 datasheet를 보고 핀을 선택해서 해당 핀을 이용해도 되는건가요?

답변 1

0

안녕하세요, 답변 남겨드립니다.

질문 주신 “JTMS_F407을 PB14, PB12에, NTRST_F407을 PB13에, JTCLK_F407을 PB0에 연결”은, 해당 핀들이 SPI나 USART 같은 주변장치 통신을 하려고 “그 기능을 쓰기 위해” 선택됐다기보다는, 디버깅 인터페이스(JTAG/SWD) 신호를 보드 안에서 “어느 GPIO로 내보낼지”를 정한 설계 선택으로 보는 게 더 정확합니다. STM32F4 계열의 경우 디버그 포트는 Arm의 SWJ-DP(Serial Wire/JTAG Debug Port)이고, JTAG의 TMS/TCK는 SWDIO/SWCLK와 핀을 공유하며 2선(SWD) 또는 5선(JTAG)으로 디버깅이 가능하다는 점이 데이터시트에도 명시돼 있습니다.

여기서 핵심은 “타깃 MCU(예: STM32F407) 쪽의 SWDIO/SWCLK 같은 디버그 핀은 사실상 고정(기능적으로 강하게 규정)”인 반면, “보드 내 디버깅용 MCU(예: STM32F103 등) 쪽에서 그 신호를 구동/샘플링하는 핀은 설계자가 비교적 자유롭게 정할 수 있다”는 점입니다. 즉, 디버깅용 MCU가 타깃 MCU를 프로그래밍/디버깅하는 역할(일종의 ST-LINK 류 역할)을 한다면, 디버깅용 MCU의 특정 GPIO들을 TMS/SWDIO, TCK/SWCLK, nRESET(nTRST/NRST 계열) 같은 선에 매핑해서 쓰게 되는데, 이때 그 GPIO가 “SPI2_MISO가 될 수 있다/USART가 될 수 있다” 같은 표기는 단지 대체기능(AF) 후보일 뿐이고, 실제로는 그냥 GPIO로 써도 됩니다. 인프런 커뮤니티의 유사 Q&A에서도 “데이터시트의 단순 핀명만 보고 끝내기보다, 디버그 신호의 의미를 라벨로 명확히 해서 회로 가독성과 호환성을 높이려는 관례”라는 취지로 설명하고 있습니다.

그렇다면 왜 하필 PB12, PB13, PB14, PB0 같은 조합이 나왔느냐는 부분은 “전기적/펌웨어적/PCB 배치적 실용성” 쪽 이유가 큽니다. 현업에서 디버그 라인 핀을 고를 때는 보통 첫째, 부팅 스트랩(BOOT0/BOOT1), 크리스털, 리셋 등 보드 생존에 치명적인 핀을 피합니다. 둘째, 다른 핵심 인터페이스(Ethernet RMII, USB, 고속 ADC/DAC 등)와 충돌 가능성이 낮은 핀을 고릅니다. 셋째, 같은 GPIO 포트에 몰아두면 펌웨어에서 한 번의 레지스터 접근으로 여러 신호를 동시에 토글/샘플링할 수 있어 타이밍 스큐를 줄이고 속도를 올리기 유리합니다. 예를 들어 TMS, TCK, TDI를 모두 GPIOB에 몰아두면, GPIOB->BSRR 한 번(32bit write 1회)로 여러 핀을 동시에 set/reset할 수 있어서, 개별 핀을 순차적으로 건드릴 때 생기는 수십 ns 단위의 상대 지연을 줄일 수 있습니다. Cortex-M에서 GPIO 토글이 루프당 수십~수백 ns 수준으로 동작한다고 보면, 이런 “같은 포트 집중”은 SWD 클록을 1 MHz에서 2~4 MHz 수준으로 끌어올릴 때 체감 차이가 나오는 편입니다(보드 배선 길이, 프로브, 시리즈 저항 유무에 따라 달라집니다). 또 PB12~PB15는 STM32F1에서 SPI2가 걸려 있는 대표적인 핀 묶음이라, 나중에 “JTAG 비트뱅잉을 SPI 하드웨어를 부분적으로 활용해 가속” 같은 확장 아이디어를 남기는 설계도 실제로 있습니다(예: SCK=TCK, MOSI=TDI, MISO=TDO처럼 데이터/클록 경로를 하드웨어로 보내고 TMS만 GPIO로 제어). 다만 이 케이스에서 JTCLK가 PB0로 간 점은, 보드 내 다른 용도(예: PB13을 LED/인터럽트/다른 라인으로 이미 사용)나 라우팅 편의 때문에 클록 라인을 다른 위치로 빼는 타협이 있었을 가능성이 큽니다. 이 부분은 회로도에서 “PB13이 다른 넷과 겹치는지”, “PB0가 커넥터/저항 네트워크 근처인지”를 보면 설계 의도가 더 명확해집니다.

질문하신 “PB14, PB12가 아니라도 통신 방식에 맞게 데이터시트를 보고 골라도 되느냐”에 대해서는, 디버그 라인 관점에서는 “네, 원칙적으로는 된다”가 맞습니다. 단, 조건이 있습니다. 그 핀들이 디버깅용 MCU 펌웨어에서 실제로 GPIO로 구동/입력 가능해야 하고, 부팅 직후부터 외부에 이상 레벨을 강하게 내보내서 타깃을 오동작시키지 않아야 하며, 보드 제작/검증 관점에서 표준 ARM 10핀(SWD) 헤더 같은 외부 디버거 연결 경로와 충돌하지 않게 구성돼야 합니다. 현실적인 가이드로는, 보드 안 SWD/SWCLK 라인 배선 길이가 5 cm 이내이고(왕복 리턴패스 포함), 22~47 ohm 시리즈 저항을 클록/데이터에 넣고, 그라운드 레퍼런스를 가까이 두면 2~4 MHz 정도는 비교적 안정적으로 나오는 경우가 많습니다. 반대로 10 cm 이상 길어지거나 커넥터/케이블이 길어지면 링잉이 커져서 1 MHz 이하로 낮춰야 안정화되는 사례도 흔합니다. 이런 정량 값은 “절대 규격”이라기보다, 현장에서 디버그 안정성 튜닝할 때 자주 나오는 경험치 범위로 이해하시면 좋습니다.

추가로 한 가지 짚고 넘어가실 게, 질문에서 “글로벌 라벨로 JTMS_F407을 PB14, PB12에 연결”이라고 하셨는데, KiCad/OrCAD에서 같은 글로벌 라벨을 두 군데에 붙이면 그 둘은 전기적으로 같은 넷(쇼트)입니다. 따라서 PB14와 PB12가 “같은 MCU의 두 핀”에 동시에 같은 라벨로 직결돼 있다면 일반적으로는 권장되지 않습니다(한쪽이 출력일 때 충돌 위험). 보통은 PB14는 디버그 MCU 핀, PB12는 커넥터나 점퍼/0옴 저항을 지난 다른 지점처럼 “서로 다른 부품의 핀”인 경우가 많습니다. 이 구조는 실무에서 디버그 신호를 “외부 디버거로도 빼고, 온보드 디버거로도 연결”하려고 점퍼(0 ohm, solder bridge, 2:1 mux 등) 옵션을 주는 패턴에서 자주 나옵니다.

정리하면, 해당 핀 선택은 SPI/USART 통신을 하려는 목적이라기보다 디버깅 신호를 어떤 GPIO로 구성할지(그리고 라우팅/포트 집중/확장성까지) 고려한 설계 선택일 가능성이 높고, 다른 핀으로 바꿔도 되지만 부팅 안정성, 포트 충돌, 디버그 신호 품질(배선 길이/시리즈 저항/그라운드 리턴)까지 함께 만족하도록 고르시는 게 핵심입니다.

ghjnbo님의 프로필 이미지
ghjnbo

작성한 질문수

질문하기