打印
[技术问答]

华大单片机 设计bug 巨坑 低功耗的 坑

[复制链接]
8314|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
测试条件:单片机是HC32L136系列  显示是通过单片机上的LCD模块。
测试过程: 1、设置SLEEPDEEP=1 //模式设为深度睡眠
                 2、显示数字1234;
                 3、设置 SLEEPONEXIT=1 //设为1时,当退出异常处理并返回程序线程时,处理器自动进入休眠模式(WFI)
                 4、显示数值4321;
                 5、进入主循环 不停的显示5225;
  测试结果:LCD显示225;
                 如果不执行第三步 ,则可以正常显示5225;
                 按理说执行完第3步后就可以进入深度睡眠了,就只会显示1234,
                如果在第3和第4步之间插入延时,并不断调整延时时间,当延时时间较短的时候可以显示4321,当延时时间增大后,可以显示1234。
测试结果:设置完 SLEEPONEXIT后不能立即停止休眠,需要继续执行一段时间指令才会进入休眠。
                 
               

使用特权

评论回复
评论
chunxulele 2021-10-21 22:31 回复TA
@martinhu :源码贴在下面,你可以试试 
chunxulele 2021-10-21 07:54 回复TA
@martinhu :好的,等晚上回家贴出来 
martinhu 2021-10-18 19:14 回复TA
@chunxulele :发这里把,让大家也一起看看 
chunxulele 2021-10-18 10:12 回复TA
@martinhu :你如果感兴趣我可以把代码单独发给你测试,你也完全可以按照我上面的流程进行测试 
martinhu 2021-10-15 11:32 回复TA
劝楼主再好好看看低功耗功能,L136都出货过亿了,不会有这个bug等你发现。还是要提高自己的理解能力。 
沙发
yangxiaor520| | 2021-10-14 07:34 | 只看该作者
哈哈,楼主要淡定。

使用特权

评论回复
板凳
wubangmi| | 2021-10-14 09:25 | 只看该作者
不发代码出来没法分析

使用特权

评论回复
地板
chunxulele|  楼主 | 2021-10-14 11:19 | 只看该作者
wubangmi 发表于 2021-10-14 09:25
不发代码出来没法分析

过程已经说的很清楚了,有兴趣可以亲自测试一下吗。

使用特权

评论回复
5
martinhu| | 2021-10-14 11:28 | 只看该作者
就算是同样的描述,代码怎么写,在哪执行,效果差别很大。
楼主还是发代码吧,看看到底是芯片bug,还是楼主bug……

使用特权

评论回复
6
lyjian| | 2021-10-14 12:47 | 只看该作者
有问题先找自身原因

使用特权

评论回复
7
smilefenfen| | 2021-10-14 13:56 | 只看该作者
支持 优秀

使用特权

评论回复
8
huquanz711| | 2021-10-15 08:07 | 只看该作者
哈哈,谢谢楼主分享避坑经验。

使用特权

评论回复
9
liaotian001| | 2021-10-15 08:18 | 只看该作者
测试结果:设置完 SLEEPONEXIT后不能立即停止休眠,需要继续执行一段时间指令才会进入休眠。--- 这句话不正确。
从硬件设计来说,进入deepsleep命令之后,有一个cycle进行电源的管理处理之后,进入deepsleep。
检查一下软件配置,推荐进入deep sleep之后,加一个NOP指令。
__WFI();
__NOP();
不把程序贴出来,重现问题现象,神仙都不没法帮你解决问题。

使用特权

评论回复
10
chunxulele|  楼主 | 2021-10-21 22:30 | 只看该作者
#define InitDeepSleep {SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;}//设置睡眠模式为深度睡眠
#define DeepSleep     {SCB->SCR |= 0x00000002;}//开始睡眠 只要在主线程就睡眠 设置完 SLEEPONEXIT后不能立即停止休眠需要等待一会才停止指令的执行。delay1ms(299);
#define WakeUp        {SCB->SCR &= 0xfffffffd;}//关闭睡眠


s32 main(void)
{

        App_SysClkInit();
        LCD_GPIO_Init();                                                                                                                                                                //LCD
        LCD_Configure();                                                                                                                                                                //LCD
        Lcd_ClearDisp();                                                                                                                                                                //LCD清屏

        InitDeepSleep;
        App_Dis_Mdata(1234,4);       
        DeepSleep;
        delay1ms(299);
        App_Dis_Mdata(4231,4);       
               
  while(1)
         {
            SysState.temp++;

   
        }
}


使用特权

评论回复
11
martinhu| | 2021-10-22 09:38 | 只看该作者
chunxulele 发表于 2021-10-21 22:30
#define InitDeepSleep {SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;}//设置睡眠模式为深度睡眠
#define DeepSleep ...

