[TencentOS_tiny_EVB_MX]之程式跳轉

  • 2020 年 3 月 16 日
  • 筆記

TencentOS_tiny_EVB_MX 本身是基於STM32的。

關於STM32的程式跳轉網上也有不少案例和介紹。

現針對TencentOS_tiny_EVB_MX這個,做一個簡單的程式跳轉demo分享出來。

一般程式跳轉,主要的功能是什麼呢。

一般有一個比較簡單的程式,可以作為boot程式,這個boot程式的功能,就是用於啟動app程式。

可能會有人不太清楚,一個STM的KEIL,怎麼還會有boot程式和app程式的區別呢。

這裡的boot和app只是個概念,是根據用途定義的。實際上兩個程式都是keil編譯出來的,和stm32底層沒有關係。

這樣做的一個好處呢,就是可以把boot設計的簡單,功能單一。只支援啟動,或者再額外支援可以通過串口或者USB等將編譯好的app的keil程式,拷貝到FLASH,再由boot啟動運行APP程式。

說白了,就是一個keil程式調用另一個keil程式的過程。

因為對於實際用途,特別是不方便使用keil來燒錄程式。

當然,對於IOT的應用來說,更希望具備遠程更新程式功能,那麼程式跳轉的設計就應運而生了。

說了一大堆,開始上程式碼。

首先拿TencentOS_tiny_EVB_MX里的兩個demo作為案例。

hello_world作為boot程式

將hello_world作為boot程式,需要添加相應的程式碼部分。

tencent_cloud_sdk_mqtt 作為app程式部分

既然FLASH要存在兩個程式,就要對FLASH進行空間劃分了。

手上的這個FLASH是256K的。

將前面的64K作為BOOT部分

將後面的作為APP部分。起始地址就是0x8010000。

當然需要根據實際的BOOT大小劃分。

有讀者想問,BOOT部分可以不使用TencentOS_tiny的程式碼模板嘛。這個就看你喜好了。

只是TencentOS_tiny這個程式碼模板放著是現成的,能用就用吧,多用一次就熟悉一次。

一 先看BOOT 部分。

BOOT要作什麼呢。

BOOT的程式也比較簡單,就是寫一個跳轉函數就可以了。

這樣BOOT程式部分就實現了。運行hello_world程式後,執行task1後,就跳轉到了APP程式了。

二 APP程式部分

1 KEIL的設置。

需要根據實際的APP地址來設置。

2 設置中斷向量表。

在應用程式里,在一開始,最好把中斷開起來。因為在BOOT程式,已經把中斷關閉的。因此需要在APP這邊,先把中斷使能了。

到這裡,就可以實現程式跳轉功能了。運行的效果列印消息就不貼上來了。

那麼問題來了。

BOOT程式一般只燒錄一遍,APP可能會需要添加功能,修改bug等需要維護,則需要重新燒錄。對於本地下載呢,可以直接使用KEIL只燒錄APP部分程式碼就行了

但是對於遠程呢,怎麼辦呢。

即便是能把文件傳輸到板子呢,是直接燒錄到APP所有的FLASH嗎、那不會把原來程式刷沒呢。

正在運行的程式,被刷掉了,不會異常結束嘛。

那這裡,SPI_FLASH就起到作用了。

可以先把收到遠程發過來的程式,存放到SPI_FLASH里。SPI_FLASH有8M呢,多存幾份都不是問題呢。

然後在BOOT啟動的時候,就可以把程式從SPI_FLASH拷貝到FLASH里,這樣就可以實現遠程更新APP用戶程式了。

下一篇文章會介紹下TencentOS_tiny_EVB_MX 中,SPI FLASH驅動的實現。可以讀寫SPI_FLASH。

貌似在TencentOS_tiny_EVB_MX里,沒有看到相應的驅動,不知道是不是還沒有實現,還是沒有檢查仔細。

如果想體驗的,可以到https://github.com/xidongliang/TencentOS_tiny_EVB_MX_Plus_QSPI

下載我移植的驅動,不過,沒有介紹,需要自己手動啟用支援QSPI宏,才能使用QSPI功能。

將會在下一篇文章介紹這個驅動。

就是參考了相關QSPI的驅動,然後將這個驅動移植到了TencentOS_tiny_EVB_MX板子

為了方便用戶編程,就直接在原來板子程式碼上的spi.c和spi.h進行修改。並沒有重新生成qspi等庫文件。

Tags: