在stm32中,從bootloader程式中要跳轉到最後的主任務程式中,需要我們自己去做一下以下事情:
首先,需要把stm32的所有中斷關閉,否則可能導致跳轉的失敗。
其次,要設定到新的堆疊首位址,即最後要跳轉的主任務程式的起始位址。
接著,就是要將要跳轉到達的程式的首位址賦值給乙個函式指標。
最後,就是利用剛才的函式指標完成跳轉。
博主以自己之前實際中用到的程式,進行舉例:
/* 需要在對應檔案中增加下列標頭檔案以及巨集定義等 */如上圖中**,博主使用的是stm32f429的晶元,程式中使用了stm的hal庫,所以先包含需要的標頭檔案。在程式編譯時,設定的要跳轉到的程式首位址為program_address定義的位址,即0x08000000,接著定義乙個函式指標。由於stm中斷向量表的設定,實際main函式的位址有乙個4位元組的偏移,所以給函式指標賦值時,為program_address+0x4。接著使用__set_msp設定堆疊的首位址。然後close_all_int()函式關閉所有的中斷。最後將賦值好的函式指標,呼叫完成跳轉。#include "stm32f4xx_hal.h"
#define close_all_int() __set_primask(1)
#define program_address 0x08000000 /* 要跳轉到的位址 */
typedef void (*iapfun)(void);
/* 在程式中需要跳轉的地方新增下列** */
__set_msp(*(volatile uint32_t *)program_address);
close_all_int();
stm32最簡單的實現BootLoader
bootloader大家應該都知道是幹什麼的,簡單的來說就是程式開始執行前的一段程式。網上有非常多的檔案有介紹過stm32 bootloader的實現。但是講的可能比較深入難以理解,實現更是無從下手。今天這裡注意介紹最簡單實現的方式,關鍵 只有幾行,每錯,真的就只有 幾行。主要實現晶元是stm32f...
STM32學習之 stm32中C語言的資料型別
stm32 c語言資料型別 在程式設計過程中,不同的cpu,其資料型別的意義各不相同,所以一定要注意相應變數資料型別的定義和轉換,否則在計算中可能會出現不確定的錯誤。一 c語言中的種類資料 整型 int short long 實型 float double stm32中的資料型別非常的多,常用的變數...
預熱2 什麼是STM32?認識STM32
1 什麼是stm32 stm32是由arm公司設計,意法半導體 st 公司生產的基於 arm cortex m 核心的32 位的mcu 系列。2 stm32能做什麼?stm32 屬於乙個微控制器,適用於控制類,自帶了各種常用通訊介面,比如 usart i2c spi 等,可接非常多的感測器,可以控制...