[英]In Application Programming issue
我正在STM32L152RCT6上的項目上工作,在這里我必須建立一種機制來自動更新新選通文件(HEX文件)中的代碼。 為此,我已經實現了諸如引導加載程序之類的機制,在該機制中,它會檢查新固件是否需要交叉驗證以及是否有效,因此必須存儲在“應用程序位置”上 。
我正在采取以下步驟。
現在問題出在第5步,我已經完成了所有上述所有步驟,甚至存儲了數據也都正確完成了(在STM32實用程序中驗證),但是當我跳到應用程序代碼時,它將無法工作。
我需要復查還是缺少什么?
您是否已根據新的錯誤位置更改了應用程序?
例如,必須通過以下方式正確設置向量表
SCB->VTOR = ...
引導加載程序啟動應用程序時,它必須將所有內容都配置為重置狀態,因為應用程序可能會中繼默認重置值。 基本上,您需要:
必須使用FLASH起始點為0x8008000的自定義鏈接描述文件編譯和鏈接您的應用
例如:
FLASH (rx) : ORIGIN = 0x8000000 + 32K, LENGTH = 512K - 32K
與其他ARM控制器在復位時直接跳轉到地址0不同,Cortex-M系列從向量表中獲取起始地址。 如果直接加載程序(沒有引導加載程序),則向量表位於二進制文件的開頭(加載或映射到地址0)。 偏移量為0的第一項是堆棧指針的初始值,地址為4的第二項稱為復位向量,它包含要執行的第一條指令的地址。
用引導加載程序加載的程序通常會保留這種安排,並將向量表放在二進制文件的0x08008000
對於您的情況為0x08008000
。 那么復位向量將在0x08008004
。 但這是您的應用程序,您應該檢查將向量表放在哪里。 提示:請確保查看鏈接器生成的.map
文件。 如果確實位於0x08008000
,則可以將控制權轉移到應用程序重置向量,以便:
void (*app)(void); // declare a pointer to a function
app = *(void (**)(void))0x08008004; // see below
app(); // invoke the function through the pointer
第二行中的復雜轉換將物理地址轉換為指向函數的指針 ,獲取指向它的值(現在是指向函數的指針),並將其分配給app
。
然后,您應該管理到應用程序向量表的切換。 您可以在引導加載程序或應用程序中進行操作,也可以在它們之間划分步驟。
NVIC_DisableIRQ()
。 我會在引導加載程序中執行此步驟,因此它有責任禁用已啟用的功能。 SCB->VTOR
。 注意, system_stm32l1xx.c
中的樣板SystemInit()
函數無條件地將SCB->VTOR
更改回Flash的開頭 ,即更改為0x08000000
,您應對其進行編輯以使用適當的偏移量。 您也可以從向量表中加載堆棧指針值,但是正確地進行操作是很棘手的,並不是真正必要的,應用程序可以繼續使用在引導加載程序中設置的堆棧。 只需檢查它以確保它是合理的。
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
其中FLASH_BASE的值必須等於KEIL中IROM的值的地址
例:
#define FLASH_BASE 0x08004000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.