簡體   English   中英

在應用程序編程中

[英]In Application Programming issue

我正在STM32L152RCT6上的項目上工作,在這里我必須建立一種機制來自動更新新選通文件(HEX文件)中的代碼。 為此,我已經實現了諸如引導加載程序之類的機制,在該機制中,它會檢查新固件是否需要交叉驗證以及是否有效,因此必須存儲在“應用程序位置”上

我正在采取以下步驟。

  1. 引導加載程序地址= 0x08000000
  2. 應用地址= 0x08008000
  3. 必須在指定位置的某個位置通過引導加載程序檢查新文件。
  4. 如果發現有效,則必須在位置上復制所有十六進制(根據指南)。
  5. 比在該位置跳轉來運行應用程序代碼要好。

現在問題出在第5步,我已經完成了所有上述所有步驟,甚至存儲了數據也都正確完成了(在STM32實用程序中驗證),但是當我跳到應用程序代碼時,它將無法工作。

我需要復查還是缺少什​​么?

您是否已根據新的錯誤位置更改了應用程序?

例如,必須通過以下方式正確設置向量表

SCB->VTOR = ...

引導加載程序啟動應用程序時,它必須將所有內容都配置為重置狀態,因為應用程序可能會中繼默認重置值。 基本上,您需要:

  1. 將所有硬件寄存器的值恢復為其復位值
  2. 關閉所有外設時鍾(不要忘記SysTick)
  3. 禁用所有允許的中斷
  4. 將所有時鍾域恢復為其復位值。
  5. 設置向量表地址
  6. 從APP向量表的開頭加載堆棧指針。
  7. 調用APP入口點。(轉換器表開始+ 4)

必須使用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

然后,您應該管理到應用程序向量表的切換。 您可以在引導加載程序或應用程序中進行操作,也可以在它們之間划分步驟。

  • 禁用所有中斷並停止SysTick。 請注意, SysTick不是中斷 ,請不要在其上調用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

Keil配置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM