求问IAP串口例的一段代码

2019-07-20 18:26发布

//appxaddr:ó|óÃ3ìDòμÄÆeê¼μØÖ·
//appbuf:ó|óÃ3ìDòCODE.
//appsize:ó|óÃ3ìDò′óD¡(×Ö½ú).
void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
        u32 t;
        u16 i=0;
        u32 temp;
        u32 fwaddr=appxaddr;//μ±Ç°D′èëμÄμØÖ·
        u8 *dfu=appbuf;
        for(t=0;t<appsize;t+=4)
        {                                                  
                temp=(u32)dfu[3]<<24;   
                temp|=(u32)dfu[2]<<16;   
                temp|=(u32)dfu[1]<<8;
                temp|=(u32)dfu[0];          
                dfu+=4;//&#198;&#171;ò&#198;4&#184;&#246;×&#214;&#189;ú
                iapbuf[i++]=temp;            
                if(i==512)
                {
                        i=0;
                        STMFLASH_Write(fwaddr,iapbuf,512);
                        fwaddr+=2048;//&#198;&#171;ò&#198;2048  512*4=2048  &#213;yo&#195;ê&#199;2K
                }
        }
        if(i)STMFLASH_Write(fwaddr,iapbuf,i);
}


这段代码里的<<24 <<16<<8 <<0是什么意思

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
名扬天下
1楼-- · 2019-07-21 16:02
ysq7120 发表于 2016-9-26 17:38
dfu是u8,通过移位将4个dfu数据拼成一个u32.
这不是很基础的东西吗

为什么第一次要左移24变成32位,然后第二次左移16位变成48位,第三次左移8位变成56位?
ysq7120
2楼-- · 2019-07-21 18:15
 精彩回答 2  元偷偷看……
ysq7120
3楼-- · 2019-07-21 22:02
举例说明一下
(u32)dfu[3]<<24 如果 dfu[3]=0x07,那么移动后就是0x07000000,
(u32)dfu[2]<<16 如果 dfu[3]=0x06,那么移动后就是0x00060000,
temp用|运算,那么temp 不就等于0x07060000了。
后面的是一样的情况。
再不懂我就无法帮你了
名扬天下
4楼-- · 2019-07-22 03:45
ysq7120 发表于 2016-9-27 08:38
举例说明一下
(u32)dfu[3]

明白了!
名扬天下
5楼-- · 2019-07-22 04:32
 精彩回答 2  元偷偷看……
名扬天下
6楼-- · 2019-07-22 07:46
ysq7120 发表于 2016-9-27 09:26
iapbuf 是u32类型数据,这个代码是将接受到的数据u8每4个变成一个u32放到iapbuf里面,然后满512个就写flash ...

嗯,32位就是4个字节,每32位数据存在temp里面,然后偏移4个字节(也就是寻找接下来的32位数据),然后把32位数据存在了iapbuf[0]里面,这个if(i==512)512个是什么意思?

一周热门 更多>