×
单片机 > 单片机程序设计 > 详情

STM32 地址偏移问题及怎么运用

发布时间:2020-05-28 发布时间:
|

就举一个例子哦 其他类推

我就举STM32  里面一个结构体吧!


//以下函数或者定义不是在一起的,我只是把他们拉出来,也说明是相关联的!

 

#define     __I     volatile const      /*!< defines 'read only' permissions只读      */

#define     __O     volatile            /*!< defines 'write only' permissions 只写    */

#define     __IO    volatile            /*!< defines 'read / write' permissions可读写 */

typedef unsigned           int uint32_t;

#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region片1基地址 */

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)//片1地址+偏移地址

#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)//桥2地址+偏移地址 每个GPIOx偏移地址不一样

 

//然后定义结构体

typedef struct

{

  __IO uint32_t CRL; //地址偏移0x00//注意是32位 占用4个字节  因此每次+4

  __IO uint32_t CRH; //地址偏移0x04

  __IO uint32_t IDR; //地址偏移0x08

  __IO uint32_t ODR; //地址偏移0x0C

  __IO uint32_t BSRR;//地址偏移0x10

  __IO uint32_t BRR; //地址偏移0x14

  __IO uint32_t LCKR;//地址偏移0x18

} GPIO_TypeDef;

 

 

 

//注意一下 此时GPIOB是一个指针并初始化了,初始化为GPIOB_BASE,指针类型为(GPIO_TypeDef *)

//并不是GPIOB_BASE的地址 ,是把GPIOB_BASE强制转换为指针 此时GPIOB指向的地址为GPIOB_BASE

#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)

 值得注意的是 CRL CRH IDR ...这7个变量,在库文件没有具体的值!说白了没有明显的初始化!其实已经初始化了。


具体怎么初始化的呢?以我的理解,如果有疑问请大佬指正!


//经过查技术资料

 

//GPIOB  的指向地址为:             0x40010C00 

 

//库文件是这样调取 结构体GPIO_TypeDef 的变量的

//调取之前我先说明一件事情

//就是结构体GPIO_TypeDef 里面的变量CRL CRH IDR...具体值是什么?

//首先上面已经说明GPIOB是一个指针,也就是说GPIOB是一个指针,不信可以看具体例程

 

GPIOB->BRR = (((uint32_t)0x01) << pinpos);//随便找的,也只有指针才能这样调取->

 

//说完这个,由于GPIOB是指针 并且指向0x40010C00 

//其中CRL CRH IDR...都是定义的是  __IO uint32_t 类型的

//由于结构体定义变量,变量是连续的(但不和数组像)

 

typedef struct

{

  __IO uint32_t CRL; //地址偏移0x00//注意是32位 占用4个字节  因此每次+4

  __IO uint32_t CRH; //地址偏移0x04

  __IO uint32_t IDR; //地址偏移0x08

  __IO uint32_t ODR; //地址偏移0x0C

  __IO uint32_t BSRR;//地址偏移0x10

  __IO uint32_t BRR; //地址偏移0x14

  __IO uint32_t LCKR;//地址偏移0x18

} GPIO_TypeDef;

 

//这样GPIOB->CLR 指向的地址0x40010C00

//然后GPIOB->CRH 偏移是0x04  指向的地址为(0x40010C00+0x04)0x40010C04

//以此类推....

//这样CRL CRH IDR... 指向的地址已经确定。

//只要GPIO_TypeDef* 确定 地址也就确定了。

 

关键字:STM32  地址偏移 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
stm32 总线矩阵介绍