OpenEdv-开源电子网

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

FLASH读取半字函数问题

[复制链接]

7

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2018-11-23
在线时间
17 小时
发表于 2018-11-23 17:52:03 | 显示全部楼层 |阅读模式
1金钱
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
        return *(vu16*)faddr;
}
想请教一个问题,在FLASH章节里面有个读取半字的函数。
这个函数中*(vu16*)faddr该怎么理解呢,32的数据强制转换为16位的地址,在取这个16位地址的值。问题是例如faddr为0X00000004,那么转换为16的地址,应该是低16位,也就是此时的地址0X0004,再取这个地址的值,那这样永远都读取不到faddr高16的数。还是如果我想读取faddr高16的数,就应该读0X00000002,就是faddr前16位,才能读到faddr的高16位呢。谢谢了

最佳答案

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

faddr为0X00000004,把0X00000004看成一个地址,对STM32来说在这个地址上只存储了1byte的数据,强制类型转换为u16型地址,那么将从0X00000004和0X00000005处取出2byte数据组成一个u16型数据。 那么0X00000004 、0X00000005、0X00000006和0X00000007取出4byte则可以组成一个u32型数据
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6551
金钱
6551
注册时间
2015-8-25
在线时间
1024 小时
发表于 2018-11-23 17:52:04 | 显示全部楼层
faddr为0X00000004,把0X00000004看成一个地址,对STM32来说在这个地址上只存储了1byte的数据,强制类型转换为u16型地址,那么将从0X00000004和0X00000005处取出2byte数据组成一个u16型数据。

那么0X00000004 、0X00000005、0X00000006和0X00000007取出4byte则可以组成一个u32型数据
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6551
金钱
6551
注册时间
2015-8-25
在线时间
1024 小时
发表于 2018-11-23 21:40:07 | 显示全部楼层
把32为的数据当做一个地址来看待,在这个地址处取一个16位的数据出来。
回复

使用道具 举报

7

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2018-11-23
在线时间
17 小时
 楼主| 发表于 2018-11-28 10:22:00 | 显示全部楼层
szczyb1314 发表于 2018-11-23 17:52
faddr为0X00000004,把0X00000004看成一个地址,对STM32来说在这个地址上只存储了1byte的数据,强制类型转 ...

你好,谢谢你的回答,今天才上来看帖子,看来我看书看得不仔细。我想在问一下*(vu16*)faddr;这个还是有点不明白,例如一个数据0X 8111 2222,将这个数据转换为16位的地址应该是0X2222吧,然后在取值,是取的0X2222上的数据吗,就不是0X8111 2222的低16位的数据了。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6551
金钱
6551
注册时间
2015-8-25
在线时间
1024 小时
发表于 2018-11-28 11:30:22 | 显示全部楼层
qxp 发表于 2018-11-28 10:22
你好,谢谢你的回答,今天才上来看帖子,看来我看书看得不仔细。我想在问一下*(vu16*)faddr;这个还是有点 ...

32位的单片机是一个地址绝对是4byte,但是只能存储1byte数据,理论地址可以是任何4byte的数据,但是对32单片机来说要合法才行。
你说的数据0X 8111 2222,它可以是u32型数据,也可以是一个地址。将这个数据转换为u8型地址,取得是0X 8111 2222这个地址上的数据;将这个数据转换为u16型地址,取得是0X 8111 2222和0X 8111 2223这两个地址上的数据,注意一个地址上只能存1byte数据,然后将0X 8111 2222和0X 8111 2223这两个地址上的数据合成一个U16型数据。将这个数据转换为u32型地址,取得是0X 8111 2222、0X 8111 2223、0X 8111 2224、0X 8111 2225这四个地址上的数据,注意一个地址上只能存1byte数据,然后将这四个地址上的数据合成一个U32型数据。

任何数字都可以看作一个地址。要理解这个
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

7

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2018-11-23
在线时间
17 小时
 楼主| 发表于 2018-11-28 11:42:16 | 显示全部楼层
szczyb1314 发表于 2018-11-28 11:30
32位的单片机是一个地址绝对是4byte,但是只能存储1byte数据,理论地址可以是任何4byte的数据,但是对32 ...

