你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-U083RC评测】⑤低功耗定时器LPTIM

[复制链接]
小萝卜啦啦啦 发布时间:2024-5-23 01:10
STM32U0带低功耗定时器,这个定时器可以在休眠状态下保持运行,但是功耗不会很大,对于有些低功耗应用有很大的帮助,今天就来测试一下LPTIM
首先声明一下,由于是第一次接触LPTIM,并且在网上没有找到比较合适的学习资料,本文主要还是经验分享,其中很多内容为自行摸索,可能存在讲解不清或者理解错的情况,欢迎各位大佬批评指正
工程还是用之前的做的模板工程
今天的测试分为3个部分。
Part1:把LPTIM配置好,让他以自动重装载的方式,通过中断触发定时翻转LED4,然后通过逻辑分析抓一下波形,看看和我定的时间是否对上
Part2:如何让LPTIM停下来
Part3:低功耗开启来,进入STOP模式,测试能否被LPTIM唤醒,并测试STOP2模式下的功耗
Part1
1.1、CUBE配置
开启一个LPTIM,我这边就直接选择LPTIME1,模式选择Counts internal clock events
1.png , N2 Q& v) L# F- o
对应的参数配置如下
5.png
- F( H1 L  C. l/ o
第一个参数是时钟分频系数,也就是我们学习普通TIM的PSC,有1/2/4/8/16/32/64/128分频这么几种可选。我就直接选默认的1分频
第二个参数是自动重装载值,也就是以前我们学习普通tim的ARR。我们这边先写上32000-1。这个值的含义待会我们再讲
第三个参数翻译过来是重复计数,我看网上有文章说这个参数可以让定时器多跑几轮,到达重复的次数后再触发中断,但是我尝试改这个参数,没啥效果,很奇怪,没办法只能保持默认。
* k4 Z6 j; B* o
第四个参数是更新模式,分为Update Immediate(立即更新)和Update End Of Period(周期结束后更新)。他用于在什么时候去更新自动重装寄存器和比较寄存器。但是在我现在做的这个应用中,这个玩意儿选啥都能让业务跑起来,我也没搞明白他是在什么场景下才有用,有可能是要停止之前的一次timer,重新起timer,新的参数设置下去在何时生效?,我就先保持默认吧
第五个参数是触发源,我就选择默认的软件触发
然后开启中断
9 S  n4 g" X2 Z2 n
4.png 0 _, [; Z2 c5 P3 n
LPTIM1的时钟选择LSI
2.png
: Y) X7 q: O9 }6 ]
然后生成代码
3.png
8 F# O* {; Y5 R3 {$ S
Cube的配置到此就完成了。在开始写代码前需要补充一下LPTIM定的时间的计算,他的公式和以前我们学的普通TIM还不一样。ST  LPTIM_Timeout这个demoreadme文档中的公式如下:Timeout = (Compare + 1) / LPTIM_Clock
6.png
% L) y6 @! }* }
但是这个公式我感觉还缺点东西,就是我们刚才配置的分频系数,我按照经验修改了一下

- |0 _& o" N% Y# I& X
超时时间(S= (Period + 1)/(CUBEMX中时钟配置界面给到LPTIMxCLK频率/分频系数)
带入到我们刚才配置的参数
((32000 - 1)+ 1)/(0.032M/1) = 1S
那么待会儿timer运行起来后就应该是会1SLED灯翻转一次
! K# S" D6 u9 \; [, j
1.2 修改代码
调用HAL_LPTIM_TimeOut_Start_IT函数就可以开始timeout模式的LPTIM,等超时后,会触发中断
在while1前就调用这个函数启动lptim
这里入参我想说一下我的经验,第二个入参为timeout,但是我看ST的demo这个参数的实际含义就是period,但是这个参数我修改貌似没有用,修改这个参数并不会改变每次定时的时间,我感觉他自动重装载还是按照cube配置的(也就是在init时设置的period)在运行,很奇怪
  1.   /* 启动LPTIM */
    0 z+ W& w8 {! n0 {
  2.   if (HAL_LPTIM_TimeOut_Start_IT(&hlptim1, (32000 - 1)) != HAL_OK)  b! ]1 @3 [% ]* w0 o8 m
  3.   {! o# G1 i% Q; n
  4.     Error_Handler();
    7 |! V* ?1 x0 I, H+ ~
  5.   }
    ' D9 A' k1 C$ ?1 ]+ f
  6.   printf("start LPTIM\r\n");
    ; O2 E! I4 ~0 u: \2 P
复制代码
7.png
$ W# a7 N' o& ~) q! q% l
然后我们来实现一下对应的定时器超时触发的中断的回调函数,和之前的其他HAL库函数一样,HAL库已经配置好了虚函数,我们只需要关注把这个虚函数实现即可,关于中断如何触发,对应变量清除等HAL库会完成
  1. void HAL_LPTIM_CompareMatchCallback(LPTIM_HandleTypeDef *hlptim)0 }; e" E& R1 O  N) ~0 l6 p- I
  2. {
    5 A1 p6 i6 _" [, V. n. V1 A# l
  3.   BSP_LED_Toggle(LED_GREEN);$ z8 s/ P0 F& E0 ?
  4. }
