實際中通常會用到升級功能。本文主要是記錄下基本設置。
跳轉函數如下:
#define APPLICATION_ADDRESS (uint32_t)0x08002000typedef void (*pfun) (void);
pfun Jump_To_Application;
uint32_t JumpAddress;void go_to_app(void)
{if (((*(volatile uint32_t*)APPLICATION_ADDRESS) & 0x2FFFE000 ) == 0x20000000){JumpAddress = *(volatile uint32_t*)(APPLICATION_ADDRESS + 4);Jump_To_Application = (pfun)JumpAddress;__set_MSP(*(volatile uint32_t*)APPLICATION_ADDRESS);Jump_To_Application();}
}
函數解釋如下:
if (((*(volatile uint32_t*)ApplicationAddress) & 0x2FFFE000 ) == 0x20000000)
:test = (*(volatile u32*)ApplicationAddress)
,test保存的就是堆棧地址(并且是應用程序堆棧的棧頂地址)。查看STM32的向量表,可以知道:棧頂地址 + 4 存放的是復位地址,因此JumpAddress存放的是復位地址。__set_MSP
函數后,將把用戶代碼的棧頂地址設為棧頂指針。CORTEX-M3上電后后檢測BOOT引腳的電平來決定PC的位置。例:BOOT設置為FLASH啟動,啟動后CPU會先取兩個地址:一個是棧頂地址,另一個是復位地址。因此才有了第3、第4點的寫法。
摘自一篇非常詳細的文章,可惜找不到鏈接了。
STM32標準庫可通過下面函數實現重定向:
NVIC_SetVectorTable(0x08000000,0x2000);
HAL庫不再支持該函數,通過下面函數完成重定向:
void SystemInit (void)
{......SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table ......
}
我們修改VECT_TAB_OFFSET
宏定義的值即可:
/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET 0x2000U /*!< Vector Table base offset field.This value must be a multiple of 0x100. */
當需要調整IAP空間時,這里很容易漏掉。經常使用如下定義:
extern int Image$$ER_IROM1$$Base;
#define VECT_TAB_OFFSET ((uint32_t)&Image$$ER_IROM1$$Base)
然后KEIL添加設置:
這樣調整空間的同時,也調整了中斷向量表:
源代碼鏈接:STM32L051_Bootloader。
這一小節記錄下boot遇到的問題,逐漸補充,不針對上一節貼的代碼。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态