題:
可以通過藍牙重新編程微控制器嗎?
JDS
2014-06-21 01:17:26 UTC
view on stackexchange narkive permalink

我正在考慮採用ARM Cortex M3 MCU和藍牙進行嵌入式設計。我希望能夠通過藍牙定期更新其固件。

以下芯片是否可以實現此目的?來自ST:

http://www.st.com/web/zh/catalog/mmc/FM141/SC1169/SS1031

通過UART將藍牙連接到MCU。當我想通過空中編程時,是否需要修改引導加載程序?一個人如何在設備上加載自己的引導程序?引導加載程序代碼是什麼樣的?

我也根據自己的目標接受其他建議。

如果您的引導程序接受來自uart的程序,則應該可以正常工作。當然,您可能需要對其進行調整以初始化BT模塊,但是僅此而已。
引導加載程序的一個關鍵問題是如何強制目標芯片進入引導加載程序模式。(請注意,您不能依賴應用程序!)您將如何做?
@WoutervanOoijen為什麼您不能依靠應用程序將您轉儲為“引導加載程序”模式?您還將如何進行遠程固件更新?
至少對於AVR控制器,如果存在引導程序代碼,則首先執行該程序。然後在閃存中有一條跳轉指令到主程序地址。
例如,由於編程錯誤(電源故障)或錯誤,應用程序可能無法合作。對於遠程引導加載,強制目標進入引導加載模式的唯一“可靠”方法是擁有獨立的(不可更新的)智能設備(例如小型微控制器或內置於通信模塊中的智能設備)。
一 回答:
swineone
2014-06-24 05:59:10 UTC
view on stackexchange narkive permalink

是的,您可以使用STM32進行遠程固件更新。

現在有兩種選擇:

  • 使用STM32的工廠編程的引導程序
  • 編寫自己的引導程序

使用出廠編程的引導程序,需要在將BOOT1引腳拉低且BOOT0引腳拉高的情況下引導芯片,並且藍牙模塊需要連接到特定的USART外設(還有其他接口,具體取決於特定的STM32模型,但我認為USART在這裡最有意義)。另外,您需要按照此處中所述的引導加載程序的命令協議編寫一個與引導加載程序交互的應用程序。為避免編寫代碼以連接到引導加載程序,可以使用 STM32 Flash Loader演示程序;當然,這需要將藍牙連接的另一端插入PC,因此並非在每種情況下都有意義。

另一種可能性是編寫自己的引導程序,從而使您擁有更多控制權。例如,您可以使用純軟件序列來觸發引導加載程序,這樣就無需按照工廠編程的引導加載程序的要求設置某些引腳。當然,編寫這樣的引導程序比使用已經編寫,測試並隨MCU附帶的引導程序要花費更多的精力。

有關編寫自己的引導程序的一些簡短評論。引導加載程序是一段固件代碼,與其他任何代碼一樣。它會在生產(或調試)過程中與主要代碼一起加載到MCU中。

儘管代碼與其他代碼相同,但由於引導加載程序用於對MCU的固件進行重新編程,因此它具有一些特殊的注意事項。首先,為簡單起見,您可能希望使引導加載程序成為與主代碼完全分開的一段代碼。編輯引導加載程序和主代碼的鏈接程序腳本,以使每個腳本都使用完全不同的閃存段。這樣,您可以在不觸摸引導加載程序的情況下更新主代碼。當引導加載程序是主代碼的一部分時,如果更新過程遇到任何類型的問題,則您的設備會變磚。引導加載程序的代碼必須非常,因為引導加載程序中的錯誤可能是用戶在錯誤更新後能夠自己維修設備與被迫將其提供服務之間的區別中央。就我個人而言,我將使引導加載程序盡可能的小而簡單,甚至要盡量避免使用中斷,因為這樣做會使代碼的可預測性降低。通常情況下,我全都喜歡中斷,但是這是我反對使用它們的一種情況。

簡而言之,設備啟動時會加載引導加載程序,通常只是將控制權交給了主代碼。但是,在執行固件更新時,引導加載程序會在引導後運行自己的代碼。該代碼必須包含某種通訊方式(視您的情況而定)或存儲驅動程序,以便它可以通過藍牙,以太網,SD卡,閃存驅動器或其他任何方式接收/讀取更新代碼的二進製文件。然後,它會擦除舊代碼,並使用新代碼對閃存進行重新編程。

對閃存進行重新編程時必須完成的技巧之一是將部分引導加載程序代碼重定位(複製)到RAM中,因為在編程時無法從閃存中運行代碼(即使正在讀取地址)與正在編程的地址不同)。同樣,將要寫入閃存的更新的二進制代碼也必須位於RAM中。通常,沒有足夠的RAM來存儲用於更新的完整代碼,因此,接收/讀取部分代碼塊,編寫,接收/讀取另一部分代碼塊,編寫等等並不罕見。

對閃存進行編程並不是將數據寫入所需地址的簡單問題。 STM32系列的每個成員都有一個Flash編程手冊(例如,此處是STM32F10x系列的手冊)。簡而言之,由於如何實現閃存的底層細節,在對給定塊進行重新編程之前,您需要向其發出擦除命令。另外,您不能在對Flash進行編程時對其進行任何讀取,因此請不要理會中斷,DMA等,除非它們沒有機會在寫入Flash時嘗試從Flash中進行讀取。

謝謝!正是我要找的東西-我聽說STM32允許這樣做。兩個問題:如何在設備上加載自己的引導程序?引導加載程序代碼是什麼樣的?
我已在您對以上信息的評論中添加了對問題的答案。請通過編輯將這些問題移到上面的主要問題的主體,這樣以後再迷失於此問題的任何用戶都不會感到答案與問題斷開了聯繫。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...