复制代码
8.png 6 c/ O/ w8 s1 d1 S! n- ?! N2 B
编译,下载代码,效果如下
IMG_6059 00_00_00-00_00_30.gif 2 c1 j! _: B  ?7 |% e/ _  V- I/ ]8 ^
LED灯看上去以1s一次的频率翻转,那么到底是不是1s呢?上逻辑分析仪看看
首先需要看一下原理图,找一下控制LED灯的GPIO是那个,有咩有引出到座子/排针上
9.png : m/ G9 l. J7 E$ W
可以看到LED是由PA5这个GPIO控制的,我可以在arduino母座的D13上测量到这个信号
再去cube中确认一下,是不是PA5
10.png , y2 e6 @6 c' \! x0 e. ?
好了,连接一下逻辑分析仪
IMG_6060.JPG 0 L4 F1 d. E! ^+ M) _% T' T( K
测量结果:
11.png   l! z9 e2 g3 d; m) ]0 @/ L
测量到的是0.97s,和我预设的1s差了30ms。我不确定是那边出了问题,照道理timer不应该差这么多。
我怀疑出问题的点:
1.内部的LSI产生的32K不准,毕竟他是一个RC,精准度可能不够
2.HAL库处理耗时
3.我设置的参数不合适
0 q. D% Y; X) H, K
Part2
上一个部分是会自动重装载,这个timer会一直跑,那我如果只想让他跑一次就不再跑呢?
普通的tim我记得是可以在初始化时配置要不要自动重装载,不要的话就只运行一次,但是在这里我没找到这个参数。
但是我找到了HAL库中有其他的函数,貌似可以实现类似的功能,但是看入参,要给一个channel,感觉他貌似是用timer定时控制GPIO的电平,好像也用不上
12.png
4 h1 w1 b  S7 e7 E. o1 Q
最后我想到了一个歪办法,但是不确定是不是这么用的,不过效果是可以达到的,就是在超时的中断回调函数中调用HAL_LPTIM_TimeOut_Stop_IT函数

