2016-08-15 14 views
0

someones 코드를 이해하려고하는데 GPIO 영역 (0x4002 0000 - 0x4002 03FF)의 메모리 공간을 읽었지 만 GPIO 레지스터보다 높은 주소입니다 (0x24로만 이동합니다).ARM M3 : GPIO 주변 메모리 맵에서 '추가'공간 사용? 이럴 수있어?

0x4002 0024 위의 모든 추가 공간을 0x4002 03FFF 이하로 사용할 수 있습니까? 이 공간을 읽으면 어떻게 될까요?

편집 : 코드를 게시 할 수 있다는 것을 완전히 잊어 버렸습니다. 나는 나에게 두통의 원인이되는 선을 굵게 :

R0 = 0x15 

PUSH {R3,LR} ; 
ADD.W R0, R0, R0,LSL#1 ; 
MOV  GPIO_Port_A_Address, #0x40020000 
LSLS R0, R0, #2  ; 
ADDS R2, GPIO_Port_A_Address, R0 ; 
LDRB R2, [R2,#4]  ; 
MOVS R1, #1   ; 
LSL.W R1, R1, R2  ; 

LDR R0, [GPIO_Port_A_Address, R0]

UXTH R1, R1   ; 
BL  sub_8001ED8  ; 
MOVS R0, #0   ; 
POP  {R3,PC} ; 
+1

어떤 마이크로 컨트롤러인가? 생각하고있는 마이크로와 동일한 코드라도 찾고 있습니까? 유일한 '일반'측면은 주변 장치가있는 곳의 Cortex-M3 메모리 맵에서 0x40000000 - 0x5fffffff입니다. 그 이상의 것은 부품에 따라 다릅니다. – Notlikethat

+0

예, STM32F205입니다. 물론 코드가 작성된 uC에 대한 동일한 데이터 시트를 읽습니다. 나는 GPIO 지역에 대해 구체적으로 묻고 있는데, 이것이 내가 원래의 질문에서 언급 한 이유이다. – eibwen

+1

맞습니다. 그 문맥이 처음부터 질문에 있다면, 나는 묻지 않아도됩니다. 계속해서 "Cortex-M3"만 있으면 CPU 코어에 GPIO가 없으므로 "GPIO 영역"은 의미가 없습니다. 마찬가지로 우리가 볼 수없고 추론 할 수없는 "누군가의 코드"가 인터넷에서 임의로 잘못 식별 된 STM32F1 코드 (이 주소 범위는 DMA 컨트롤러가 될 수 있음)가 될 수 있다는 것을 알고 있기 때문에 질문이 잘못되었습니다. 좋은 질문에는 관련 세부 사항이 모두 포함되어 있습니다. – Notlikethat

답변

0

을 시작으로, 0x40020000 - 0x400223FF에서 그 이상하지만 여전히 범위 0x200의 모든 여러에 사는 다른 GPIO 포트가, 주변 CRC, RCC, 플래시 컨트롤러가 있습니다. 관련 메모리 맵은 RM0033 페이지 50에 있습니다 (Rev 3, 이전 버전이므로 페이지 번호가 잘못되었을 수 있습니다).

0x40023C00 - 0x40023FFF Flash interface register 
0x40023800 - 0x40023BFF RCC 
0x40023000 - 0x400233FF CRC 
0x40022000 - 0x400223FF GPIOI 
0x40021C00 - 0x40021FFF GPIOH 
0x40021800 - 0x40021BFF GPIOG 
0x40021400 - 0x400217FF GPIOF 
0x40021000 - 0x400213FF GPIOE 
0X40020C00 - 0x40020FFF GPIOD 
0x40020800 - 0x40020BFF GPIOC 
0x40020400 - 0x400207FF GPIOB 
0x40020000 - 0x400203FF GPIOA 

내가 계산할 수 있었던 가장 당신이 게시 한 코드는 일부 구현되지 않은 주소 (0x40020100, 0x400200FC)에 액세스하지, 그래서 내가 거기에 무슨 일이 일어나고 있는지 확실하지 않다, 또는 나는 경우 계산되지 않았다. STM32F207에서 테스트 할 때, 당신은 오류없이 이것에 읽고 쓸 수 있지만, 레지스터는 구현되지 않고 항상 0으로 읽혀질 수있다.

주변 장치 레지스터를 범용 메모리로 사용하는 것은 정말 좋은 생각입니다. 모든 비트가 R/W가 아닌 것은 아닙니다. 모든 주소가 구현되는 것은 아니며, 응용 프로그램 데이터를 기반으로 하드웨어를 구성하고 레지스터 값을 수정하지 않을 수도 있습니다. 사용자가 지정한 범위에는 플래시 컨트롤러와 RCC가 포함되며, 이들 모두는 마이크로 컨트롤러의 작동에 필수적입니다.

메모리가 부족한 경우 다른 용도로 사용되지 않은 경우 일반 용도로 사용할 수있는 메모리 공간이 있습니다. STM32F2에는 사용할 수있는 4kB 백업 SRAM이 있지만 R/W로 설정하는 데 필요한 일부 설정이 있습니다. USB 주변 장치는 또한 엔드 포인트 버퍼 용으로 내장 된 일부 RAM을 가지고 있습니다. USB를 사용하지 않는 경우,이 메모리 중 일부를 남용 할 수 있으며 USB 주변 장치를 구성하여 나쁜 부작용이 없도록 할 수 있습니다.

+0

질문의 묵시적 문맥이 맞다면 주변 장치 레지스터에 액세스하는 것조차도 아니며 단지 문서화되지 않은 디버그/통합 테스트가있을 수있는 경우가 아니라면 (아마도 언젠가는) 오류가 아닌 0으로 읽히는 일부 예약 된 주소 공간 거기에 등록). 어느 쪽이든, 그것은 이상한 무엇보다 평범한 버그가 많은 코드처럼 들립니다. – Notlikethat

+0

그럼 GPIO 주소 범위에 속하는 주소를 읽는 것, 레지스터 범위 바로 위가 잘못 될 수 있다는 말입니까? – eibwen

+0

원래 질문에 코드를 추가했습니다. – eibwen