stm32中GPIOA对于arm芯片来说,它属于芯片内外部的外设,对于单片机来说,它是按时间脉冲来执行的。那么GPIOA挂在RCC_APB2Periph时钟上面的。在这里我们先理解GPIOA 在地址,STM32的外设起始基地址为0x40000000,而APB2总线设备起始地址相对于外设基地址的偏移量为0x10000,GPIOA设备相对于APB2总线设备起始地址偏移量为0x0800。因此,GPIOA地址为:
GPIOA_BASE = 0x40000000 + 0x10000 + 0x0800 我们看到程序在“stm32f10x_map.h”文件中找到:#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
和:#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
还有:#define PERIPH_BASE ((u32)0x40000000)
而GPIOA则在“stm32f10x_map.h”文件中找到定义:
#ifdef _GPIOA
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#endif
说到这里我们就知道GPIOA所理解的地址,那么GPIOA外设有多少寄存器呢?从stm32f10x.h文中看到
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
一共有7个,分别是CRL,CRH,IDR,ODR,BSRR,BRR,LCKR.
那么#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) 宏有什么作用呢?就把GPIOA的地址分给结构体的首地址。从而指定GPIOA的寄存器地址。以便来操作。这跟单片机51操作寄存器一样。下一笔篇介绍固件库怎么操作GPIOA的寄存器。