你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32死机,内部硬件看门狗也不复位

[复制链接]
linalinb 提问时间:2018-8-27 08:40 /
我做了几十套通讯板,采用的是单片机型号是stm32f103c8t6,用上了UART1和UART2两个通讯口,并使用了内部硬件看门狗,喂狗语句只在主循环里有一条,按理说如果死机的话,肯定会复位的。实际使用中还是会出现死机现象,要断电重启才能正常,请问是什么原因导致的?谢谢!
收藏 评论40 发布时间:2018-8-27 08:40

举报

40个回答
wenyangzeng 回答时间:2018-8-27 13:26:43
linalinb 发表于 2018-8-27 11:09
有道理,不过设短了就要在其它地方再加喂狗指令了,我担心在其它地方加多了喂狗指令,如果跑飞会更容易被 ...

其实喂狗只放在主循环并不很安全。在所有do{}while()都要放。你不能保证这些do{}while()里会出现何种意外。
linalinb 回答时间:2018-8-27 16:22:38
void USART2_IRQHandler(void)
{
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {
        if(kk==0)
        {
            Tm3=20;
            ch2[0] = USART_ReceiveData(USART2);
            if(ch2[0]==0x01)
            {
                kk=1;
                return;
            }
        }
        if(kk==1)
        {
            Tm3=20;
            ii++;
            ch2[ii]= USART_ReceiveData(USART2);
        }
    }


    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {
        USART_ClearFlag(USART2, USART_FLAG_RXNE);
        USART_ClearITPendingBit(USART2, USART_IT_RXNE);
    }

    if (USART_GetFlagStatus(USART2, USART_FLAG_PE) != RESET)
    {
        USART_ReceiveData(USART2);
        USART_ClearFlag(USART2, USART_FLAG_PE);
    }

    if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
    {
        USART_ReceiveData(USART2);
        USART_ClearFlag(USART2, USART_FLAG_ORE);
    }

    if (USART_GetFlagStatus(USART2, USART_FLAG_FE) != RESET)
    {
        USART_ReceiveData(USART2);
        USART_ClearFlag(USART2, USART_FLAG_FE);
    }
}

==========================================
我这个中断处理函数也有点问题,那个return会导致不会执行后面的清标志位的语句,但是如果不断的进出中断的话,如果没喂狗应该也会复位吧,而测试却也很正常。
linalinb 回答时间:2018-8-27 16:03:36
jy04706985 发表于 2018-8-27 15:39
我觉得这种情况并没有死机,也会正常喂狗,只不过主循环内的程序执行的比较慢,导致按键或者显示响应不及时 ...

int main(void)
{
    // u8 ChkSum,j;
    //===============================================//
#ifdef DEBUG
    debug();
#endif
    SysInit();
    __nop();
    //=====================================//
    //=====================================//
    //01 10 00 00 00 0F 1E (00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00) E9 D6
    Send_To_PLC_Data[0]=0x01;
    Send_To_PLC_Data[1]=0x10;
    Send_To_PLC_Data[2]=0x00;
    Send_To_PLC_Data[3]=0x00;
    Send_To_PLC_Data[4]=0x00;
    Send_To_PLC_Data[5]=0x0f;
    Send_To_PLC_Data[6]=0x1e;

    //01 03 00 32 00 04 E5 C6
    Read_PLC[0]=0x01;
    Read_PLC[1]=0x03;
    Read_PLC[2]=0x00;
    Read_PLC[3]=0x32;
    Read_PLC[4]=0x00;
    Read_PLC[5]=0x04;
    Read_PLC[6]=0xe5;
    Read_PLC[7]=0xc6;
    //=====================================//
    GPIO_ResetBits( GPIOB, GPIO_Pin_3);
    while(1)
    {
        IWDG_ReloadCounter();
        Run();
    }
}
我的程序如上,主程序很简单,没有按键与显示处理功能,只是将产品数据与PLC数据交换,所有功能都在Run();函数完成,此函数完成时间约4秒左右,如上所示就一条喂狗指令,我设想是如果超时6秒在Run()函数没有正确返回,就不能喂狗,程序应该就能复位,在实验室测试也可以,但在车间实际使用一段时间就会偶尔出现死机现象,只有关电重启才能恢复正常工作。
chifen 回答时间:2018-8-27 08:54:22
你有没有测试 ,不喂狗时会不会复位

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

七哥 回答时间:2018-8-27 09:07:43
本帖最后由 toofree 于 2018-8-27 09:09 编辑

这么成熟的片子,不至于有这问题,项目中用过stm32f103看门狗,一直未出问题。
单独测试喂狗吧。看看不喂狗的话,会不会复位重启。
初始化看门狗,需要打开看门狗,并喂狗,当然还有一些其它设置,时钟源、喂猪周期等。请使用单独看门狗。窗口看门狗不要使用了,对你来说窗口看门狗更不好搞,需要在“窗口”内喂狗。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

linalinb 回答时间:2018-8-27 09:17:17
chifen 发表于 2018-8-27 08:54
你有没有测试 ,不喂狗时会不会复位

