在运行时篡改位带映射地址的原因

时间:2016-01-29 05:25:15

标签: arm embedded cortex-m3 keil

我正在使用位带来使用Keil设置和清除LPC1857的GPIO6 [1]。

位带区域中的映射地址设置 GPIO6 [1] 0x43EC4304

位带区域中的映射地址清除 GPIO6 [1]来自 0x43EC5384

GPIO设置成功但未被清除。

在调试器上检查时,发现用于清除GPIO6 [1]的映射地址设置为 0x43EC5000 。因此,GPIO不清楚。

有人可以帮助理解为什么会这样吗? 如何在运行时将此映射地址设置解析为错误的地址?

以下是代码段:

/*In "main.c"*/

int main()
{
    ... //System initialization
    ... //GPIO init
    ...


    Toggle_Peri();
}


/*In "Peri.c"*/


/* Bit band PERIPHERAL definitions */

#define BITBAND_PERI_REF     0x40000000 //Start Address of PeripheRALS
#define BITBAND_PERI_BASE    0x42000000 //Start Address of Peripheral Bit Band Alias Region

/* Basic bit band function definition */
#define BITBAND_PERI(a,b) ((BITBAND_PERI_BASE + ((a-BITBAND_PERI_REF)*(0x20)) + (b*(0x04))))  // Convert GPIO address

#define BITBAND_PERI_SetClearBit(a,b)   ((*(volatile uint32_t *) (BITBAND_PERI(a,b))) = 1)

/*Note: Base Address of GPIO       =  0x400F 4000*/
#define PERI_GPIO_ADDRESS_S 0x400F6218 //For GPIO6[1] set
#define PERI_GPIO_ADDRESS_C 0x400F629C //For GPIO6[1] clear
#define PERI_GPIO_BIT       1 

...
...
...
...

void Toggle_Peri(void)
{
    BITBAND_PERI_SetClearBit(PERI_GPIO_ADDRESS_S,PERI_GPIO_BIT);    //Set the pin
    Delay(0xFFFF);  
    BITBAND_PERI_SetClearBit(PERI_GPIO_ADDRESS_C,PERI_GPIO_BIT);    //Clear the pin
    Delay(0xFFFF);
}

0 个答案:

没有答案