OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4531|回复: 8

stm32内部flash读取疑问。

[复制链接]

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
发表于 2018-1-24 14:45:22 | 显示全部楼层 |阅读模式
1金钱
flash读取:
data=*(vu16*)addr;
将 addr 强制转换为 vu16 指针,然后取该指针所指向的地址的值,即得到了 addr 地址的值。  

不是很懂这句。vu16是一个16位的数据,而stm32是32位寻址的。怎么就能把32位的地址转换为16位的去寻址,然后读取的还是16位的结果??

最佳答案

查看完整内容[请看2#楼]

你这是还没弄明白指针啊 首先 addr是一个32位的整数 代表的是一个地址 (vu16 *)就是把这个整数强制转换成一个指针(这个指针还是32位的,只不过它里面存储的数据是16位的),这个指针指向的地址里面存了一个类型为vu16的变量x *(vu16 *)addr 就是把这个变量X取出来
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

156

帖子

0

精华

高级会员

Rank: 4

积分
883
金钱
883
注册时间
2017-8-7
在线时间
200 小时
发表于 2018-1-24 14:45:23 | 显示全部楼层
你这是还没弄明白指针啊    首先 addr是一个32位的整数   代表的是一个地址  (vu16 *)就是把这个整数强制转换成一个指针(这个指针还是32位的,只不过它里面存储的数据是16位的),这个指针指向的地址里面存了一个类型为vu16的变量x  *(vu16 *)addr  就是把这个变量X取出来
回复

使用道具 举报

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
 楼主| 发表于 2018-1-24 16:56:15 | 显示全部楼层
旺仔奶豆 发表于 2018-1-24 15:00
你这是还没弄明白指针啊    首先 addr是一个32位的整数   代表的是一个地址  (vu16 *)就是把这个整数强制 ...

按照我的理解应该写成
data=(vu16)*addr:先是去addr中的数据,在强制转换vu16类型啊?
回复

使用道具 举报

13

主题

156

帖子

0

精华

高级会员

Rank: 4

积分
883
金钱
883
注册时间
2017-8-7
在线时间
200 小时
发表于 2018-1-24 17:03:29 | 显示全部楼层
jinfeihan57 发表于 2018-1-24 16:56
按照我的理解应该写成
data=(vu16)*addr:先是去addr中的数据,在强制转换vu16类型啊?

你这理解有问题  首先addr一开始并不是一个指针 ,它只是一个32位的整数,你用(vu16 *)把它转换成了一个U16类型的指针,这时候它才是真正的指针,并且U16类型的指针代表的是这个地址里面存放的数据是u16的  如果是U32的指针那么里面存放的数据就是U32的  以此类推
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7643
金钱
7643
注册时间
2016-11-30
在线时间
647 小时
发表于 2018-1-24 17:44:37 | 显示全部楼层
旺仔奶豆 发表于 2018-1-24 17:03
你这理解有问题  首先addr一开始并不是一个指针 ,它只是一个32位的整数,你用(vu16 *)把它转换成了一个U ...

正解!!!
回复

使用道具 举报

4

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2018-1-13
在线时间
13 小时
发表于 2018-1-24 17:56:09 | 显示全部楼层
旺仔奶豆 发表于 2018-1-24 17:03
你这理解有问题  首先addr一开始并不是一个指针 ,它只是一个32位的整数,你用(vu16 *)把它转换成了一个U ...

很强
回复

使用道具 举报

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
 楼主| 发表于 2018-1-24 18:05:39 | 显示全部楼层
旺仔奶豆 发表于 2018-1-24 17:03
你这理解有问题  首先addr一开始并不是一个指针 ,它只是一个32位的整数,你用(vu16 *)把它转换成了一个U ...

搞懂了,谢谢!
回复

使用道具 举报

13

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2017-7-7
在线时间
42 小时
发表于 2018-1-25 08:53:51 | 显示全部楼层
你跳到指针看看vu16对应的是不是volatile,如果是话,你在去百度一下这个是个宏定义,C语言就是这样自己定义的
回复

使用道具 举报

8

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-17
在线时间
102 小时
发表于 2018-3-25 21:11:00 | 显示全部楼层
指针变量的定义里说过,指针变量的类型是指,指针变量所指的变量的类型,v16有两个功能,1,强制addr为指针变量,2,强制转换addr所指的变量为v16
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-20 04:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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