|
发表于 2020-4-7 18:09:28
|
显示全部楼层
跳转不过去,必须操作boot0,用的v6的开发版,stm32f429,楼主帮忙检查一下。
程序流程是:
1、检测按键,按下就在备份寄存器写入标志,然后复位;
2、程序开头检测备份寄存器的标志,如果标志正确就跳转到系统存储区。
代码如下:
- 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);
- }
- }
复制代码 |
|