! G: Y! F/ z4 _/ {4 H4 i
为了测试这个方法的可用性,我再次修改代码,在按钮按下后启动一次timer,然后在timer的中断回调函数中stop。理论上按下按钮,1S后LED灯会翻转

* B4 o- _( d2 N4 I
修改后的中断回调函数
  1. void HAL_LPTIM_CompareMatchCallback(LPTIM_HandleTypeDef *hlptim)2 c2 }5 p2 x: f( o4 ^
  2. {
    / \) c8 ^: @$ t7 G0 v1 r8 G1 j
  3.   BSP_LED_Toggle(LED_GREEN);
复制代码
13.png - G: M( l9 t3 E- m$ U
这里HAL_LPTIM_TimeOut_Stop_IT的入参我直接把回调函数带进来的给过去了,因为我现在只启动了一个lptim,如果你有多个的话,就要填想停的那个timer
- d" e9 {# k! u4 X7 ^( m/ c' {
然后开启按键测试代码的宏定义
14.png
! K9 I3 K6 w2 o  T1 ^2 d
修改按键测试的代码
  1. #if BUTTON_TEST
    - Q' D; N  @/ P4 X/ F; p) N, _3 I
  2.     /* BUTTON BSP测试 */; x$ B, D1 S# T. o0 B
  3.     if (UserButtonState == BUTTON_PRESSED)# z+ K" P0 e# r6 ]* l6 X
  4.     {
    3 x/ B+ K* O6 C4 {
  5.       UserButtonState = BUTTON_RELEASED;
    7 L9 Q3 z6 c3 d& ~7 Q+ f) D
  6.       if (HAL_LPTIM_TimeOut_Start_IT(&hlptim1, (32000 - 1)) != HAL_OK)
    + t7 o8 {; s+ j# J, P; [) I
  7.       {$ v4 N5 R- ]& u. `8 ~! i9 g- r( N2 ?; m
  8.         Error_Handler();& J& z- J7 C1 e% @
  9.       }
    ! N/ w! {, E. e9 `
  10.     }
    0 k3 q9 \, u; |6 \6 k7 \
  11. #endif
    1 l8 u* z( H9 i0 x2 l
复制代码
15.png
* Z  j* V% G7 q6 T# I( i8 }8 }
效果如下(视频转成gif后貌似变得卡卡的,感觉被慢放了,我实际体验应该是1S左右的)
IMG_6063 00_00_00-00_00_30.gif
9 v, r8 L3 G+ h1 w& s9 n3 N

$ U4 D6 s# k4 {* |9 }
Part3
这个测试场景我就不再需要timer跑一下就停了,所以把button测试的宏定义关掉(我就不贴图了)

* F, P$ }2 y. P% A" m2 ]- k3 H
先测试一下,没有进STOP的电流,我使用的是nordic的ppk,之前用万用表测试感觉测试uA级别的电流精度还是不太准
接线如下(VIN和VOUT不要接反了,反了能通电,但是没有电流数据)
IMG_6064.JPG ! X1 p2 ?- F% u& y1 i9 O
测量结果如下,平均电流1.62ma
16.png 6 Y& E% S8 [5 C, n7 k* {
然后我们把STOP开起来,代码如下
  1.     HAL_SuspendTick();, R! r' Y: j5 i6 C; v& O
  2.     HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); 5 V6 e  A9 b# M% Q( {: `
  3.     HAL_ResumeTick();
      R  C6 M; L, a3 m/ o
复制代码
17.png ) p3 a' a! b/ b* T* `& N2 ~9 j
然后烧录下载,把供电跳帽调整为CHG,功耗如图,平均电流360多uA,这个电流和芯片手册上的nA级别的差的有点多,有可能是硬件外围或者我某些东西没有关掉。由于今天主要目的不是测试功耗,今天就不细究了
18.png + R- R' {0 c0 t) q; M, h" ?
在电流曲线中我无法很直观的看到芯片1S定时唤醒的电流建峰。但是LED在正常闪烁,电流也低,我觉得应该是按照我预想的在进行了
$ ]1 n9 {2 H0 M
然后我提一下,加了低功耗的代码后,keil就不能直接下载代码了,因为芯片睡了。
我的解决方法是使用STM32CubeProgrammer,按住复位键,然后点击右上角的connect,然后立刻放开复位键,这样就可以连接成功,再点击左下角倒数第二个的橡皮,就可以全片擦除,这样就又可以再下载代码了(今天实在是太晚了,我就不一一截图了,看文字应该也能看明白)
我以前还有一种方法,按住复位键,然后点击keil中的下载,然后立刻放开复位键,但是今天好像不起作用,有可能是stlink的原因?我之前用jlink+L0平台这个的方式是可行的

" f& ~) w4 D% X( s0 }% W: p4 f
总结
今天的测试内容诸多不顺,好多东西都没搞明白,但磕磕绊绊的总算是有一点收获和结果。这个玩意儿我摸索了一个多礼拜了,头一次玩STM32给我玩崩溃了

1 @; P* P0 U% A! _7 T. c2 X- Y3 o
最后还是感谢您耐心的看完我这篇很多地方都没讲清除的测评,如果您也在学习LPTIM的使用,希望本文能给你带来一些帮助。如果有好的文章或者意见指导欢迎在评论区留言
% j/ q# Y# r) \3 N7 b
最后是本次测试的工程代码
STM32U0_LPTIM_test.rar (5.19 MB, 下载次数: 2)
收藏 评论1 发布时间:2024-5-23 01:10

举报

1个回答
STMCU-管管 回答时间:2024-5-23 08:40:49

详细,继续点赞

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版