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

发布者:诗意世界最新更新时间:2019-03-09 来源: eefocus关键字:STM32  地址偏移 手机看文章 扫描二维码
随时随地手机看文章

就举一个例子哦 其他类推

我就举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 地址偏移问题及怎么运用

上一篇:调通STM32的串口ISP的经验-eagleCom
下一篇:STM32技术文档里面的I / O Level FT具体含义

推荐阅读最新更新时间:2024-03-16 16:25

2.1、STM32怎么创建工程:如何创建第一个工程模板(基于固件库)
一、 首先在电脑的某个目录下创建一个空文件夹用来存放工程文件。创建好后在该文件目录下分别创建CORE 、FWLIB、OBJ、SYSTEM、USER等五个子文件夹。至于这些文件夹名字,实际上是可以任取的,我们这样取名只是为了行业规范。 二、打开keil软件,点击 Keil 的菜单: Project – New Uvision Project,保存时将目录定位到自己创建的文件下的USER子目录下: 三、接下来会出现一个选择 Device 的界面,就是选择我们的芯片型号,我们选择STM232F407ZE(如果使用的是其他系列的芯片,选择相应的型号就可以了)特别注意: 一定要安装对应的器件支持包才会显示这些内容)。 这里是
[单片机]
2.1、<font color='red'>STM32</font>怎么创建工程:如何创建第一个工程模板(基于固件库)
基于STM32的矿用本质安全型电源设计
0 引言 本安电源是本安型电气设备的一个重要组成部分,由于煤矿的机械化,井下传感器、弯道报警器等设备的供电,通信、报警都需要供电设备。但是基于井下复杂的环境,对供电设备的要求也是非常严格的,它要求电源电路的内部和引出线无论是在正常工作还是在故障状态下都是安全的并且产生的电火花不会点燃周围环境中的爆炸性混合物。本安电源有“ia”和“ib”两个等级。在本文中介绍的本安电源是井下常用的“ia”等级,也就是说在一个故障,一套保护电路损坏的情况下也能继续工作。 1 本安电源的组成及工作原理 1.1 电源 本系统中本安电源的输入+Vin、-Vin为48 V 直流电源,经过DC/DC 电源转换模块(U1)输出12 V直流电,U2是780
[单片机]
基于<font color='red'>STM32</font>的矿用本质安全型电源设计
关于STM32定时器触发SPI逐字收发之应用示例
我们在做SPI应用时,有时希望通过定时器来定时地触发SPI的收发,并利用DMA完成数据的传输。这里,以STM32L476芯片为例来做个演示,以供参考。 本示例的大致过程是这样的: 片内SPI1做Master,SPI2做Slave,均工作在全双工模式。 这里使用片内定时器TIM3,通过它的更新事件触发DMA请求,通过DMA将数据给到SPI1的数据寄存器并发送出去,同时也开启SPI1接收事件的DMA传输。总之,SPI2的收、发事件都启用DMA完成。 TIM3的更新事件周期控制两个SPI的收发节奏,即定时器每产生一次更新事件,SPI1/SPI2这两个主从通信模块就进行一个数据的收发。我们可以通过调整定时器的计时周期来调整
[单片机]
关于<font color='red'>STM32</font>定时器触发SPI逐字收发之应用示例
STM32 USART 串口简单使用
STM32 的库实在强大~!函数长的像句子...... 好了开始了: 使用查询方式的USART: 设置时钟: RCC_APB2Periph_AFIO功能复用IO时钟 RCC_APB2Periph_GPIOAGPIOA时钟 RCC_APB2Periph_USART1 USART1时钟 你可以用 //使能串口1,PA,AFIO总线RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE); 或直接 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AL
[单片机]
<font color='red'>STM32</font> USART 串口简单使用
STM32基础设计(5)---ADC转换(中断方式)
本文简单介绍了STM32F103C8,通过中断方式读取电压,不过最后楼主读取参考电压失败,还没有找到错误,所以读取的电压只能十六进制显示,如有不便请忽略本文! 本文的介绍按照一般流程来走: 1,串口的初始化 2,ADC初始化 3,中断初始化 4,编写中断函数 5,编写主函数 接下来详细介绍: 1,串口的初始化: void usart_init() { GPIO_InitTypeDef Uart_A; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE); Uart_A.GPIO_Pin = GPIO_Pin_9; Uar
[单片机]
STM32固件IAP升级实战
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 1 预备知识 2 Bootloader 2.1 启动流程 2.2 校验跳转地址是否有效 2.3 Keil 工程 IAP 的相关设置 3 Application 3.1 启动流程 3.2 IAP 中的引导部分 3.3 关于 VTOR 3.4 Keil 工程设置 4 附件 1 预备知识 基于标准外设库(STM32F10x_StdPeriph_Lib_V3.5.0)的 IAP 升级相关资料可以参考 IAP ST 官方资料汇总。 STM32 升级的三种方式:IAP,ICP,ISP;具体有什么区别可以自行 Googl
[单片机]
STM32系列第3篇--GPIO初始化
使能和初始化IO口: GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOD,
[单片机]
STM32外部中断执行过程
一、MCU中断程序执行过程 以MCU裸机程序框架为例,MCU 的主函数是个死循环: 主函数: main(void) { While(1) { //主程序 } } 如果没有中断或异常产生会一直在while(1)里执行主程序代码。当中断产生后,当前执行的任务会被打断,程序跳转到中断处理函数执行,执行完会返回之前的主程序断点处继续执行。 中断处理函数: void IRQ_handler(void) { //中断处理程序 //清除中断标志,否则会不停的进入中断处理程序。 } 在中断处理函数中不要做复杂费时的事情,中断内做的事情尽可能少。 二、中断使用实例 STM32的IO都可以配置成外部中断,但不是同时都可以配成外部中断。需要遵循如下
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved