野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16118|回复: 1

寄存器映射有点细节不懂

[复制链接]
发表于 2020-4-7 18:27:22 | 显示全部楼层 |阅读模式
代码:
#define                PERIPH_BASE ((unsigned int)0x40000000)
#define                APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define                GPIOB_BASE (APB2PERIPH_BASE+0X0C00)
#define                GPIOB_CRL *(unsigned int*)(GPIOB_BASE+0x00)

各位大神:
寄存器映射的时候,为什么PERIPH_BASE ((unsigned int)0x40000000)中地址前面要加(unsigned int),而APB2PERIPH_BASE (PERIPH_BASE + 0x10000)的0x10000不用加,
而且我试过PERIPH_BASE ((unsigned int)0x40000000)中地址前面不加(unsigned int)程序也能正常运行????

回复

使用道具 举报

发表于 2020-4-9 18:44:37 | 显示全部楼层
1.寄存器映射的时候,为什么PERIPH_BASE ((unsigned int)0x40000000)中地址前面要加(unsigned int)
  -良好的习惯
  -如果你需要访问的内存地址过大的时候,不会因为数据类型的问题导致访问错误的内存地址
2.而APB2PERIPH_BASE (PERIPH_BASE + 0x10000)的0x10000不用加
  -因为你前面【define PERIPH_BASE ((unsigned int)0x40000000)】的时候确定了只要你后面使用到【PERIPH_BASE】,
   预编译阶段系统就会将【PERIPH_BASE】文本替换为 【 ((unsigned int)0x40000000) 】,也就是说
  #define   APB2PERIPH_BASE (PERIPH_BASE + 0x10000)  == #define   APB2PERIPH_BASE ( ((unsigned int)0x40000000) + 0x10000 )
   由于0x40000000数据类型为【unsigned int】类型,所以执行【 ((unsigned int)0x40000000) + 0x10000  】后的结果的数据类型还是为【unsigned int】类型
  所以第二条define语句中的【0x10000 】前面不用加【unsigned int】
3.而且我试过PERIPH_BASE ((unsigned int)0x40000000)中地址前面不加(unsigned int)程序也能正常运行????
--这是因为对于32位的有符号数据而言,0x40000000的值还小,还没有超出32位有符号数的范围,正数范围【0x00000000~0x7FFFFFFF】,
  负数范围【0x80000000~0xFFFFFFFF】,所以即使你没强调0x40000000的数据类型,实际上也没啥事。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 18:41 , Processed in 0.030067 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表