历史上的今天
今天是:2024年09月10日(星期二)
2018年09月10日 | STM32L031低功耗深度睡眠RTC唤醒注意事项
2018-09-10 来源:eefocus
0. 第一可以进入休眠,第二次无法进入休眠,折腾了好久。后来想想应该是进入休眠后立刻被唤醒了,应该是上次的唤醒中断没清除。在启动唤醒前加入以下语句,问题解决。
__HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); //清除标志,否则第二次以后无法进入休眠
// HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0xB4D8, RTC_WAKEUPCLOCK_RTCCLK_DIV16); //20s
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0xffff, RTC_WAKEUPCLOCK_RTCCLK_DIV16); //28s
1. 发现进入睡眠后,电流1.2uA,满足要求。结果唤醒后,第二次进入睡眠后,电流跳到了19uA,且一直保持下去。结果看了https://blog.csdn.net/zzw3255/article/details/54342878的介绍,把串口干掉了,电流下降到了2.6uA。
2. 去掉了串口,第一次进入睡眠1.2uA,第二次进入睡眠2.6uA。又陷入了僵局,没开串口、没开GPIO,啥事都没干,怎么回事?谁能帮忙解决下?
网上搜索了一下资料,遇到和我这样的情况的人还真不少。例如:
https://blog.csdn.net/zhufeng88/article/details/66968101#commentsedit
说是清除唤醒标志就好了,明天按照这个思路,改代码试试看。(但是本文第0点,不是已经清除了吗?该文指的的标志是哪个标志?)
相关文章:
https://blog.csdn.net/flydream0/article/details/52511311《STM32L152的低功耗测试》
3. 按照昨天的思路,清除唤醒标志
/* Clear all related wakeup flags */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
但是问题依旧,第一次进入睡眠1.2uA,第二次进入睡眠2.6uA。抓狂中。
看了文档,多于的1.4uA可能来源于IVREFINT,如下图所示:
但是我的程序已经将VREFINT关闭了,调试后也看到标志位已经确认关闭了,但是还是有2.6uA的电流。
/* Enable Ultra low power mode */
HAL_PWREx_EnableUltraLowPower();
/* Enable Fast WakeUP */
HAL_PWREx_EnableFastWakeUp();
到这里真的就没招了,重新理了下思路,看了代码,发现自己代码改得太乱了,之前的中断标志清除的语句在调试过程中注释掉了,重新加回来。问题解决。
4. 附上源码
void enter_stop_rtc(unsigned stoptime)
{
/* Enable Ultra low power mode */
HAL_PWREx_EnableUltraLowPower(); //必须要加,否则多出1.4uA的电流
/* Enable Fast WakeUP */
HAL_PWREx_EnableFastWakeUp();
/* Disable Wakeup Counter */
HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
/*To configure the wake up timer to 4s the WakeUpCounter is set to 0x242B:
RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16
Wakeup Time Base = 16 /(~37KHz) = ~0,432 ms
Wakeup Time = ~5s = 0,432ms * WakeUpCounter
==> WakeUpCounter = ~5s/0,432ms = 11562 */
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, stoptime*2396, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
system_power_config();
/* Enter Stop Mode */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
/* Clear all related wakeup flags */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); //必须要加,否则多出1.4uA的电流
__HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); //清除标志,否则第二次以后无法进入休眠
SystemClock_Config();
}
5. 最终,待机电流定格在1.2uA,满足项目需求。
6. 关于lpuart休眠后异常的问题。因为每次休眠后,都要重新初始化串口。但是发现使用hal库初始化的时候并没有成功,因为里面有个标志,初始化后就不再允许再次初始化了,所以,每次初始化时,需重置标志并位。
/* LPUART1 init function */
static void MX_LPUART1_UART_Init(void)
{
hlpuart1.Instance = LPUART1;
hlpuart1.Init.BaudRate = 115200;
hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
hlpuart1.Init.StopBits = UART_STOPBITS_1;
hlpuart1.Init.Parity = UART_PARITY_NONE;
hlpuart1.Init.Mode = UART_MODE_TX_RX;
hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
hlpuart1.gState = HAL_UART_STATE_RESET; //休眠后初始化要重置该标志位
if (HAL_UART_Init(&hlpuart1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
史海拾趣
|
第一章简略地讨论数字信号处理的基本思想及其优越性。 第二章介绍世界各大公司DSP处理器的最新发展,以及系统设计工程师们最为关心的如何评价和选择DSP处理器的问题。 第三章比较系统地介绍目前在国内外应用最广泛的TI的TMS320C2000、C5000和C600 ...… 查看全部问答> |
|
I do driver on mobile for 3 years,I worked hard always, I believe in my skills,I always say there is nothing I can not do!I can do all kinds of drivers,I can do framwork,filesystem,gdi,protocol,I can solve out any bug in 2 hour ...… 查看全部问答> |
|
如题:在wince6下打开网页的时候,如果网页上有可输入的框,则系统会自动弹出一个输入面板(软键盘)。 我不想让这个东西弹出来(有自己的界面逻辑和输入控制),需要如何修改?谢谢!… 查看全部问答> |
|
一个320*240的点阵液晶,二手拆机,虽说可能有些划痕,不过价格实在是太超值了, http://item.taobao.com/item.htm?id=6948951424 大家感觉怎么样呢? :D … 查看全部问答> |
|
我是初学者,一边看数据手册一边写程序,之前用BCS 定时器都好好的,现在用到串口了,结果出问题了。。。。主程序中初始化基本时钟系统,初始化串口,初始化P3端口,进入while(1)循环,循环中用查询方式,把板子接收到的字符再发送给超级终端 ...… 查看全部问答> |
|
FPGA+MCU是一中非常流行的架构,MCU的并行总线在和FPGA通讯的时候一般都是异步的。 常见的MCU有单片机、ARM以及DSP等等,所谓的并行接口比如TI的TMS320C5410的HPI口。在FPGA加MCU的架构里往往存 ...… 查看全部问答> |
|
看了Freescale的有关Bootloader文档,AN2295,有些疑问 1,第31页有管ICF文件这么一段描述: 编辑后ROM开始地址为0x4000,Code Start地址为什么只增加了0x3FF0?(0x4400 - 0x410),而不是增加0x4000呢?2.我现在使用的是MKL46系列CortexM0+ M ...… 查看全部问答> |




