|
本帖最后由 yunqing_abc 于 2019-6-19 15:59 编辑
单片机类型:STM32F407VET6
编译环境:IAR7.7
各位大佬,我先说一下我的问题:
我打算在原有的程序中增加一个IAP功能,将主程序放在FLASH的0x08040000位置,实现程序上电就能自动跳转到0x08040000的位置。
- #define ApplicationAddressOne 0x08040000
- typedef void (*pFunction)(void);
- __root void funclnrom(void) @ ".funflash"
- {
- __IO uint32_t JumpAddress;
- pFunction Jump_To_Application;
- __set_PRIMASK(1);
- __disable_irq();
- if(((*(volatile vu32*)ApplicationAddressOne)&0x2FFE0000)==0x20000000)
- {
- JumpAddress = *(volatile uint32_t *)(ApplicationAddressOne + 4);
- Jump_To_Application = (pFunction)JumpAddress;
- __set_MSP(*(volatile uint32_t*)ApplicationAddressOne);
- Jump_To_Application();
- }
- }
复制代码
上边这段代码是我在原来的程序中增加的IAP跳转程序,这段程序我放在了FLASH的0x08000000位置,在icf中做好了相关的配置。
在原来的main函数中增加了两行代码,最上边两行就是增加的代码。
- int main(void)
- {
- [color=Red] __disable_irq(); //关闭总中断
- NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x40000);[/color]
- SysInit();
- Init_Paras();
- KEY_Start();
- CTR_Start();
- ERRO_Start();
- ModBus_Start();
- ROJ_Start();
- EEPROM_Start();
- FLASHEE_Start();
- HMI_Start();
- RTC_GetTime(RTC_Format_BCD, &RTC_TimeStructure1);
- RTC_GetDate(RTC_Format_BCD, &RTC_DateStructure1);
- QF_run();
- }
复制代码
现在的问题是,我用仿真器下载后,程序可以运行。而断开仿真器后,重新上电,程序无法运行。
我在IAR 仿真的时候,发现如果用复位按钮复位,PC指针的值是正确的,而重新上电后,PC指针的值是不对的,而此时程序是无法运行的,求大佬指点,是哪里出现了问题,谢谢!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|