久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6735|回復: 8
打印 上一主題 下一主題
收起左側

KEIL-51單片機實現自定義bootloader,用于程序更新

  [復制鏈接]
跳轉到指定樓層
樓主
本文原創作者: 少占魚大神
關于8051的bootloader實現方式

一, 基本硬件需求

要實現IAP功能,需要51單片機可以在程序里修改代碼空間的Flash,或者至少可以修改用戶程序區的Flash,新出的51大部分都能滿足這個要求

二,空間劃分

一般bootloader位于單片機代碼空間的起始地址,用戶程序在后面。這個需要根據實際的需求來決定,bootloader功能簡單,就少占用一些,bootloader功能復雜的就多占用一些。除此之外,一般還要根據Flash的頁為界線劃分。附帶的工程模板里,bootloader使用0x0000-0x0fff區間,用戶程序使用0x1000以后的空間。

三,中斷的處理

51單片機的中斷入口一般位于0地址開始的區間,無法修改,但是根據上面的空間劃分方式,這個區間位于bootloader的范圍,是不能隨意更改的。所以代碼里用了一個軟件的方式對中斷入口做了重映射處理,后面將結合具體的代碼介紹實現方式。

四,Bootloader的處理

1,  建立工程的時候,選擇把Startup.a51添加到工程
2,  在Startup.a51里添加如下代碼:

ORG      0003H

                                     LJMP     2003H

                                     ORG      000BH

                                     LJMP     200BH

                                     ORG      0013H

                                     LJMP     2013H

                                     ORG      001BH

                                     LJMP     201BH

                                     ORG      0023H

                                     LJMP     2023H

                           ………………………….

根據具體型號的中斷數量和地址,添加中斷跳轉代碼,格式為ORG  XXH   LJMP 2000+XXH,這樣做,是為了將中斷映射到用戶程序區的0x2000開始的空間,在用戶程序里,還要做一些對應的設置,后面將介紹。

3,  Bootloader的處理流程。Bootloader的主要作用一般是開機初始化,自檢和升級用戶程序,以及引導用戶程序。因為上面已經把中斷映射到用戶程序空間,所以bootloader里最好就不要用中斷了。



五,             用戶程序的處理。

1,  用戶程序的Startup.a51無特殊需求,可以根據需要選擇添加到工程,然后自己做修改,也可以不添加到工程,由編譯器連接一個默認的startup.a51

2,  用戶程序的所有普通函數和中斷函數也沒有特殊要求,可以按正常的方式編寫

3,  用戶程序的工程設置。因為用戶程序不再是從0地址開始,所以需要在工程設置里做定位處理:設置用代碼的范圍,定位用戶代碼入口地址。具體設定如下圖:

因為用戶代碼規劃到0x1000以后的空間,所以設置code range從0x1000開始

為了讓bootloader能準確跳到用戶程序入口,所以需要將C_C51STARTUP定位到0x1000位置。(C_STARTUP位于startup.a51里,它才是程序的真正入口,而不是main函數;另外,入口也并不是必須定位在這個位置,只要位于用戶代碼空間就可以)


4,  中斷映射。在bootloader里,將中斷入口定位在了0x2000開始的空間,在用戶程序里,也必須做一個對應的設置。方法如下:


這樣處理之后,便完成了中斷的映射。當中斷發生時,會先進入位于bootloader里的硬件中斷入口,然后在那里跳轉到0x2000開始的一個軟件重定義的向量表,再跳轉到中斷入口函數。和沒有bootloader的方式比起來,這樣做會多一次LJMP跳轉,但是一般情況下影響不大。

關于bootloader存放位置:
備注:其實,最好是將bootloader程序放到最后,這樣,應用程序起始地址,中斷地址等不用設置,默認程序從0x0000h開始執行,然后用函數指針跳轉到bootloader 程序起始地址,讓其先執行。通過bootloader內部程序選擇是否升級應用程序還是直接跳轉回應用程序區執行。
若升級,就讀寫flash的應用程序部分。若不升級,就跳轉回應用程序繼續運行。


BOOTLOADER 程序舉例:

#include<reg52.h>

//用戶程序起始地址

#define USER_APP_ADDR        0x1000



char power_on_test(void);

char check_upgrade_request(void);

char upgrade(void);



void main(void)

{

//定義一個函數指針,用于跳轉到用戶程序

void (*boot)() = USER_APP_ADDR;

//bootloader里不能開啟中斷

EA = 0;

//添加系統初始化代碼

if(power_on_test()){//開機自檢

upgrade();

}

else if
(check_upgrade_request()){//檢查是否有升級需求

upgrade();

}

//如果不需要升級,或者升級已經完成,執行下面的代碼進入用戶程序

(*boot)();

//正常情況下不會運行到這里,以防萬一

while(1);

}



char power_on_test(void)

{

//添加開機自檢代碼,如果自檢錯誤,進入升級模式

return 0;

}

char check_upgrade_request(void)

{

//添加檢查用戶是否有升級要求的代碼,例如輸入命令或按下按鍵,如果有,則進入升級模式

return 0;

}

