chunxulele 发表于 2021-10-13 22:37

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

测试条件:单片机是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后不能立即停止休眠,需要继续执行一段时间指令才会进入休眠。
               
               

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的内容没看懂???

首先设置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+内核的手册


chunxulele 发表于 2021-10-28 15:38

martinhu 发表于 2021-10-22 09:38
你是不是对用户手册的DeepSleep的内容没看懂???

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

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

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

哈哈,欢迎分享避坑指南。

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()指令!!!


wubangmi 发表于 2021-11-8 14:14

martinhu 发表于 2021-11-8 11:09
你看手册了吗?
手册就是要求用__WFI()指令!!!

有些人抄作业都抄不好,还说别人做的作业有问题,说不动啊
页: [1] 2
查看完整版本: 华大单片机 设计bug 巨坑 低功耗的 坑