IAP遠程在線升級


          IAP遠程在線升級

  在上一篇中實現了LWIP網口通訊,那么肯定要加個在線升級功能,這個功能所占用的資源很少,但在物聯網中很重要也很實用。在線升級就是像手機一樣,先下載好系統,然后點擊升級~然后就沒然后了。

  網上有很多IAP的教程,為了方便演示,大多數都在Bootloader引導代碼中添加了選擇顯示功能,並且通過串口接收固件。這對於教學來說非常好,但在實際使用中,這是不可取的。通常,Bootloader代碼盡量做得越小越好,它只需要實現把存儲器中的代碼燒錄到Flash中,然后跳轉到APP的地址執行就OK了。至於接收固件和選擇顯示等功能應該由APP代碼來實現,APP代碼在升級功能中主要負責通過通訊把接收到的數據存到存儲器中。

  一下就分享我實現IAP遠程升級功能的經驗,驅動程序主要還是基於原子的教程改寫的。

 

讀取單片機內flash代碼,可有可無,這個可以方便做出廠固件保存。

void Flash_To_W25Q(unsigned int addr, unsigned int len)
{
    u32 i;
    u32 secpos;
    u32 secremain;
    
    secpos = len/SECTION;                    //分多少次緩存
    secremain = len%SECTION;            //最后剩余字節
    
    for(i=0; i<secpos; i++)
    {    
        STMFLASH_Read(FLASH_APP1_ADDR+SECTION*i,(u32*)Data_W,SECTION);//讀取Flash代碼 
        W25QXX_Write(Data_W,addr+SECTION*i,SECTION);
        W25QXX_Read(Data_R,addr+SECTION*i,SECTION);
    }
    STMFLASH_Read(FLASH_APP1_ADDR+(SECTION*i),(u32*)Data_W,secremain);//讀取Flash代碼
    W25QXX_Write(Data_W,addr+SECTION*i,secremain);
}

 

讀取存儲芯片內的固件,並寫入到單片機,這個固件就是APP接收到並保存的。

void W25Q_To_Flash(unsigned int addr, unsigned int len)
{        
    u32 i;
    u32 secpos;
    u32 secremain;
    
    secpos = len/SECTION;                        //分多少次緩存
    secremain = len%SECTION;                //最后剩余字節
    
    for(i=0; i<secpos; i++)
    {
        W25QXX_Read(Data_R,addr+SECTION*i,SECTION);
        iap_write_appbin(FLASH_APP1_ADDR+(SECTION*i),Data_R,SECTION);//寫入到Flash  
    }
    W25QXX_Read(Data_R,addr+SECTION*i,secremain);
    iap_write_appbin(FLASH_APP1_ADDR+(SECTION*i),Data_R,secremain);

}

 

跳轉到APP地址,之所以做個判斷,是可以識別APP代碼中是否有程序。

if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
{     
   iap_load_app(FLASH_APP1_ADDR);//跳轉到APP地址
}

 

APP主函數開始加入地址偏移

SCB->VTOR = FLASH_BASE | 0x10000;   地址偏移0x10000

 

APP工程中也不要忘了編譯時偏移地址

 

生成.bin文件,加入這句 fromelf.exe --bin -o "$L@L.bin" "#L"

 

 

最后分享一下我個人的觀點。我使用的是網絡通訊接收固件,因為單片機運行內存有限,必須要把固件拆包發送接收。按理說在接收完全部數據后應該要進行MD5校驗才能升級,而Bootloader在取出數據時也應該進行一次MD5校驗,而我就懶得做了~也算是個隱患,在后期優化還是會考慮做。出廠的時候非常建議對固件進行自動備份存儲,如果有條件的話還可以再開辟一個存儲區域用來存儲上一次升級的數據用來回滾。另外,有人也許會想問,在線升級有兩個代碼,那出廠的時候豈不是要燒兩個程序,對於我這種懶到家的人來說,燒一個程序都夠煩的了,要要燒兩次,我才不干。這時候可以使用UltraEdit編輯器對bin文件進行合並,因為這兩個代碼的flash地址是不沖突的,具體教程可以參考https://blog.csdn.net/xinghuah/article/details/82145192

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM