我在使用STM32的IAP升级,一开始用官方的demo修改之后可以正常的使用串口进行升级,但是公司的产品中必须要加一个外设,SP706TEN当没有及时输入电平反转(1.6S内)到WDI引脚,外设将产生低电平给STM的NRST,产生复位。
问题就出现在这里。
如图,SP706TEN的结构如上,我在原有代码的基础上增加了一个定时器TIM3,在TIM3中每0.5秒使WDI电平反转来给(SP706TEN)喂狗。
程序一开始运行都是OK的,当进入了下载界面,程序就跑飞到HardFault_Handler故障中去了,我猜想的原因是因为TIM3没有及时喂狗导致产生了复位,内存溢出或访问越界吧。但是不清楚为什么。
下载的代码跟官方demo一样,如下
/*******************************************************************************
* @函数名称 SerialKeyPressed
* @函数说明 测试超级终端是否有按键按下
* @输入参数 key:按键
* @输出参数 无
* @返回参数 1:正确
0:错误
*******************************************************************************/
uint32_t SerialKeyPressed(uint8_t *key)
{
if ( USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET)
{
*key = (uint8_t)USART2->DR;
return 1;
}
else
{
return 0;
}
}
/*******************************************************************************
* @函数名称 Receive_Byte
* @函数说明 从发送端接收一个字节
* @输入参数 c: 接收字符
timeout: 超时时间
* @输出参数 无
* @返回参数 接收的结果
0:成功接收
1:时间超时
*******************************************************************************/
static int32_t Receive_Byte (uint8_t *c, uint32_t timeout)
{
while (timeout-- > 0)
{
if (SerialKeyPressed(c) == 1)
{
return 0;
}
}
return -1;
}
接收文件是用while(1)不停检测usart标志位来接收数据,并不会干扰TIM3的中断发生,但是为什么程序一进行到下载界面就崩掉了????
注:
1.当进入下载界面选择的时候输入过1,2,几个单独的按键,也通过上面的代码接收,TIM3都没有死掉,但是下载接收(连续)就死掉了
2.如外设的原理图,JUMP2不插跳线帽的时候是不会产生硬件中断的,因此我一开始没加TIM3的程序所有功能都是OK的。但是公司要求升级的时候不能拆盖(也就是说跳线帽是插上的),因此1.6S内不使WDI电平反转(达到喂狗效果),就会产生复位,也就是加定时器的时候出的错。
自己找了好久都没有思路与方法,还请大家帮忙分析一下,是什么原因,如何有效的去解决。谢谢!