0

我试图理解某人的代码,他们正在读取 GPIO 区域(0x4002 0000 - 0x4002 03FF)中的内存空间,但它的地址比 GPIO 寄存器高(它们只转到 0x24)。

您可以使用 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} ;
4

1 回答 1

0

首先,还有其他 GPIO 端口存在于每倍数的0x200范围0x40020000 - 0x400223FF内,但仍在您的范围内,还有 CRC 外围设备、RCC 和 Flash 控制器。相关的内存映射在 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 进行测试时,我可以确认您可以对其进行读写而不会出错,但是寄存器未实现并且始终读取为零。

将外围寄存器用作通用存储器将是一个非常糟糕的主意。并非每一位都是 R/W,并非所有地址都可以实现,这甚至还没有考虑到您将根据应用程序数据而不是正确的寄存器值来配置硬件这一事实。您指定的范围包括闪存控制器和 RCC,这两者对微控制器的操作都至关重要。

如果您的内存不足,则有一些内存空间如果尚未用于其他用途,则可以用作通用用途。STM32F2 有一个可以使用的 4 kB 备份 SRAM,但需要进行一些设置才能使其成为 R/W。USB 外围设备还具有一些内置用于端点缓冲区的 RAM。如果您不使用 USB,则可能会滥用其中的一些内存,并且您可以配置 USB 外围设备,以免产生任何不良副作用。

于 2016-08-15T16:46:18.223 回答