GPIO介绍之二

地址映射就是将芯片上的存储器甚至I/O等资源与地址建立一一对应的关系。cortex-m3有32根地址线,所以它的寻址空间为4GB。ARM公司在设计这块芯片时,规定了把0x4000,0000至0x5FFF,FFFF(共512mb)的地址分配给了片上外设。也就是说我们通过读写这些地址就能够操纵外设的工作状态。

STM32各外设与总线的关系

在stm32f10x.h这个头文件里面完成的最重要的功能之一就是把STM32的所有寄存器进行了地址映射,也就说这个文件存在大量的宏定义,这些宏定义将晦涩难记的地址变成了利于记忆的标识符。比如说下面这一段:

#define GPIOC_BASE (APB2PERIPH_BASE+0X1000)
#define APB2PERIPH_BASE (PERIPH_BASE+0X10000)
#define PERIPH_BASE ((uint32_t) 0x40000000)

对于我们这里的代码而言,PERIPH_BASE就是片上外设映射地址的起始位置。其中APB2PERIPH_BASE就是APB2总线外设基地址。APB2?是这样的,在STM32芯片中,它有AHB总线,APB2总线,APB1总线,STM32上不同的外设是挂载在不同的总线上的。对于GPIO,串口1,ADC以及部分定时器来说他们是挂载在APB2总线上的。至于哪些片上外设挂载的总线是哪个,这取决于芯片设计,可以根据芯片文档来查看,比如我们这篇文章的文首处的图片即指明了stm32各外设与总线的关系。


这里碎片化的介绍某些知识点,看下面的代码:

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;
#define _O volatile
#define _IO volatile

这段代码给GPIO的配置寄存器对象抽象为了一个struct,在C语言中,结构体内变量的存储空间是连续的。也就是说,如果我们假如定义了一个GPIO_TypeDef对象a,它的首地址是0x4001,1000的话,那么这个对象中CRH成员的首地址就是0x4001,1000+0x04。

在stm32f1ox.h头文件中,GPIOA-GPIOG就是利用GPIO_TypeDef结构体定义的。如下代码所示:

#define GPIOA ((GPIO_TypeDef*) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef*) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef*) GPIOC_BASE)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 简介 STM32F10x标准外设库是一个完整的包,包含了所有标准外设的设备驱动,适用于STM32价值系列(高、...
    hackvilin阅读 6,811评论 0 13
  • 总线 计算机的各个功能部件通过总线连接在一起构成完整的计算机系统,总线是多个系统功能部件之间进行数据传送的公共通路...
    罗蓁蓁阅读 4,891评论 0 10
  • 什么是嵌入式 IEEE(Institute of Electrical and Electronics Engin...
    Leon_Geo阅读 3,763评论 1 20
  • 1、嵌入式系统的定义 (1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本...
    荣卓然阅读 1,858评论 0 5
  • 三月份,一场春雨悄然而至 没有风没有云没有低的温度 雨滴在黎明的苏醒中落下 ———— 生活该有哪些预兆? 桃花在春...
    Hua一阅读 302评论 0 2