找回密码
 立即注册
查看: 772|回复: 7

STC32F定时器延时问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-13 13:22:49

5

主题

11

回帖

77

积分

注册会员

积分
77
发表于 2024-1-12 09:02:30 | 显示全部楼层 |阅读模式
最近调试32F程序,发现一个难以理解的问题,不知道群里有没有人经历过,是根本解决了还是绕道走了。就是定时器计数(定时器节拍为100ms),计数到给定数值后跳出,32F的执行结果是程序死掉了,经测试,定时器运行正常,但不是所有的地方都死掉,写入程序后在固定的某一段延时程序死掉,开始有一处死掉,后来绕道走了,但后来编写程序又有一段也是死掉,尽管也可以绕道过去,但想知道个究竟,经过反复测试没有头绪,今天放到群里,看看有没有类似经历的朋友。此延时方式在以前的15F好8G上没有发生过。第一次发现的程序如下,

void LoadWeight(word bWork)
{
        if(gsPar.bpRam[1] == 1)return;
        if(bWork == 1)MoveDw();
        else
                MoveUp();       
        gwTimer = 0;
        while(gwTimer <= 20);
        MoveStop();
       
//        if(gsPar.bpRam[1] == 1)return;       
//        if(bWork == 1)
//        {
//                MoveDw();
//                gwTimer = 0;
//                while(gwTimer <= 20);
//                MoveStop();
//        }
//        else
//        {
//                MoveUp();
//                gwTimer = 0;
//                while(gwTimer <= 20);
//                MoveStop();
//        }
}
没有屏蔽的段落,在15F,8G上正常,但在32F上会跑死,本段落屏蔽后,启用下边屏蔽的就会通过。经过多次测试,本段落的while(gwTimer <= 20);调整为:while(gwTimer <= 20)_nop_();后正常。

还有一段是:

                                                gwTimer = 0;
                                                while(gwTimer <= 2)_nop_();
                                                Display(ERRP,0);
                                                gwTimer = 0;
                                                while(gwTimer <= 20)_nop_();

上述正常,但while(gwTimer <= 2)_nop_();改为while(gwTimer <= 2);便会跑死,下边的显示程序不在执行。

项目程序还有许多                        gwTimer = 0;
                                                while(gwTimer <= x);方式,目前发现上述两处需要绕道解决。
不知道群里朋友有没有经历,或者谁知道问题所在,望指点,谢谢!



回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:444
  • 最近打卡:2025-06-16 09:26:42
已绑定手机

39

主题

2059

回帖

7070

积分

论坛元老

积分
7070
发表于 2024-1-12 14:19:00 | 显示全部楼层
按照你说的方法写了一个测试程序,没能复现问题,用附件例程试试看。

STC32F定时器延时.zip

14.78 KB, 下载次数: 74

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-13 13:22:49

5

主题

11

回帖

77

积分

注册会员

积分
77
发表于 2024-1-12 15:14:56 | 显示全部楼层
乘风*** 发表于 2024-1-12 14:19
按照你说的方法写了一个测试程序,没能复现问题,用附件例程试试看。

谢谢,单独测试测试不出来,以前的8位机一直着这么用的。程序是原来的移植过来的。但在32F上出问题,而且不是全部,仅仅是个别的地方,目前全部改成while(gwTimer <= 20)_nop_();了,加个空指令。功能性的执行全部通过了。但还有新的问题,就是整个程序运行,不知道什么时候会死机。目前正在查找原因。调试上述bug时,死机的时候,在定时器里调试 SBUF = gwTimer;通过串口看到数据正常。我怀疑程序跑飞了,什么原因促成的,目前还不知道。之前的是某一程序段,固定语句跑飞,换种方式解决了,但是整体运行程序在一个未知时间点跑飞,目前正在记录运行时间测试,看看是否是固定时间点触发了什么。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-13 13:22:49

5

主题

11

回帖

77

积分

注册会员

积分
77
发表于 2024-1-12 15:18:45 | 显示全部楼层
乘风*** 发表于 2024-1-12 14:19
按照你说的方法写了一个测试程序,没能复现问题,用附件例程试试看。

比如上述屏蔽段,和非屏蔽段,作用是一样的,但是非屏蔽段不能正常运行,换一种方式改为屏蔽段的编写方式,就正常运行,没有理由可讲。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-13 13:22:49

5

主题

11

回帖

77

积分

注册会员

积分
77
发表于 2024-1-12 16:17:11 | 显示全部楼层
乘风*** 发表于 2024-1-12 14:19
按照你说的方法写了一个测试程序,没能复现问题,用附件例程试试看。

刚刚试了ICacheOn()功能,通电后依然死在了void LoadWeight(word bWork)的while(gwTimer <= 20);里边 ,更改为while(gwTimer <= 20)_nop_();后通过了。预计这个原因找不到,还会出现其他问题,比如程序整体运行后的未知死机现象,非常像程序跑飞了,明天我在循环里边喂狗试试。程序工作后,自己退出到待机状态就证明确实程序跑飞了。实验结果我发到这里。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:444
  • 最近打卡:2025-06-16 09:26:42
已绑定手机

39

主题

2059

回帖

7070

积分

论坛元老

积分
7070
发表于 2024-1-12 16:22:17 | 显示全部楼层
mengxu*** 发表于 2024-1-12 16:17
刚刚试了ICacheOn()功能,通电后依然死在了void LoadWeight(word bWork)的while(gwTimer  ...

能否提供一个简单的,能够复现问题的项目进行分析?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-13 13:22:49

5

主题

11

回帖

77

积分

注册会员

积分
77
发表于 2024-1-13 11:22:37 | 显示全部楼层
乘风*** 发表于 2024-1-12 16:22
能否提供一个简单的,能够复现问题的项目进行分析?

怀疑程序停在了某一个时间点,还确实是。昨天下班后保留机器程序正常运转,显示信息换成计时信息,在90分钟的一个时间点上,有一句判断执行虚拟按键的程序,在判断语句上停止了,早晨来时看到时间停留在7200s上(上电从5400开始)。
        if(giDifF >= 500 || gdwTime >= gdwInterval)SetKey(KEY_cal);
gdwTime 记录到7199停止。虚拟按键程序里边就是更改两个变量的状态,没有循环语句。
先试着绕道解决这个问题,有时间的话我把项目程序的外设虚拟或删掉,技术核心部分虚拟或删掉,仅留串口做测试分析,如果还能遇到上述问题,我发文在此供大家研究。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-10 16:08:45

6

主题

131

回帖

666

积分

高级会员

积分
666
发表于 2024-2-4 15:29:35 | 显示全部楼层
STC32F12K54 LQFP48 UART2 我的配置不太成功(基本都是误码), 我使用的自己的板子, 和追风剑开发板

请问谁有一个成功的例子?
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 05:19 , Processed in 0.123529 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表