Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PM电源管理
功耗调优
RT-Thread精通PM功耗调优 - 外设篇
发布于 2020-11-19 09:11:25 浏览:1467
订阅该版
[tocm] [RT-Thread 电源管理与功耗调优系列 - 目录](https://club.rt-thread.org/ask/article/3419.html) [RT-Thread精通PM功耗调优 - 思想篇](https://club.rt-thread.org/ask/article/2296.html) [RT-Thread精通PM功耗调优 - lptimer篇](https://club.rt-thread.org/ask/article/2300.html) [RT-Thread精通PM功耗调优 - 引脚篇](https://club.rt-thread.org/ask/article/2304.html) [RT-Thread精通PM功耗调优 - 线程篇](https://club.rt-thread.org/ask/article/2305.html) [RT-Thread精通PM功耗调优 - 外设篇](https://club.rt-thread.org/ask/article/2307.html) [RT-Thread精通PM功耗调优 - Tickless篇](https://club.rt-thread.org/ask/article/2324.html) [RT-Thread精通PM功耗调优 - 专用LOG篇](https://club.rt-thread.org/ask/article/2338.html) [实践:RT-Thread PM管理实战 系列](https://club.rt-thread.org/ask/article/2282.html) [上手:产品功耗管理与调优经验分享 系列](https://club.rt-thread.org/ask/article/2707.html) [应用:PM组件应用与经验分享 系列](https://club.rt-thread.org/ask/article/292.html) 本篇为【外设篇】 ## 背景 * 功耗管理的对象,一般为整机。整个系统,单MCU方案,或多MCU方案,或多外设方案。因此,了解了MCU的基本电源与功耗模式,就要关注每个外设的功耗情况。 * 外设分为片上外设(MCU引脚、内部控制器),片外外设(具体点,如Touch Panel, LCD,BT module,NFC,PSRAM,EMMC等)。 * 片外外设,一般通过通讯总线与控制引脚,与MCU进行物理上的连接。有些外设,如BT、WIFI、ZigBee等,除了具体的硬件连接,可能与主芯片还有无线连接的方式。 ## 外设功耗 * 外设功耗,是调优的重点。 * 前期需要对整机功耗进行拆解,大体上清楚了功耗的组成,对功耗调优有个基本的方向,发现功耗管理,原来是有流程可以借鉴的。 * 针对功耗大头(功耗钉子户),如何进行调优。 * 针对特殊的用户需求,如传感器算法,如何实现功能、功耗、性能的平衡。 ## 外设分类: * 片内的外设,如I2C、UART、SPI、CAN等,可以和电源控制引脚、其他控制引脚等,与片外外设绑在一起管理。 * 片外外设的功耗,一般为外设模块本身的功耗、引脚产生的漏电,功耗调优时,除了保证引脚不漏电外,尽量降低外设模块本身的功耗。 * 低功耗运行(间歇性)、进入低功耗工作模式、按需开关等。 ## 外设管理 * 有工程师问我睡眠时,PSRAM(片外的RAM)要关闭,在睡眠前DeInit所有引脚,唤醒后Init所有引脚,发现PSRAM功能不正常,这是为何,怎么办? 答:我反问了一句,你是要睡眠时:PSRAM断电,还是不断电? * 接下来分析:PSRAM功耗本身在IDLE空闲时,功耗很低,50uA/3.8V左右。引脚STM32 FSMC总线,内部上拉,会在控制引脚上产生约200uA/3.8V左右的漏电(引脚漏电,总有办法去掉) * 如果调功耗本身没有指标:0uA 或 100uA,都无所谓,建议不断电,否则唤醒后,不只是改改引脚的问题,整个PSRAM 寄存器,包括FSMC控制器,可能都要初始化,并且,PSRAM里的数据全丢,如用于LCD显示,肯定会出问题。 * 不断电,全部引脚(包括控制引脚)反初始化,唤醒后,所有引脚初始化,发现也有问题,这个需要查看PSRAM的手册,了解部分控制引脚,需要有固定的电平,拉低的内部上拉拉低,上拉的内部上拉,不能全部DeInit。保证PSRAM安全的睡眠与唤醒。 * 一起断电的外设,注意唤醒后,要完整初始化外设后,方能使用。 * 断电的外设,初始化时间较久,建议考虑低功耗运行,而不是断电。 * 下面主要列举部分常用的外设的引脚处理,在调试功耗时,供参考 * xxx_DeInit的,用于进入睡眠前的处理,xxx_Init的,用于唤醒后的处理。 ## PSRAM FSMC总线 ```c /* PSRAM GPIO Init */ void PSRAM_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; /* Peripheral clock enable */ __HAL_RCC_FMC_CLK_ENABLE(); /** FMC GPIO Configuration PE0 ------> FMC_NBL0 PE1 ------> FMC_NBL1 PD0 ------> FMC_D2 PD0 ------> FMC_DA2 PD4 ------> FMC_NOE PD1 ------> FMC_D3 PD1 ------> FMC_DA3 PE4 ------> FMC_A20 PE3 ------> FMC_A19 PE2 ------> FMC_A23 PB7 ------> FMC_NL PD5 ------> FMC_NWE PE6 ------> FMC_A22 PE5 ------> FMC_A21 PD6 ------> FMC_NWAIT PD3 ------> FMC_CLK PD7 ------> FMC_NE1 PE10 ------> FMC_D7 PE10 ------> FMC_DA7 PD13 ------> FMC_A18 PD15 ------> FMC_D1 PD15 ------> FMC_DA1 PD14 ------> FMC_DA0 PE9 ------> FMC_D6 PE9 ------> FMC_DA6 PE15 ------> FMC_D12 PE15 ------> FMC_DA12 PD12 ------> FMC_A17 PD11 ------> FMC_A16 PD10 ------> FMC_D15 PD10 ------> FMC_DA15 PE8 ------> FMC_D5 PE8 ------> FMC_DA5 PE14 ------> FMC_D11 PE14 ------> FMC_DA11 PD9 ------> FMC_D14 PD9 ------> FMC_DA14 PD8 ------> FMC_D13 PD8 ------> FMC_DA13 PE7 ------> FMC_D4 PE7 ------> FMC_DA4 PE13 ------> FMC_D10 PE13 ------> FMC_DA10 PE12 ------> FMC_D9 PE12 ------> FMC_DA9 PE11 ------> FMC_D8 PE11 ------> FMC_DA8 PG12 ------> FMC_NCE2 */ __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); /* PE0~PE15 */ GPIO_InitStruct.Pin = GPIO_PIN_All; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /* PD0,PD1,PD3~PE15 */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_4 |GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8 |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12 |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /* PB7-FMC_ADV_N*/ GPIO_InitStruct.Pin = GPIO_PIN_7; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* PG12-FMC_NCE2 */ GPIO_InitStruct.Pin = GPIO_PIN_12; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); } /* PSRAM GPIO DeInit */ void PSRAM_GPIO_DeInit(void) { /** FMC GPIO Configuration PE0 ------> FMC_NBL0 PE1 ------> FMC_NBL1 PD0 ------> FMC_D2 PD0 ------> FMC_DA2 PD4 ------> FMC_NOE PD1 ------> FMC_D3 PD1 ------> FMC_DA3 PE4 ------> FMC_A20 PE3 ------> FMC_A19 PE2 ------> FMC_A23 PB7 ------> FMC_NL PD5 ------> FMC_NWE PE6 ------> FMC_A22 PE5 ------> FMC_A21 PD6 ------> FMC_NWAIT PD3 ------> FMC_CLK PD7 ------> FMC_NE1 PE10 ------> FMC_D7 PE10 ------> FMC_DA7 PD13 ------> FMC_A18 PD15 ------> FMC_D1 PD15 ------> FMC_DA1 PD14 ------> FMC_DA0 PE9 ------> FMC_D6 PE9 ------> FMC_DA6 PE15 ------> FMC_D12 PE15 ------> FMC_DA12 PD12 ------> FMC_A17 PD11 ------> FMC_A16 PD10 ------> FMC_D15 PD10 ------> FMC_DA15 PE8 ------> FMC_D5 PE8 ------> FMC_DA5 PE14 ------> FMC_D11 PE14 ------> FMC_DA11 PD9 ------> FMC_D14 PD9 ------> FMC_DA14 PD8 ------> FMC_D13 PD8 ------> FMC_DA13 PE7 ------> FMC_D4 PE7 ------> FMC_DA4 PE13 ------> FMC_D10 PE13 ------> FMC_DA10 PE12 ------> FMC_D9 PE12 ------> FMC_DA9 PE11 ------> FMC_D8 PE11 ------> FMC_DA8 PG12 ------> FMC_NCE2 */ GPIO_InitTypeDef GPIO_InitStruct = { 0 }; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1| GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6| GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11| GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /* PE0,PE1,PE3~PE15 */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3| GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7| GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11| GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /* PB7-FMC_ADV_N */ GPIO_InitStruct.Pin = GPIO_PIN_7; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* PD3 */ GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /* PE2 */ GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); } ``` ## SPI总线 ```c void SPI1_GPIO_Init(void) { /* initialize the cs pin && select the slave*/ GPIO_InitTypeDef GPIO_InitStruct = { 0 }; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); /* SPI1 clock enable */ __HAL_RCC_SPI1_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); } void SPI1_GPIO_DeInit(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_15; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` ## SDIO EMMC总线 ```c /* SDMMC1 GPIO Init */ void SDMMC1_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; __HAL_RCC_SDMMC1_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /** SDMMC1 GPIO Configuration PD2 ------> SDMMC1_CMD PC10 ------> SDMMC1_D2 PC11 ------> SDMMC1_D3 PC12 ------> SDMMC1_CK PC8 ------> SDMMC1_D0 PC9 ------> SDMMC1_D1 */ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12 |GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } /* SDMMC1 GPIO DeInit */ void SDMMC1_GPIO_DeInit(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /* PC8~PC11 */ GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10| GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /* PC12--EMMC_CLK */ GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } ``` ## UART ```c void UART1_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; /* Enable GPIO TX/RX clock */ __HAL_RCC_GPIOG_CLK_ENABLE(); /* Enable USARTx clock */ __HAL_RCC_USART1_CLK_ENABLE(); /* UART TX GPIO pin configuration */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); /* UART RX GPIO pin configuration */ GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); } void UART1_GPIO_DeInit(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; __HAL_RCC_GPIOG_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); __HAL_RCC_USART1_CLK_DISABLE(); } ``` ## I2C ``` void I2C1_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_I2C1_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } void I2C1_GPIO_DeInit(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } ``` ## USB总线 ```c /* USB PINS DeInit */ void STM32_USB_GPIO_DeInit(void) { HAL_GPIO_DeInit(GPIOA, GPIO_PIN_12|GPIO_PIN_11); /* Disable VDDUSB */ if (__HAL_RCC_PWR_IS_CLK_DISABLED()) __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWREx_DisableVddUSB(); } /* USB PINS Init*/ void STM32_USB_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); /* USB_OTG_FS GPIO Configuration PA12 ------> USB_OTG_FS_DP PA11 ------> USB_OTG_FS_DM */ GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* Enable VDDUSB */ if(__HAL_RCC_PWR_IS_CLK_DISABLED()) __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWREx_EnableVddUSB(); } ``` ## 其他杂项: 禁用J-Link下载后DBGMCU寄存器,开启的调试功能,造成内核电压一直存在 ```c void rt_pm_disable_dbgmcu(void) { HAL_DBGMCU_DisableDBGStopMode(); HAL_DBGMCU_DisableDBGSleepMode(); HAL_DBGMCU_DisableDBGStandbyMode(); } ``` 禁用StandBy模式下GPIO使能的上下拉配置 ```c void rt_pm_clear_pullup_pulldown(void) { HAL_PWREx_DisablePullUpPullDownConfig(); } ``` ## STM32 Standby模式下开启内部上拉 STM32 进入关机StandBy模式,默认所有的GPIO引脚改为模拟态,可以配置为上拉或下拉。 如: ```c HAL_PWREx_EnableGPIOPullUp(PWR_GPIO_A, PWR_GPIO_BIT_0); // 配置好某些引脚上下拉属性后,开启是能。 HAL_PWREx_EnablePullUpPullDownConfig(); ``` ## 中断引脚的处理: * 理论上,中断本身漏电非常低,可以不处理,否则,睡眠模式下无法通过此引脚唤醒 * 深睡眠时,部分不需要的中断引脚,按常规处理,睡眠前DeInit,唤醒后Init(注意中断配置跟之前一致)。 * 中断,注意内部使能的上下拉电阻漏电。 ## 案例:按键双边沿(上升与下降)无法触发 * 了解到外部的上拉电阻(10K,较小,有漏电)已移除,导致按键按下后,电平不变化(物理电压),造成MCU无中断产生(物理:芯片)。为何强调物理,请了解中断触发的物理条件。 * 配置上拉,使能中断(双边沿),无效!!因为默认GPIO 【驱动适配,用户可改!】,双边沿时,GPIO重新初始化为无内部上下拉配置。所以,手动改一下即可。 *【重点】drv_gpio.c(感觉是rt-thread BSP 提供的,不敢改!! 有的客户,内核都给你改掉!!这里是基于stm32的适配驱动,可以改!!) ```c //改这个函数: 你用的:rt_pin_irq_enable,最终实现的函数如下: static rt_err_t stm32_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled) ``` ``` /* Configure GPIO_InitStructure */ GPIO_InitStruct.Pin = index->pin; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; switch (pin_irq_hdr_tab[irqindex].mode) { case PIN_IRQ_MODE_RISING: GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; break; case PIN_IRQ_MODE_FALLING: GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; break; case PIN_IRQ_MODE_RISING_FALLING: GPIO_InitStruct.Pull = GPIO_NOPULL; /* 【重点位置:默认无上下拉,外部有上拉,或能改变电平的,不用改!按需可以改为内部上拉,很少有改为下拉的!】*/ GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; break; } HAL_GPIO_Init(index->gpio, &GPIO_InitStruct); ``` * 按键,一般是有默认电平的,如你外部默认一直拉低(工作时断开->内部上拉),这时,STM32 内部上拉电阻(50K左右),也会有部分漏电,需要考虑采用外部上拉(考虑阻值大一点,如1M),保证漏电达到最低。 以上为接触过的外设引脚的处理部分,仅供参考。
4
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
802
被采纳
173
关注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组件
热门标签
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
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部