硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1157|回复: 15
收起左侧

[技术讨论] 如何在STOP模式中保持TIM继续工作

[复制链接]

24

主题

50

回帖

122

积分

初级会员

积分
122
发表于 2024-10-23 14:17:52 | 显示全部楼层 |阅读模式
如何在STOP模式(STOP0,STOP1或者STOP2)下保持TIM(例如:TIM2)唤醒?

[C] 纯文本查看 复制代码
void EnterStop0ModeRTC(void)
{
  // printf("START STOP0 RTC\r\n");
  __HAL_RCC_PWR_CLK_ENABLE();
  HAL_RCCEx_WakeUpStopCLKConfig(RCC_STOP_WAKEUPCLOCK_MSI);
  __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG();
  HAL_SuspendTick();
  __HAL_RCC_PWR_CLK_ENABLE();
  RCC->APB1SMENR1 = 0x01;
  // HAL_DBGMCU_EnableDBGStopMode();
  HAL_PWREx_EnterSTOP0Mode(PWR_STOPENTRY_WFI);
}

void ExitStop0ModeRTC(void)
{
  SystemClock_Config();
  HAL_ResumeTick();
  SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk;
  // printf("In the EXTI to wake up!\r\n");
}

我这样写好像TIM2也是停止工作的呀,有其他方法吗?还有个问题,就是在STOP模式中不能使用printf吗?我在进入STOP和退出STOP模式中都写一个printf,只会打印进入stop时的printf,而退出的不会打印,但是在调试的时候,断点是会进入退出函数中去的,调试时经过退出函数的printf只能打印一个S,后面的都不打印了,这是什么问题呢?
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2024-10-23 15:09:27 | 显示全部楼层
用什么打印的?串口?rtt?
非阻塞的话,你打印完后进入睡眠之前加个延时看看。
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-10-23 15:11:06 | 显示全部楼层
会飞的猪_2020 发表于 2024-10-23 15:09
用什么打印的?串口?rtt?
非阻塞的话,你打印完后进入睡眠之前加个延时看看。

