FLASH读取半字函数问题

2019-07-20 04:37发布

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位呢。谢谢了

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
peng1554
1楼-- · 2019-07-20 22:02
 精彩回答 2  元偷偷看……
szczyb1314
2楼-- · 2019-07-21 00:19
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
yuyins
3楼-- · 2019-07-21 06:06
peng1554 发表于 2018-12-5 22:08
没懂你的意思
不知道想问的是不是:一个32位地是不是存储一个字节的数据,存储16位的数据为什么占用两个 ...

对,为什么啊
peng1554
4楼-- · 2019-07-21 06:58
 精彩回答 2  元偷偷看……
yuyins
5楼-- · 2019-07-21 10:37
peng1554 发表于 2018-12-6 22:14
看楼上的描述,楼上解释很详细了~~

是不是地址是32位的为1btye,而16位指的是数据,8位数据占1btye,所以16位就占了2btye
peng1554
6楼-- · 2019-07-21 15:51
yuyins 发表于 2018-12-7 11:15
是不是地址是32位的为1btye,而16位指的是数据,8位数据占1btye,所以16位就占了2btye

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

一周热门 更多>