STM32会偷懒的BUG

2019-03-23 15:35发布

本帖最后由 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;
}


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
D6_204
1楼-- · 2019-03-23 19:09
/ 把编译器的优化等级调低一点看看呢。
shipeng
2楼-- · 2019-03-23 23:16
 精彩回答 2  元偷偷看……
le062
3楼-- · 2019-03-24 02:30
低8位被右移了
D6_204
4楼-- · 2019-03-24 08:28
shipeng 发表于 2018-8-16 17:18
是这个地方吗:
可以试下,能不能换个方法加个关键字阻值编译器优化,buf16加个volatile修饰?

优化等级是在这里改;volatile你也可以试试看。
shipeng
5楼-- · 2019-03-24 13:27
 精彩回答 2  元偷偷看……
wl4117
6楼-- · 2019-03-24 14:53
好帖子。赞!赞!赞!赞!赞!赞!赞!赞!赞!赞!

一周热门 更多>