[已解决]请教基于RTT的IAP程序切换到应用程序不成功的问题(基于STM32F4)?

发布于 2014-09-28 10:34:50
用RTT的Ymodem做个IAP程序,切换到应用程序时始终不成功,改成不用RTT系统的IAP测试却是好用的,请问RTT应用IAP程序时应注意哪些问题?单片机是STM32F4

查看更多

关注者
0
被浏览
3.6k
5 个回答
tyw996
tyw996 2014-09-28
谢谢 pangwei的回复,这个帖子刚看了下,跟我的问题好象还不一样,他是APP应用程序的问题,需要修改
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
我的APP是没有问题的,我用不是RTT的IAP程序都能切换过去了。
tyw996
tyw996 2014-09-28
我再详细叙述下我的问题:我的APP应用程序是没问题的,之前是用不带RTT的IAP程序更新Flash及切换到APP应用程序都没问题,现在我将IAP程序改为基于RTT系统了,现在的IAP中更新Flash部分已经屏蔽掉了,只是测试切换APP程序部分出了问题,切换不成功,下面是相关代码,看看有什么问题:

#include "stm32f4xx.h"
#include
#include "flash_if.h"
#include "ymodem.h"
#include "IAP.h"
void EnterAPP()
{
//FLASH_If_Init();
IAP_GPIO_Configuration();
rt_thread_delay(RT_TICK_PER_SECOND/5);
//进入应用程序
if ((((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000
||(((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x1FFE0000 ) == 0x10000000))
{
/* enter interrupt */
rt_interrupt_enter();

// Jump to user application
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
Jump_To_Application = (pFunction) JumpAddress;
// Initialize user application's Stack Pointer
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
Jump_To_Application();


}
}
ALIGN(RT_ALIGN_SIZE)
static char thread_IAP_stack[4096];
struct rt_thread thread_IAP;
static void rt_thread_entry_IAP(void* parameter)
{
EnterAPP();
while (1)
{
rt_thread_delay(RT_TICK_PER_SECOND);
}
}

int rt_IAP_init()
{

//------- init led1 thread
rt_thread_init(&thread_IAP,
"IAP",
rt_thread_entry_IAP,
RT_NULL,
&thread_IAP_stack[0],
sizeof(thread_IAP_stack),7,10);
rt_thread_startup(&thread_IAP);
return 0;
}
tyw996
tyw996 2014-09-28
经多次试验验证跑RTT的IAP程序(至少stm32f4是这样)一旦开始切换线程,可能就无法切换到APP应用程序中(不知道为什么)。

解决方案,
因为我在IAP中用RTT的目的是要用其Ymodem升级程序,所以可以变通一下,RTT在启动线程前去判断是否进入IAP升级程序,

(我用开启BKPSRAM内存用来保存是否进入IAP的标志判断,只要系统不断电此标志一值有效),
如果是就清BKPSRAM的IAP标志,然后跑RTT的Ymodem,否则切换进入APP程序。

若要进入IAP升级APP程序,则应在APP程序中修改IAP标志然后重启,完成IAP升级。

经验证此方案可行。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览