ARM SWD 포트의 주소 미스터리

2728 단어 armswdfirmware
SWD(Serial Wire Debug)는
ARM 디버그 인터페이스. ARM 디버그 인터페이스 사양 v5의 일부입니다. 5월 프로젝트에서는 SWD 인터페이스를 통해 ARM 칩을 프로그래밍하거나 디버그해야 할 수 있습니다. 저에게 가장 혼란스러운 부분은 주소를 이해하는 것이었습니다. 이 글은 저와 같은 상황에 처한 분들에게 도움이 되고자 작성되었습니다.

SWD 인터페이스에는 프로세서 내부의 게이트웨이인 디버그 포트(DP)가 있습니다. 많은 액세스 포트(AP)에 대한 액세스를 제공합니다. 액세스 포트는 프로세서에 따라 다르며 둘 이상일 수 있습니다. 다양한 AP에 대한 자세한 내용은 다루지 않겠습니다. 나는 이 포스트에서 DP와 AP의 주소를 밝히고자 한다.

SWD 트랜잭션 패킷의 8비트 헤더는 다음과 같습니다.

----------------------------------------------------------
| Start | AP/DP | R/W | ADDR[0:1] | Parity | Stop | Park |
----------------------------------------------------------


헤더에는 주소 지정을 위해 예약된 2비트가 있습니다. SWD를 사용하기 위해 응용 프로그램을 작성하려는 사람은 2비트 주소로 무엇을 할 수 있는지 파악하려고 잠시 동안 이 단계에서 멈췄을 것입니다! 인터넷의 많은 예에서 DP 주소가 0x00, 0x04, 0x08 및 0x0C인 것에 대해 이야기할 것입니다. 이는 정확하지만 어떻게 이 8비트 주소를 2비트로 가질 수 있습니까? 답변은 ARM 디버그 아키텍처 문서here에 있습니다. 주소 [Bits A1:A0]의 하위 두 비트는 항상 00입니다. SWD 트랜잭션 패킷에서 이 두 비트와 함께 사용될 때, 즉 [Bits A3:A2]는 하나의 완전한 니블을 제공합니다.

A3 A2 A1 A0
0  0  0  0    = 0x0
0  1  0  0    = 0x4
1  0  0  0    = 0x8
1  1  0  0    = 0xC


그러나 0x00, 0x04, 0x08 및 0x0C의 상위 니블 '0'은 주소 0x00, 0x04, 0x08 및 0x0C를 만들기 위해 어디에서 왔습니까? 이는 선택 레지스터의 DP BANKSELECT 필드에서 가져옵니다. 아직 혼란스러우신가요? 그건 헷갈 린다.

DP에는 3개의 유용한 필드가 있는 32비트 "선택"레지스터가 있습니다.

Bits [31:24] -> Access port ID
Bits [23:8]  -> Reserved, not used
Bits [7:4]   -> AP Bank select
Bits [3:0]   -> DP Bank Select


DP 뱅크 선택 필드의 이 4비트(비트 3:0)는 DP 레지스터 주소의 상위 니블을 만듭니다. 전원을 켤 때 이 비트의 값은 DP 아키텍처 rev 0에서 항상 0입니다(다른 rev에서는 0이 아닐 수 있으며 그에 따라 주소가 변경됨). 따라서 전원을 켤 때의 레지스터 주소는 다음과 같습니다.Bits [3:0] of DP Bank Select + [A3 A2 A1 A0]
디버그 포트 주소는 다음과 같이 구성됩니다.
0x00
0x04
0x08
0x0C

이것은 디버그 포트 주소가 생성되는 방법을 설명합니다. 거기에 반전이 하나 더 있습니다. SWD 패킷 헤더에서 A[2:3]으로 표시된 주소 비트를 볼 수 있습니다. LSB가 버스에서 먼저 전송되기 때문에 비트 2가 먼저 기록됩니다. 원하는 주소가 0x08인 경우 이 두 비트는 10이 아닌 01로 쓰여지고 전송됩니다.

액세스 포트 레지스터에 액세스하려고 할 때 동일한 주소 지정 논리가 액세스 포트 주소에 적용됩니다. SWD 패킷의 비트 A3 및 A2에서 주소의 하위 니블까지 만듭니다. A1과 A0은 항상 0이므로 다음을 얻습니다.

A3 A2 A1 A0
0  0  0  0    = 0x0
0  1  0  0    = 0x4
1  0  0  0    = 0x8
1  1  0  0    = 0xC


디버그 포트 주소 지정과 유사하게 주소의 상위 니블은 선택 레지스터의 AP 뱅크 선택 필드에서 가져옵니다. 이들은 선택 레지스터의 비트 [7:4]입니다. 액세스 포트 #0의 레지스터 0x14에 액세스하려고 한다고 가정합니다. DP 선택 레지스터의 비트 [7:4]에 0x01을 기록하므로 이제 주소의 상위 니블이 0x1이 됩니다. DP는 이것을 비트 A3:A0과 결합하여 주소 0x14를 생성합니다. 따라서 효과적으로 AP에 액세스하는 2단계 프로세스입니다. 이 정보를 찾는 분들에게 도움이 되었으면 합니다.

좋은 웹페이지 즐겨찾기