Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PM电源管理
PM适配STM32F/G/L系列的优化和更改
发布于 2020-04-28 23:07:07 浏览:3165
订阅该版
前段时间有写一个PM适配STM32系列的,见这个链接: [PM组件适配STM32F0/F1/F2/F3/F4/F7/G0/G4/L0/L1/L4/H7](https://club.rt-thread.org/ask/question/ceccda97ff72daa3.html) 新版在 pm-ports-stm32-new 分支里: [https://gitee.com/sunwancn/rt-thread/tree/pm-ports-stm32-new](https://gitee.com/sunwancn/rt-thread/tree/pm-ports-stm32-new) 这次对PM组件的 `bsp/stm32/libraries/HAL_Drivers` 目录下的某些文件进行了下列调整: 增加 drv_pmhw 子目录,目录里添加相应系列的C文件,比如:`drv_pmhw_f0.c、drv_pmhw_f1.c、drv_pmhw_f2.c`等等,针对单一系列的睡眠、运行的频率和电压调节及设置的细化。 - drv_lptim.h --> drv_pmhw.h - drv_lptim.c --> drv_pmtim.c,处理唤醒定时器相关的。 - drv_pm.c中的sleep()和run()函数,移动到和硬件相关的各自的`drv_pmhw_f*.c`文件里。 和前一个版本相比,新版的PM组件和一般的BSP配置是一样的,不用再自己特意写不同的配置时钟树的函数,所有针对时钟的操作(除了SystemClock_Config())都集成在drv_pmhw 子目录的文件里了,使用更加方便。现在有F0/F1/F2/F4/G0/G4/L0/L1/L4,其它系列等待添加。 另外,在PM组件的ENV菜单上添加了一些项目: ``` config RT_PM_TIM_USING_RTC_ALARM bool "Using RTC ALARM to hold a long STOP time" depends on !(SOC_SERIES_STM32F1 || SOC_SERIES_STM32F2 || \ SOC_STM32L100C6 || SOC_STM32L100R8 || SOC_STM32L100RB || \ SOC_STM32L151C6 || SOC_STM32L151R6 || SOC_STM32L151C8 || \ SOC_STM32L151R8 || SOC_STM32L151V8 || SOC_STM32L151CB || \ SOC_STM32L151RB || SOC_STM32L151VB) default n ``` 这一项是尽量使用RTC的ALARM定时器来唤醒,以得到长的STOP时间还可以兼顾毫秒级的定时精度,最长1个小时,而原来使用LPTIM只有1分钟左右,RTC的wakeup_timer只有30多秒。默认还是使用LPTIM或RTC的wakeup_timer来唤醒STOP模式。F1系列不需要这项设置,F2和部分L1(其中的cat1)不支持这个选项。 ``` config RT_PM_USING_INTERNAL_WAKEUP bool "Wakeup from STOP mode use only internal interrupt to keep the second time base" depends on SOC_SERIES_STM32F2 || \ SOC_STM32L100C6 || SOC_STM32L100R8 || SOC_STM32L100RB || \ SOC_STM32L151C6 || SOC_STM32L151R6 || SOC_STM32L151C8 || \ SOC_STM32L151R8 || SOC_STM32L151V8 || SOC_STM32L151CB || \ SOC_STM32L151RB || SOC_STM32L151VB default n ``` 这一项是专门针对F2及L1的cat1系列的,这些系列没有亚秒时钟。设定当只使用芯片内部的中断或事件来唤醒STOP模式,不使用外部的中断或事件唤醒,如没有按键唤醒等,可以不改变秒时基,唤醒时间相当于开环的,由于没有不确定的唤醒时间,唤醒后systick直接补偿了相应的唤醒时间。否则的话,这些系列只能通过改变秒时基,以实现毫秒级的唤醒,这样RTC的时间是不准的。 ``` if (SOC_SERIES_STM32F2 || SOC_SERIES_STM32F4) choice prompt "Select VDD ranges" default RT_PM_USING_VDD_2P7_3P6 config RT_PM_USING_VDD_2P7_3P6 bool "VDD range 2.7V-3.6V" config RT_PM_USING_VDD_2P4_2P7 bool "VDD range 2.4V-2.7V" config RT_PM_USING_VDD_2P1_2P4 bool "VDD range 2.1V-2.4V" config RT_PM_USING_VDD_1P7_2P1 bool "VDD range 1.7V-2.1V" endchoice endif ``` 对F2和F4系列增加了VDD电压范围选项。因为F2和F4的VDD影响FLASH的读取延时及变频等。 新版针对每个系列自动分配了4个运行等级,当然,还是可以自定义运行配置,自定义一个运行频率数组,如: ```c rt_uint16_t pm_run_freq[PM_RUN_MODE_MAX][2] = { /* The actual frequency is 1/divisor MHz, divisor = {1, 1000} */ /* {sysclk frequency, divisor} */ {72, 1}, /* High speed 72MHz */ {72, 1}, /* Normal speed 72MHz */ {24, 1}, /* Medium speed 24MHz */ {500, 1000}, /* Low speed, this is HCLK, 500KHz */ }; ``` ```c rt_uint16_t pm_run_freq[PM_RUN_MODE_MAX][2] = { /* The actual frequency is 1/divisor MHz, divisor = {1, 1000} */ /* {sysclk frequency, divisor} */ {32, 1}, /* High speed */ {32, 1}, /* Normal speed */ {12, 1}, /* Medium speed */ {2097, 1000}, /* Low speed, MSI clock 2.097 MHz */ }; ``` 4组频率参数,MHz或KHz,第二个数是除数,实际频率为标的1/divisor,divisor只能是 1 或 1000。定义频率后,时钟树是自动设置,已经尽量设置使USB频率为48MHz。 在低频时要注意,有时任务不能完成,有可能不能进入STOP模式,要适当的增大RT_TICK值,减小RT_TICK_PER_SECOND值到500、200、100等。 还有低频时串口的波特率也不能太高,高波特率不能通讯。 当然也还是可以自定义下面的时钟函数(所有或部分): ```void pm_system_clock_high(void)``` ```void pm_system_clock_normal(void)``` ```void pm_system_clock_medium(void)``` ```void pm_system_clock_low(void)``` 大家测试时有问题要及时跟帖反应。
查看更多
23
个回答
默认排序
按发布时间排序
sunwan
2020-04-29
这家伙很懒,什么也没写!
提供一个PM的补丁包:[attach]15230[/attach]
sunwan
2020-04-29
这家伙很懒,什么也没写!
2020-04-28:stm32f030、stm32f103开发板已经实测过。
sunwan
2020-04-29
这家伙很懒,什么也没写!
g和l系列的有几个scons的脚本文件忘了修改了,等晚上再改 --------------------------------------------------------------------------- 修改好了。 重新打包了 patch 包:[attach]15231[/attach]
Zhyolo
2020-04-29
这家伙很懒,什么也没写!
感谢楼主分享,正好需要
Zhyolo
2020-04-29
这家伙很懒,什么也没写!
patch 打到 rt-thread master分支最新的状态会有冲突
sunwan
2020-04-29
这家伙很懒,什么也没写!
>patch 打到 rt-thread master分支最新的状态会有冲突 这样吗,我看看,是master分支吗?
Zhyolo
2020-04-29
这家伙很懒,什么也没写!
>这样吗,我看看,是master分支吗? 嗯嗯 是的
sunwan
2020-04-29
这家伙很懒,什么也没写!
吐槽论坛帖子过几个小时就不能修改! --------------------------------------------- 不知怎么回事,用 git的format-patch制作的补丁包打补丁时中途会出现错误。 现在重新用diff制作了一个单一的补丁包:[attach]15258[/attach] 使用通用的BSP,ENV的menuconfig中启用PM组件就可以了。
Zhyolo
2020-04-30
这家伙很懒,什么也没写!
好的,我试试,谢谢
Zhyolo
2020-05-06
这家伙很懒,什么也没写!
在stm32f103 上 `PM_SLEEP_MODE_DEEP` 模式是不是只有中断唤醒了
撰写答案
登录
注册新账号
关注者
0
被浏览
3.2k
关于作者
sunwan
这家伙很懒,什么也没写!
提问
10
回答
91
被采纳
0
关注TA
发私信
相关问题
1
STM32F103的低功耗
2
最近用rtthread系统下AD采样并低功耗,中断响应不及时
3
rt-thread低功耗休眠应用问题请教
4
关于RTT对低功耗的支持
5
RT-Thread怎么休眠实现低功耗。
6
RT-Thread V3.0支持的低功耗,OS会自行进入吗?
7
关于RTThread3.0低功耗休眠模式
8
RTT3.0的bsp包中哪些MCU自带低功耗定时器?
9
关于低功耗上次说针对L4出个BSP的,怎么迟迟不见呀
10
低功耗问题。
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT Thread 源码分析笔记 :线程和调度器
2
RT-Thread项目助手v0.2.0 - 支持Env Windows
3
RttreadV5.10上,GD32F450Z RTC时间显示问题
4
rt-smart启动流程分析
5
EtherKit快速上手PROFINET
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部