你是不是对用户手册的DeepSleep的内容没看懂???

首先设置SCB->SCR寄存器,并不能立即让MCU进入DeepSleep,
如果仅仅设置了SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk,那么还需要执行_WFI();命令才能让MCU立即进入DeepSleep。
而你仅仅是接下来设置了这个SLEEPONEXIT:SCB->SCR |= 0x00000002;
这个的意思是要等MCU执行完所有的中断,退出中断的时候自动进入DeepSleep。所以你觉得是隔了一段时间才进入Deep Sleep。
上面两行其实都是超低功耗功能的设置,假如你设置完上面两行之后,再立即执行_WFI();也能立即进入Deep Sleep
这些在驱动库样例里面都有啊!!!!!!!!!!!!!!比如:hc32l13x_ddl_Rev1.9.2 Lite\example\gpio\gpio_deepsleep_wakeup


如果楼主对低功耗模式不是很清楚,建议看M0+内核的手册


使用特权

评论回复
12
chunxulele|  楼主 | 2021-10-28 15:38 | 只看该作者
martinhu 发表于 2021-10-22 09:38
你是不是对用户手册的DeepSleep的内容没看懂???

首先设置SCB->SCR寄存器,并不能立即让MCU进入DeepSl ...

问题是我没有中断,只是延时一段时间就进入了低功耗,怎么解释

使用特权

评论回复
评论
martinhu 2021-11-2 19:09 回复TA
呵呵 
13
wubangmi| | 2021-10-29 13:52 | 只看该作者
chunxulele 发表于 2021-10-28 15:38
问题是我没有中断,只是延时一段时间就进入了低功耗,怎么解释

#define InitDeepSleep {SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;}//设置睡眠模式为深度睡眠
#define DeepSleep     {SCB->SCR |= 0x00000002;}//开始睡眠 只要在主线程就睡眠 设置完 SLEEPONEXIT后不能立即停止休眠需要等待一会才停止指令的执行。delay1ms(299);
#define WakeUp        {SCB->SCR &= 0xfffffffd;}//关闭睡眠

s32 main(void)
{

        App_SysClkInit();
        LCD_GPIO_Init();                                                                                                                                                                //LCD
        LCD_Configure();                                                                                                                                                                //LCD
        Lcd_ClearDisp();                                                                                                                                                                //LCD清屏

        InitDeepSleep;
        App_Dis_Mdata(1234,4);        
        DeepSleep;
        __WFI();
        delay1ms(299);
        App_Dis_Mdata(4231,4);        
               
  while(1)
         {
            SysState.temp++;
        }
}


试试上面这个代码?我稍微给你改了一点点,看看还能不能显示4321

使用特权

评论回复
14
chenjun89| | 2021-11-2 19:34 | 只看该作者
哈哈,欢迎分享避坑指南。

使用特权

评论回复
评论
martinhu 2021-11-8 11:11 回复TA
@chunxulele :哪里按照手册操作了,麻烦花点时间好好读读,不要在这花时间无谓争吵。 
chunxulele 2021-11-6 13:32 回复TA
@martinhu :哪里错误操作了,完全按照华大的手册操作的,要怪只能是怪手册写的太垃圾 
martinhu 2021-11-4 09:12 回复TA
楼主的错误操作也算是坑?最多算是自己给自己挖的坑 
15
littlelida| | 2021-11-3 17:14 | 只看该作者
这个过程,总觉得少点什么

使用特权

评论回复
16
chunxulele|  楼主 | 2021-11-6 13:31 | 只看该作者
wubangmi 发表于 2021-10-29 13:52
#define InitDeepSleep {SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;}//设置睡眠模式为深度睡眠
#define DeepSle ...

你用了__WFI();当然没有问题

使用特权

评论回复
17
chunxulele|  楼主 | 2021-11-6 14:48 | 只看该作者
像这种单品机要不把手册写详细点,学着STM32   ,要不把例程写充分点,要不让人 不是到处踩坑吗?

使用特权

评论回复
18
huquanz711| | 2021-11-7 19:03 | 只看该作者
国产的芯片还有很多待完善啊

使用特权

评论回复
19
martinhu| | 2021-11-8 11:09 | 只看该作者
chunxulele 发表于 2021-11-6 13:31
你用了__WFI();当然没有问题


你看手册了吗?
手册就是要求用__WFI()指令!!!


使用特权

评论回复
20
wubangmi| | 2021-11-8 14:14 | 只看该作者
martinhu 发表于 2021-11-8 11:09
你看手册了吗?
手册就是要求用__WFI()指令!!!

有些人抄作业都抄不好,还说别人做的作业有问题,说不动啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

49

帖子

1

粉丝