历史上的今天
今天是:2024年08月22日(星期四)
2018年08月22日 | STM32程序跳转后死机现象解决
2018-08-22 来源:eefocus
正在用STM32单片机,移植了官方IAP,使用没问题,但是每次下载程序都要重启,嫌麻烦后来想发个命令直接跳转到IAP,参考官方IAP的跳转程序,将APPLICATION_ADDRESS改为0x08000000
#define APPLICATION_ADDRESS (uint32_t)0x08000000
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
void JumpToIAP(void)
{
uint32_t JumpAddress;
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4); /* Jump to user application */
Jump_To_Application = (pFunction) JumpAddress;/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
Jump_To_Application();
}
那么问题来了,跳转完单片机就死翘翘了,后来查资料,发现要改中断向量偏移地址,于是又加了这句话:
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);
依然死翘翘,再找资料。无意间看到网友出现过同样问题,试着改一下,果然好使。那么问题出在哪呢?
原来是跳转之前的APP程序里有些中断没有关,跳转之后中断触发,但IAP程序里没有定义中断响应函数,找不到地址才导致死机。好了,跳转前关掉中断不就哦柯了。我用了RCC,TIM3,和USART1,全部关掉关掉
TIM_DeInit(TIM3);
TIM_Cmd(TIM3, DISABLE);
USART_DeInit(USART1);
USART_Cmd(USART1,DISABLE);
RCC_RTCCLKCmd(DISABLE);
再跳转,哈哈,IAP果断出现,下载程序再也不用重启了。
史海拾趣
|
想做一个cab安装包,安装今日插件,按照网上的说明写了个安装程序setupdll.dll, 但是在模拟器上(pocket pc se 2003 Emulator)安装发现setupdll没有被调用(在函数Install_Exit中加了MessageBox,没有弹出,注册表也没写) cab安装包使用vs2005做的 ...… 查看全部问答> |
|
我想使用EINTT4作按键中断输入.定义如下: UINT32 g_EINTIrq = IRQ_EINT4; UINT32 g_EINTSysIntr = SYSINTR_UNDEFINED; PUBLIC DWORD CPK_Init(DWORD dwContext) { &n ...… 查看全部问答> |
|
dshow CreateMediaType FreeMediaType 无法解析的外部符号 我在wince6.0上做dshow开发,已经包含的头文件和库 #include #include #include #include #include &n ...… 查看全部问答> |
|
MCS-51单片机中,采用12Mhz时钟,定时器T0采用模式1(16位计数器),请问在下面程序中,p1.0的输出频率 ? MOV TMOD,#01H SETB TR0 LOOP:MOV TH0,#0B1H MOV TL0,#0E0H LOOP1:JNB TF0,LOOP1 CLR TR0 CPL P1.0 SJMP LOOP… 查看全部问答> |
|
ADS1.2 调用strtoul(str,NULL,0,NULL),地址0的内容会被更改 strtoul的定义: unsigned long strtoul(const char *str, char **endptr, int requestedbase, int *ret) 可见ADS1.2会把NULL指针指向地址0,但是地址0放着复位向量,怎么样才能不改变0地址的内容呢?(当然在调用的时候可以不用NULL,而定义一个 ...… 查看全部问答> |




