华大单片机 设计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后不能立即停止休眠,需要继续执行一段时间指令才会进入休眠。
哈哈,楼主要淡定。 不发代码出来没法分析 wubangmi 发表于 2021-10-14 09:25
不发代码出来没法分析
过程已经说的很清楚了,有兴趣可以亲自测试一下吗。 就算是同样的描述,代码怎么写,在哪执行,效果差别很大。
楼主还是发代码吧,看看到底是芯片bug,还是楼主bug…… 有问题先找自身原因 支持 优秀 哈哈,谢谢楼主分享避坑经验。 测试结果:设置完 SLEEPONEXIT后不能立即停止休眠,需要继续执行一段时间指令才会进入休眠。--- 这句话不正确。
从硬件设计来说,进入deepsleep命令之后,有一个cycle进行电源的管理处理之后,进入deepsleep。
检查一下软件配置,推荐进入deep sleep之后,加一个NOP指令。
__WFI();
__NOP();
不把程序贴出来,重现问题现象,神仙都不没法帮你解决问题。 #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++;
}
}
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+内核的手册
martinhu 发表于 2021-10-22 09:38
你是不是对用户手册的DeepSleep的内容没看懂???
首先设置SCB->SCR寄存器,并不能立即让MCU进入DeepSl ...
问题是我没有中断,只是延时一段时间就进入了低功耗,怎么解释 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 哈哈,欢迎分享避坑指南。 这个过程,总觉得少点什么 wubangmi 发表于 2021-10-29 13:52
#define InitDeepSleep {SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;}//设置睡眠模式为深度睡眠
#define DeepSle ...
你用了__WFI();当然没有问题 像这种单品机要不把手册写详细点,学着STM32 ,要不把例程写充分点,要不让人 不是到处踩坑吗? 国产的芯片还有很多待完善啊 chunxulele 发表于 2021-11-6 13:31
你用了__WFI();当然没有问题
你看手册了吗?
手册就是要求用__WFI()指令!!!
martinhu 发表于 2021-11-8 11:09
你看手册了吗?
手册就是要求用__WFI()指令!!!
有些人抄作业都抄不好,还说别人做的作业有问题,说不动啊
页:
[1]
2