STM32L4 HAL库中例程POR_STOP2_RTC中的一点疑问
最近项目需要使用低功耗处理器,我选择了STM32L4,原来并没有接触过STML系列的处理器,选择STM的原因是:原来用过STM32103系列的处理器,对处理器的外设相对熟悉一点。由于项目要求紧迫,就直接买了NUCLEO-L452RE的开发板试验,由于项目使用外设不多,想着直接在例程上做下试验,然后把程序组合一下就可以了。在使用低功耗功能的时候出了个问题,调试了好久。
在使用hal库中的例程PWR_STOP2_RTC时出现问题,
根据例程中的介绍应该是处理器在启动后初始化时钟至80M,然后使用LSI初始化实时时钟,启动实时时钟的wakeup功能。闪烁led五秒后,使系统进入STOP2状态。在wakeup时间(根据程序的意思应该是33s左右)到了后,唤醒处理器;闪烁led五秒,再次进入stop2,无线循环。
可是在下载后发现,处理器在LED第一次闪烁后进入休眠后,led不再闪烁了。
开始以为是在进入是stop2模式时设置除了问题,进入调试后对着寄存器查了半天,又和其他stop的例程对比了一下,没发现社么问题。后来以为是进入stop2后出现问题,由于在进入stop模式后不能再调试,只能凭空猜测问题在哪。
我推断是处理器没有成功进入stop2模式,可能出现了错误导致处理器一直在一个错误处理函数总跳不出来。可是在测试电流后发现程序已经成功进入休眠。
datasheet上说的是stop下的电流时1.4ua,但我这测的是2.5ua。
继续测量,在进入stop2过了33s左右电流突然增加到150ua左右。说明处理器已经成功进入stop2,,是唤醒除了问题。我不断的翻datasheet ,在程序中找原因。花了好几天时间也没发现问题。我对这个处理器实在不熟悉,都是现学现卖的,datasheet看的都是一知半解。
后来实在没办法我又下了一个版本的hal库
即1.9.0版本的hal库,把这个例程下进入即可以运行,达到了预期的效果。
那肯定是程序上出啦问题,我就用compare比较一下,一比较发现程序改动非常大,
里面看了半天头晕,也发现不了问题。
只好对着两个版本的程序,按照启动运行的顺序,一个函数一个函数的对比。最终在stm32l4xx_hal_rtc_ex.c下发现问题。
DEL是我注释的语句
ADD是我增加语句
在1.13.0例程中只是把event开了,并没有把中断打开,而这个程序是靠中断唤醒的,因此一直没有被唤醒。程序改了完后,下载,成功。
这应该是算HAL库中的BUG了吧,各位怎么看。
注:个人理解wakeup功能一般可使用在定时启动时间小于30秒左右的间隔,更大的间隔可使用alarm功能。虽然看datasheet上也说了wakeup可定时36小时,但是在hal库上好像不支持,设置起来比较麻烦。