stm32f10x中GPIOA理解(一)

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的寄存器。

你可能感兴趣的:(stm32,单片机,嵌入式硬件)