3092|9

327

帖子

1

TA的资源

纯净的硅(初级)

楼主
 

STM32会偷懒的BUG [复制链接]

 
本帖最后由 shipeng 于 2018-8-18 09:43 编辑

遇到一个奇怪的bug,非要设置断点监视单片机运行才能正常执行,全速运行后似乎单片机会自动跳过某一行,请教高人:
芯片用的是STM32F429

void TimeRefresh(void)
{
        static u16 time_reg=0xFFFF;
        u16 buf16=CUS_RTCTimeGet()>>8;
        if (buf16!=time_reg)
        {
                time_reg = buf16;
                DispTime();
        }
}

以上是一个显示时间刷新函数,现在有个问题时间老是停住不被刷新,仿真后在if里面“time_reg = buf16;”行设置断点发现程序根本不会进入if里面运行,但是如果在“u16 buf16=CUS_RTCTimeGet()>>8;”行设置断点后又能进入if条件从而成功刷新时间不知道做何解,可能有人会怀疑是CUS_RTCTimeGet()函数调用太频繁导致,特别说明一下此问题函数我是1秒才调用1次的。另外我再附上CUS_RTCTimeGet()函数:
u32 CUS_RTCTimeGet(void)
{
        u32 buf32;
        RTC_TimeTypeDef RTC_TimeStruct;
        HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BCD);
        buf32=(RTC_TimeStruct.Hours<<16)|(RTC_TimeStruct.Minutes<<8)|RTC_TimeStruct.Seconds;
        return buf32;
}


此帖出自stm32/stm8论坛

最新回复

好帖子。赞!赞!赞!赞!赞!赞!赞!赞!赞!赞!  详情 回复 发表于 2018-8-17 17:49
点赞 关注(1)
个人签名模电临时工
 

回复
举报

28

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
把编译器的优化等级调低一点看看呢。
此帖出自stm32/stm8论坛

点评

可以试下,能不能换个方法加个关键字阻值编译器优化,buf16加个volatile修饰?  详情 回复 发表于 2018-8-16 17:18
 
 

回复

327

帖子

1

TA的资源

纯净的硅(初级)

板凳
 
本帖最后由 shipeng 于 2018-8-16 17:21 编辑
D6_204 发表于 2018-8-16 16:56
把编译器的优化等级调低一点看看呢。
是这个地方吗:
可以试下,能不能换个方法加个关键字阻值编译器优化,buf16加个volatile修饰?
此帖出自stm32/stm8论坛

点评

优化等级是在这里改;volatile你也可以试试看。  详情 回复 发表于 2018-8-16 18:03
 
个人签名模电临时工
 

回复

750

帖子

3

TA的资源

版主

4
 
低8位被右移了
此帖出自stm32/stm8论坛

点评

低8位是秒,我这个函数里面不需要显示秒  详情 回复 发表于 2018-8-16 18:20
 
个人签名

要666

 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

5
 
shipeng 发表于 2018-8-16 17:18
是这个地方吗:
可以试下,能不能换个方法加个关键字阻值编译器优化,buf16加个volatile修饰?

优化等级是在这里改;volatile你也可以试试看。
此帖出自stm32/stm8论坛
 
 
 

回复

327

帖子

1

TA的资源

纯净的硅(初级)

6
 

低8位是秒,我这个函数里面不需要显示秒
此帖出自stm32/stm8论坛
 
个人签名模电临时工
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

7
 
好帖子。赞!赞!赞!赞!赞!赞!赞!赞!赞!赞!
此帖出自stm32/stm8论坛
 
 
 

回复

327

帖子

1

TA的资源

纯净的硅(初级)

8
 

我的单片机会偷懒

本帖最后由 shipeng 于 2018-8-18 09:46 编辑

加了volatile问题还是没有解决(对于临时变量默认都是volatile,没有必要加),不到万不得已不想修改优化等级,关键貌似和优化等级没有关联,因为在“u16 buf16=CUS_RTCTimeGet()>>8;”行设置断点后就能正常刷新时间,未设置该行断点时查看buf16值发现为上次函数调用值。
貌似非要在关键位置设置断点监视单片机运行才能正常刷新时间,全速运行后他就会偷懒跳过“u16 buf16=CUS_RTCTimeGet()>>8;”行运行,真是个贱骨头
此帖出自stm32/stm8论坛
 
个人签名模电临时工
 
 

回复

327

帖子

1

TA的资源

纯净的硅(初级)

9
 
又发现一个神奇的地方:仿真的时候只要打开RTC状态监视:Peripherals→System Viewer→RTC就又可以正常刷新时间了,我似乎想到了有个叫镜像寄存器的东东可能和这个有关,看下资料先
此帖出自stm32/stm8论坛
 
个人签名模电临时工
 
 

回复

327

帖子

1

TA的资源

纯净的硅(初级)

10
 
问题解决了应该是HAL库本身有问题,具体原因就不深究了,总之将“u16 buf16=CUS_RTCTimeGet()>>8;”改为“u16 buf16=RTC->TR>>8;”完美解决
此帖出自stm32/stm8论坛
 
个人签名模电临时工
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表