|
发表于 2020-4-7 18:59:44
|
显示全部楼层
我用的标准库,V6开发版,无法从应用程序跳转到系统存储区,程序流程是:
1、检测到按键按下后写标志到备份寄存器,然后reset;
2、在主程序开始检测备份寄存器的标志,然后跳转到系统存储区。
现象是备份寄存器标志是对的,但是就是跳转不到系统存储区,或者跳转过去了就是不执行boot程序。
- typedef void (*pFunction)(void);
- pFunction Jump_To_Application;
- uint32_t JumpAddress;
- #define APPLICATION_ADDRESS 0x1FFF0000
- //跳转到应用程序区
- static void JumpToApp(void)
- {
- JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
- /* 用户应用地址 */
- Jump_To_Application = (pFunction) JumpAddress;
- /* 初始化MSP */
- __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
- Jump_To_Application();
- }
- void Boot_Start(void)
- {
- /* 电源接口时钟使能 (Power interface clock enable) */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
- /* DBP 位置 1,使能对备份域的访问 */
- PWR_BackupAccessCmd(ENABLE);
- RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div2);
- RCC_RTCCLKCmd(ENABLE);
- if(RTC_ReadBackupRegister(RTC_BKP_DR0) == 0xE0E0)
- {
-
-
- //Delay_Ms(100);
- RTC_WriteBackupRegister(RTC_BKP_DR0, 0x0);
- //Delay_Ms(100);
-
- RCC_RTCCLKCmd(DISABLE);
- PWR_BackupAccessCmd(DISABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, DISABLE);
-
- JumpToApp();//跳转到应用程序区
-
- while(1)
- {
- };
- }
- else
- {
- RCC_RTCCLKCmd(DISABLE);
- PWR_BackupAccessCmd(DISABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, DISABLE);
- }
- }
- void SoftReset(void)
- {
- __set_FAULTMASK(1);
- NVIC_SystemReset();
- }
- void Boot_Reset(void)
- {
- /* 电源接口时钟使能 (Power interface clock enable) */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
- /* DBP 位置 1,使能对备份域的访问 */
- PWR_BackupAccessCmd(ENABLE);
- RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div2);
- RCC_RTCCLKCmd(ENABLE);
-
- RTC_WriteBackupRegister(RTC_BKP_DR0, 0xE0E0);
-
- if(RTC_ReadBackupRegister(RTC_BKP_DR0) == 0xE0E0)
- {
- SoftReset();
- while(1);
- }
- }
复制代码 |
|