char upgrade(void)

{

//添加傳輸升級文件和升級用戶程序區的代碼

return 1;

}


用戶程序:

#include<reg52.h>

//main函數無特殊要求

void main(void)

{

while(1);

}

//中斷函數無特殊需求,可根據需求隨意添加

void UART_ISR(void) interrupt 4

{



return;

}
工程配置如下


六,關于升級文件

升級文件的傳輸可以根據需要使用任何方式,例如串口,網絡,USB,存儲卡等。升級文件的傳輸可以做在bootloader里,也可以做在用戶程序里,或者兩種方式都有。一般來說,bootloader的代碼比較簡單,不適合做復雜的傳輸方式。如果傳輸方式比較復雜,可以在用戶程序里傳輸升級文件,暫存到一個外部存儲器,然后跳轉到bootloader,讓bootloader從外部存儲器讀出并升級用戶程序。升級的時候要注意用戶代碼的范圍。

為了傳輸的可靠性,升級文件一般還會添加一個文件頭,里面包含一些基本的文件信息,例如長度,校驗等,這些可以通過編寫一些簡單的工具來完成。



                   另外,推薦一些升級文件的傳輸方式,做bootloader的時候可以考慮

1,  串口。可以考慮使用XMODEM協議傳輸升級文件,因為這是一個比較標準的傳輸協議,很多現成的軟件可以支持,例如Windows下自帶的超級終端就可以實現(XP以后的系統沒有超級終端,但是也有一些別的軟件可以代替,例如SecureCRT)

2,  USB主機。可以用U盤方式升級。升級文件取一個特定文件名,放在特定位置,主機讀取到文件后自動升級

3,  USB從機。可以讓從機虛擬成一個U盤,PC把文件復制到這個虛擬U盤就完成升級。這樣就不需要編寫專門的升級軟件

4,  以太網。

a)        TFTP,這是標準的文件傳輸命令,Windows自帶,而且協議簡單

b)        Web。用網頁的方式,界面有好直觀,用網頁瀏覽器就可以實現,也不用單獨開發專用的升級軟件。

全部程序51hei下載地址:
關于8051的bootloader實現方式.rar (2.99 KB, 下載次數: 109)



評分

參與人數 2黑幣 +65 收起 理由
zhai1461961500 + 15 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:410988 發表于 2020-4-21 11:30 | 只看該作者
很有啟發,謝謝
回復

使用道具 舉報

板凳
ID:410988 發表于 2020-4-25 09:53 | 只看該作者
樓主有沒有源碼文件?我研究了好久沒明白,想借鑒下!
回復

使用道具 舉報

地板
ID:818607 發表于 2020-9-13 20:37 | 只看該作者
還是很有參考價值的
回復

使用道具 舉報

5#
ID:323651 發表于 2020-9-25 09:30 | 只看該作者
道理是對的,能不能實現才是關鍵
回復

使用道具 舉報

6#
ID:487254 發表于 2020-12-9 17:01 | 只看該作者
很受啟發  跪謝樓主!!!
回復

使用道具 舉報

7#
ID:743013 發表于 2021-1-19 09:20 | 只看該作者
請問為什么程序空間偏移1000H,中斷向量表卻是偏移2000H呢? 在單片機里,程序空間和中斷向量表不都是從地址0開始的嗎?請問哪位伙伴知道
回復

使用道具 舉報

8#
ID:995496 發表于 2022-1-14 12:14 | 只看該作者
樓主 您好  看到您的這篇文章很受啟發   請問能否提供一下源碼  學習學習
回復

使用道具 舉報

9#
ID:87000 發表于 2022-7-8 09:51 | 只看該作者

很受啟發  ,具體還得自己去實現
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久一级 | 免费色网址 | 在线欧美视频 | 国产亚洲欧美另类一区二区三区 | www.久草.com | 日日日操 | 日韩av美女电影 | 亚洲在线高清 | 91资源在线观看 | 懂色av色香蕉一区二区蜜桃 | 日韩二三区 | 成人午夜 | 成人免费观看视频 | 久久精品16 | 国产精品美女久久久久久免费 | 激情av网站| 蜜桃av一区二区三区 | 久久成人高清视频 | av片在线观看网站 | 男女羞羞视频在线免费观看 | 99精品欧美一区二区蜜桃免费 | 免费在线看黄视频 | 91在线播 | 成人在线免费看 | 欧美日韩综合 | 一级a性色生活片久久毛片波多野 | 久久久久久高清 | 国产1区2区3区 | 精品国产免费人成在线观看 | 国产精品日日摸夜夜添夜夜av | 日韩一区精品 | 99精品免费在线观看 | 国产不卡在线观看 | 欧美一区二区网站 | 一区二区三区国产 | 免费一区二区在线观看 | 久久欧美高清二区三区 | 成年人视频免费在线观看 | 国产一区二区在线免费观看 | 国产成人精品久久二区二区91 | 日韩精品一区二区在线观看 |