用的串口,波特率9600的
[C] 纯文本查看 复制代码
int __write(int fd, const uint8_t *ptr, int len)
{
    return (HAL_UART_Transmit(&huart3, ptr, len, 1000u) == HAL_OK) ? len : -1;
}
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2024-10-23 15:17:13 | 显示全部楼层
zhouyalong 发表于 2024-10-23 15:11
用的串口,波特率9600的
[mw_shl_code=c,true]int __write(int fd, const uint8_t *ptr, int len)
{

退出后有重新初始化串口吗?
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2024-10-23 16:02:34 | 显示全部楼层
得看什么单片机了,实际上如果你的功耗够低的话就不用休眠,我之前用国产一个MCU,32khz频率运行,不用休眠 ,15uA,用着非常爽。
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-10-23 16:03:39 | 显示全部楼层
会飞的猪_2020 发表于 2024-10-23 15:17
退出后有重新初始化串口吗?

应该不用的吧,因为我把ExitStop0ModeRTC()里面的printf取消注释,就会打印,但是两个printf同时存在就只会打印一个
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-10-23 16:08:32 | 显示全部楼层
fxyc87 发表于 2024-10-23 16:02
得看什么单片机了,实际上如果你的功耗够低的话就不用休眠,我之前用国产一个MCU,32khz频率运行,不用休眠 ...

我就是想用TIM2,但是进入STOP2后,TIM2就停止了,不知道怎么才能让他在进入STOP2的时候让TIM2继续工作的我用的是STM32L431
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2024-10-23 16:12:31 | 显示全部楼层
zhouyalong 发表于 2024-10-23 16:08
我就是想用TIM2,但是进入STOP2后,TIM2就停止了,不知道怎么才能让他在进入STOP2的时候让TIM2继续工作的 ...

手册上写的支持不?
支持的话,是用的什么时钟?对应的时钟不能停。
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2024-10-23 16:17:29 | 显示全部楼层
fxyc87 发表于 2024-10-23 16:02
得看什么单片机了,实际上如果你的功耗够低的话就不用休眠,我之前用国产一个MCU,32khz频率运行,不用休眠 ...

L系列的低功耗单片机,理论上应该MCU功耗1ua以内的。
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2024-10-23 16:26:47 | 显示全部楼层
zhouyalong 发表于 2024-10-23 16:03
应该不用的吧,因为我把ExitStop0ModeRTC()里面的printf取消注释,就会打印,但是两个printf同时存在就只 ...

STM32L431进入STOP模式后,时钟都关闭了。
你唤醒后外设需要重新初始化。

或者你不要跑STOP模式,你用Low-power run这个模式。
或者你用Low-power timer,L系列的单片机都有低功耗定时器的。
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2024-10-23 16:29:54 | 显示全部楼层
我看了一下手册,stop模式功耗还是10ua级别的。。
你要功耗低,应该用Standby模式,然后唤醒之后初始化,这个手册上是na级别的。
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-10-23 21:46:43 | 显示全部楼层
会飞的猪_2020 发表于 2024-10-23 16:29
我看了一下手册,stop模式功耗还是10ua级别的。。
你要功耗低,应该用Standby模式,然后唤醒之后初始化, ...

我用的是STOP2模式,只有RTC和LPTIM1的中断可以唤醒,测试单板基础功耗1.6uA,主要是板子上有个4G模块,需要在定时器中10ms检测一次,之前没有添加低功耗的时候就是放在了TIM2的10ms中断中的,后面写了好久,没有实现在STOP2模式下保持TIM2持续工作,然后想到了LPTIM1,定了一个10ms,就是怕放在LPTIM1和RTC中断中有问题,好像我的产品使用stop模式是最好的,所以就选用了STOP模式
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-10-23 21:52:46 | 显示全部楼层
fxyc87 发表于 2024-10-23 16:12
手册上写的支持不?
支持的话,是用的什么时钟?对应的时钟不能停。

手册上STOP2模式下,外设和时钟都关闭了,只有LPTIM1和RTC中断可以唤醒,我RTC唤醒后又重新配置了系统时钟的,进入低功耗是没问题的,就是不知道怎么在低功耗的时候保持TIM2运行,手册中RCC是有一个寄存器的APB1SMENR1 ,这个寄存器应该就是保持TIMx在低功耗时继续运行,但是配置之后没反应。
回复

使用道具 举报

4

主题

126

回帖

138

积分

初级会员

积分
138
发表于 2024-10-23 22:31:58 | 显示全部楼层
zhouyalong 发表于 2024-10-23 21:46
我用的是STOP2模式,只有RTC和LPTIM1的中断可以唤醒,测试单板基础功耗1.6uA,主要是板子上有个4G模块, ...

是不是需求有问题?4G模块的功耗比MCU高吧,10ms检查意义不大,你可以让4G模块唤醒MCU。
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2024-10-24 08:50:32 | 显示全部楼层
zhouyalong 发表于 2024-10-23 21:46
我用的是STOP2模式,只有RTC和LPTIM1的中断可以唤醒,测试单板基础功耗1.6uA,主要是板子上有个4G模块, ...

大哥你看时钟树啊
在STOP2模式下保持TIM2持续工作
这个应该是做不到的吧??或者我孤陋寡闻了。



按照我的理解:
进入STOP2模式之后,主时钟都停了啊。定时器的时钟来源于你主时钟的分频?
为什么进入STOP2之后,TIM2还能工作呢?

你看这里是L431的时钟树,普通定时器的时钟来源和LPTIM的时钟来源。。
Snipaste_2024-10-24_08-48-24.png

Snipaste_2024-10-24_08-50-09.png




回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-10-24 16:38:08 | 显示全部楼层
会飞的猪_2020 发表于 2024-10-24 08:50
大哥你看时钟树啊
这个应该是做不到的吧??或者我孤陋寡闻了。

改用LPTIM1了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 17:27 , Processed in 0.048593 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表