实验测试不喂狗可以复位,而且在我们实验长期测试也没出现过死机的现象,但在车间使用中就偶尔出现死机的问题了,板子是装在设备上的,车间环境比较恶劣,干扰也比较大
wenyangzeng 回答时间:2018-8-27 09:24:02
本帖最后由 wenyangzeng 于 2018-8-27 09:25 编辑

楼主只要在主循环里不喂狗,就能知道看门狗配置是否正确。顺便知道喂一次够多长时间比较合适。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

linalinb 回答时间:2018-8-27 09:31:44
本帖最后由 linalinb 于 2018-8-27 10:05 编辑
toofree 发表于 2018-8-27 09:07
这么成熟的片子,不至于有这问题,项目中用过stm32f103看门狗,一直未出问题。
单独测试喂狗吧。看看不喂狗 ...

我现在没使用窗口看门狗,只使用了内部硬件看门狗,而且就只在主循环里只用了一条喂狗指令,长期实验测试都没问题,用在设备上,在车间长期使用过程中就有偶尔出现死机现象,需要断电重启。在车间工作是24小时不间断的,会不会与UART1和UART2中断冲突有关呢?
linalinb 回答时间:2018-8-27 09:37:32
wenyangzeng 发表于 2018-8-27 09:24
楼主只要在主循环里不喂狗,就能知道看门狗配置是否正确。顺便知道喂一次够多长时间比较合适。 ...

是个好办法,我也想干脆去掉喂狗指令,每运行6秒就复位一次(看门狗设置溢出周期为6秒),但是这样一些通讯数据就可能会出现错乱。不过可以这样试试。
海迹天涯 回答时间:2018-8-27 09:37:42
linalinb 发表于 2018-8-27 09:17
实验测试不喂狗可以复位,而且在我们实验长期测试也没出现过死机的现象,但在车间使用中就偶尔出现死机的 ...

去年做了一款产品,STM32F051R8,是13.56M赫兹的无线通信产品,偶尔也会出现你说的这种情况,因为只有某些客户的现场才会出现这种现象,自己公司测几个月都没问题,客户拍了视频我看了,确实死机了。结果也一直没找到原因,请问你找到了吗?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

linalinb 回答时间:2018-8-27 09:41:12
海迹天涯 发表于 2018-8-27 09:37
去年做了一款产品,STM32F051R8,是13.56M赫兹的无线通信产品,偶尔也会出现你说的这种情况,因为只有某 ...

就是没找到原因,所以来这里请教大家,这问题很头痛。早知道会出现这种问题的话,加外部看门狗芯片可能就好。
linalinb 回答时间:2018-8-27 09:50:15
wenyangzeng 发表于 2018-8-27 09:24
楼主只要在主循环里不喂狗,就能知道看门狗配置是否正确。顺便知道喂一次够多长时间比较合适。 ...

实验测试不喂狗是可以正常复位,说明配置应该是正确的,我配置的是6秒次溢出,但在车间使用是还会偶尔出现死机的情况,必须要断电重启才行。
废鱼 回答时间:2018-8-27 10:05:40
测试一下晶振是否正常工作。我发生过类似的问题,是因为晶振停止导致的。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wenyangzeng 回答时间:2018-8-27 10:24:12
linalinb 发表于 2018-8-27 09:50
实验测试不喂狗是可以正常复位,说明配置应该是正确的,我配置的是6秒次溢出,但在车间使用是还会偶尔出 ...

看门狗好像要做到6秒有点困难,楼主不妨缩短时间。2秒差不多了。
linalinb 回答时间:2018-8-27 10:27:12
wenyangzeng 发表于 2018-8-27 10:24
看门狗好像要做到6秒有点困难,楼主不妨缩短时间。2秒差不多了。

// 硬件看门狗配置
void IWDG_Config(void)
{
    /* Enable write access to IWDG_PR and IWDG_RLR registers */
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
    /* IWDG counter clock: LSI/32 */
    IWDG_SetPrescaler(IWDG_Prescaler_64); //40khz/64=0.625khz=1.6ms
    /* Set counter reload value to obtain 250ms IWDG TimeOut.
       Counter Reload Value = 250ms/IWDG counter clock period
                            = 250ms / (LSI/32)
                            = 0.25s / (LsiFreq/32)
                            = LsiFreq/(32 * 4)
                            = LsiFreq/128
     */
    IWDG_SetReload(4000); // 1.6msX4000=6.4s   0xfff is max
    /* Reload IWDG counter */
    IWDG_ReloadCounter();
    /* Enable IWDG (the LSI oscillator will be enabled by hardware) */
    IWDG_Enable();
}
这个配置是6秒多,应该是没错的
wenyangzeng 回答时间:2018-8-27 10:29:47
本帖最后由 wenyangzeng 于 2018-8-27 10:34 编辑
linalinb 发表于 2018-8-27 09:50
实验测试不喂狗是可以正常复位,说明配置应该是正确的,我配置的是6秒次溢出,但在车间使用是还会偶尔出 ...

无标题.png
太长延时,看门狗i容易受外部干扰



评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

linalinb 回答时间:2018-8-27 10:37:27
安 发表于 2018-8-27 10:05
测试一下晶振是否正常工作。我发生过类似的问题,是因为晶振停止导致的。 ...

这个倒没注意到,说不定真有可能这个原因,不过晶振停振一般会是什么原因造成的呢?难道是干扰造成吗?
123下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版