[技术问答] 华大单片机 设计bug 巨坑 低功耗的 坑

[复制链接]
 楼主| chunxulele 发表于 2021-10-13 22:37 | 显示全部楼层 |阅读模式
测试条件:单片机是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后不能立即停止休眠,需要继续执行一段时间指令才会进入休眠。
                 
               

评论

[url=home.php?mod=space&uid=2806704]@martinhu[/url] :源码贴在下面,你可以试试  发表于 2021-10-21 22:31
[url=home.php?mod=space&uid=2806704]@martinhu[/url] :好的,等晚上回家贴出来  发表于 2021-10-21 07:54
[url=home.php?mod=space&uid=1371586]@chunxulele[/url] :发这里把,让大家也一起看看  发表于 2021-10-18 19:14
[url=home.php?mod=space&uid=2806704]@martinhu[/url] :你如果感兴趣我可以把代码单独发给你测试,你也完全可以按照我上面的流程进行测试  发表于 2021-10-18 10:12
劝楼主再好好看看低功耗功能,L136都出货过亿了,不会有这个bug等你发现。还是要提高自己的理解能力。  发表于 2021-10-15 11:32
yangxiaor520 发表于 2021-10-14 07:34 来自手机 | 显示全部楼层
哈哈,楼主要淡定。
wubangmi 发表于 2021-10-14 09:25 | 显示全部楼层
不发代码出来没法分析
 楼主| chunxulele 发表于 2021-10-14 11:19 | 显示全部楼层
wubangmi 发表于 2021-10-14 09:25
不发代码出来没法分析

过程已经说的很清楚了,有兴趣可以亲自测试一下吗。
martinhu 发表于 2021-10-14 11:28 | 显示全部楼层
就算是同样的描述,代码怎么写,在哪执行,效果差别很大。
楼主还是发代码吧,看看到底是芯片bug,还是楼主bug……
lyjian 发表于 2021-10-14 12:47 | 显示全部楼层
有问题先找自身原因
smilefenfen 发表于 2021-10-14 13:56 | 显示全部楼层
支持 优秀
huquanz711 发表于 2021-10-15 08:07 来自手机 | 显示全部楼层
哈哈,谢谢楼主分享避坑经验。
liaotian001 发表于 2021-10-15 08:18 | 显示全部楼层
测试结果:设置完 SLEEPONEXIT后不能立即停止休眠,需要继续执行一段时间指令才会进入休眠。--- 这句话不正确。
从硬件设计来说,进入deepsleep命令之后,有一个cycle进行电源的管理处理之后,进入deepsleep。
检查一下软件配置,推荐进入deep sleep之后,加一个NOP指令。
__WFI();
__NOP();
不把程序贴出来,重现问题现象,神仙都不没法帮你解决问题。
 楼主| 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++;

   
        }
}


martinhu 发表于 2021-10-22 09:38 | 显示全部楼层
chunxulele 发表于 2021-10-21 22:30
#define InitDeepSleep {SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;}//设置睡眠模式为深度睡眠
#define DeepSleep ...

你是不是对用户手册的DeepSleep的内容没看懂???
6535617213ad0af40.png
首先设置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+内核的手册

8602617215f3cd7e3.png
 楼主| chunxulele 发表于 2021-10-28 15:38 | 显示全部楼层
martinhu 发表于 2021-10-22 09:38
你是不是对用户手册的DeepSleep的内容没看懂???

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

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

评论

呵呵  发表于 2021-11-2 19:09
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
chenjun89 发表于 2021-11-2 19:34 来自手机 | 显示全部楼层
哈哈,欢迎分享避坑指南。

评论

[url=home.php?mod=space&uid=1371586]@chunxulele[/url] :哪里按照手册操作了,麻烦花点时间好好读读,不要在这花时间无谓争吵。  发表于 2021-11-8 11:11
[url=home.php?mod=space&uid=2806704]@martinhu[/url] :哪里错误操作了,完全按照华大的手册操作的,要怪只能是怪手册写的太垃圾  发表于 2021-11-6 13:32
楼主的错误操作也算是坑?最多算是自己给自己挖的坑  发表于 2021-11-4 09:12
littlelida 发表于 2021-11-3 17:14 | 显示全部楼层
这个过程,总觉得少点什么
 楼主| chunxulele 发表于 2021-11-6 13:31 | 显示全部楼层
wubangmi 发表于 2021-10-29 13:52
#define InitDeepSleep {SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;}//设置睡眠模式为深度睡眠
#define DeepSle ...

你用了__WFI();当然没有问题
 楼主| chunxulele 发表于 2021-11-6 14:48 | 显示全部楼层
像这种单品机要不把手册写详细点,学着STM32   ,要不把例程写充分点,要不让人 不是到处踩坑吗?
huquanz711 发表于 2021-11-7 19:03 来自手机 | 显示全部楼层
国产的芯片还有很多待完善啊
martinhu 发表于 2021-11-8 11:09 | 显示全部楼层
chunxulele 发表于 2021-11-6 13:31
你用了__WFI();当然没有问题


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

wubangmi 发表于 2021-11-8 14:14 | 显示全部楼层
martinhu 发表于 2021-11-8 11:09
你看手册了吗?
手册就是要求用__WFI()指令!!!

有些人抄作业都抄不好,还说别人做的作业有问题,说不动啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

49

帖子

1

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