谢谢,大概有点懂了,在好生想一下,之前以为一直和数据类型转换一样的理解,所以一直想不通。
回复

使用道具 举报

0

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2018-9-23
在线时间
21 小时
发表于 2018-12-5 21:10:03 | 显示全部楼层
我想问一下32位为一个字节,那么16位为什么就是2个字节了呢
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10561
金钱
10561
注册时间
2017-2-18
在线时间
1912 小时
发表于 2018-12-5 22:08:42 | 显示全部楼层
yuyins 发表于 2018-12-5 21:10
我想问一下32位为一个字节,那么16位为什么就是2个字节了呢

没懂你的意思
不知道想问的是不是:一个32位地是不是存储一个字节的数据,存储16位的数据为什么占用两个32位地址
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6551
金钱
6551
注册时间
2015-8-25
在线时间
1024 小时
发表于 2018-12-6 11:07:07 | 显示全部楼层
yuyins 发表于 2018-12-5 21:10
我想问一下32位为一个字节,那么16位为什么就是2个字节了呢

你要明白的是32单片机说的是它的地址线是32根,能访问的空间范围是0-2^32-1 byte,每个地址空间上只存储1byte数据,你的u32型数据是占了4byte的空间的,至于这4byte数据的顺序还涉及单片机的大小端模式,32单片机是小端模式,51和TI的C2000dsp是大端模式。
切记切记:数据和数据的地址一定要搞懂
你定义一个数据,u8 a = 3;a这个变量的地址是0x20000056;在这个地址上存放着你的数据3
你定义u32 b = 0x12345678;b的地址是0x20000057;在0x20000057上存放的是0x78,在在0x20000058上存放的是0x56,在0x20000059上存放的是0x34,在0x2000005A上存放的是0x12
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

0

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2018-9-23
在线时间
21 小时
发表于 2018-12-6 20:36:03 | 显示全部楼层
peng1554 发表于 2018-12-5 22:08
没懂你的意思
不知道想问的是不是:一个32位地是不是存储一个字节的数据,存储16位的数据为什么占用两个 ...

对,为什么啊
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10561
金钱
10561
注册时间
2017-2-18
在线时间
1912 小时
发表于 2018-12-6 22:14:11 | 显示全部楼层

看楼上的描述,楼上解释很详细了~~
回复

使用道具 举报

0

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2018-9-23
在线时间
21 小时
发表于 2018-12-7 11:15:52 | 显示全部楼层
peng1554 发表于 2018-12-6 22:14
看楼上的描述,楼上解释很详细了~~

是不是地址是32位的为1btye,而16位指的是数据,8位数据占1btye,所以16位就占了2btye
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10561
金钱
10561
注册时间
2017-2-18
在线时间
1912 小时
发表于 2018-12-7 18:20:04 | 显示全部楼层
yuyins 发表于 2018-12-7 11:15
是不是地址是32位的为1btye,而16位指的是数据,8位数据占1btye,所以16位就占了2btye

一个地址存储的数据数一个字节,你16位的数据在存储的时候就会占用两个地址(16位数据=2个字节)
回复

使用道具 举报

0

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2018-9-23
在线时间
21 小时
发表于 2018-12-12 17:11:56 | 显示全部楼层
peng1554 发表于 2018-12-7 18:20
一个地址存储的数据数一个字节,你16位的数据在存储的时候就会占用两个地址(16位数据=2个字节)

好的,我懂了,谢谢,大佬的耐心解答
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-12-5
在线时间
3 小时
发表于 2019-12-29 11:05:47 | 显示全部楼层
谢谢大佬的耐心回答,今天遇到这个问题,看回帖子,大佬解释得非常好
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2020-3-7
在线时间
6 小时
发表于 2020-7-7 14:35:57 | 显示全部楼层
szczyb1314 发表于 2018-11-28 11:30
32位的单片机是一个地址绝对是4byte,但是只能存储1byte数据,理论地址可以是任何4byte的数据,但是对32 ...

感谢带佬的解惑
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2021-7-29
在线时间
61 小时
发表于 2021-8-30 16:27:24 | 显示全部楼层
解释得太好了,这下算是搞懂了数据和数据地址之间的关系了感谢大佬
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 03:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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