历史上的今天
今天是:2025年03月09日(星期日)
2019年03月09日 | STM32 地址偏移问题及怎么运用
2019-03-09 来源:eefocus
就举一个例子哦 其他类推
我就举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* 确定 地址也就确定了。
史海拾趣
|
随着现代网络技术的发展,嵌入式系统如单片机、DSP等系统对接入网络的需求日益增加,例如具有远程抄表功能的电表系统、可以进行远程控制的信息家电系统等。本文采用TI公司的TMS320VC33 DSP芯片设计与Realtek公司的RTL8019网卡的硬件接口电路,并在DSP ...… 查看全部问答> |
|
1 前言 锁相环路诞生于20世纪30年代。近年来,锁相技术在通信、航天、测量、电视、原子能、电机控制等领域,能够高性能地完成信号的提取、信号的跟踪与同步,模 拟和数字通信的调制与解调、频率合成、滤波 ...… 查看全部问答> |
|
从参加工作到现在也将近两年时间了,工作中的感悟就像夜空中的繁星,虽然发出的光强弱不同,但每一种感受都是与众不同的。 现在有机会提笔写感悟,却顿生“最熟悉的陌生人”之感。难道是时间的穿梭遮挡了记忆的星光吗?我迷惑不解。 于是,终于有 ...… 查看全部问答> |
|
串口驱动中定义了以下结构,实现串口接收数据的读取。 typedef struct __RX_BUFFER_INFO { ULONG Read; &nb ...… 查看全部问答> |
|
大家好,我是某校软件工程硕士,现在刚研一,我选择了嵌入式这个方向,因为本科时坐过2年的单片机开发,对底层的东西有点基础。由于我英语比较好,所以基本上现在我的目标是毕业后进个大的外企,慢慢学习,以后再谋求自己创业的机会。 ...… 查看全部问答> |
|
程序中间用到External Interrupt INT6设置成 下降沿触发中断以前遇到的都是发生中断后都要清除中断标志位但是这里好像在库里面没有有这个中断的标志的说明就没有处理这里但是运行的过程中没有达到效果一串信号发送过去,应该一 ...… 查看全部问答> |




