Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PM组件
低功耗
5
低功耗模式不能唤醒(外部中断)
发布于 2022-05-30 16:07:24 浏览:1167
订阅该版
使用的开发板为 正点原子的 STM32F429IGTx 阿波罗开发板,内核版本为 4.0.4,PM组件版本为 2.0。参考文章 https://blog.csdn.net/sinat_31039061/article/details/106356068 对低功耗管理相关内容进行移植,拷贝了 drv_pm.c、drv_pmhw_f4.c、drv_pmhw.h 和 drv_pmtim.c 四个文件到工程中。 在测试时测试过程如下,下载程序后查看当前处于运行模式,然后请求 DeepSleep 也就是停止模式,然后释放掉 None Mode,此时板子就唤醒不了了,按理说在停止模式下可以使用外部中断(外部按键)进行唤醒,但是按下按键没有响应。在裸机代码中使用按键可以唤醒 stop 模式。 ``` \ | / - RT - Thread Operating System / | \ 4.0.4 build May 30 2022 14:08:12 2006 - 2021 Copyright by rt-thread team [I/drv.rtc] RTC hasn't been configured, please use
command to config. msh >date Sat Jan 1 00:06:25 2000 msh >list_device device type ref count -------- -------------------- ---------- rtc RTC 0 pm PM Pseudo Device 0 uart1 Character Device 2 pin Miscellaneous Device 0 msh > msh >pm_dump | Power Management Mode | Counter | Timer | +-----------------------+---------+-------+ | None Mode | 1 | 0 | | Idle Mode | 0 | 0 | | LightSleep Mode | 0 | 0 | | DeepSleep Mode | 0 | 1 | | Standby Mode | 0 | 0 | | Shutdown Mode | 0 | 0 | +-----------------------+---------+-------+ pm current sleep mode: None Mode pm current run mode: Normal Speed | module | busy | start time | timeout | +--------+------+------------+-----------+ | 0001 | 0 | 0x00000000 | 0x00000000 | +--------+------+------------+-----------+ msh > msh >pm_request 3 msh > msh >pm_dump | Power Management Mode | Counter | Timer | +-----------------------+---------+-------+ | None Mode | 1 | 0 | | Idle Mode | 0 | 0 | | LightSleep Mode | 0 | 0 | | DeepSleep Mode | 1 | 1 | | Standby Mode | 0 | 0 | | Shutdown Mode | 0 | 0 | +-----------------------+---------+-------+ pm current sleep mode: None Mode pm current run mode: Normal Speed | module | busy | start time | timeout | +--------+------+------------+-----------+ | 0001 | 0 | 0x00000000 | 0x00000000 | +--------+------+------------+-----------+ msh > msh >pm_release 0 msh >on ▒▒M ``` main.c 的代码如下: ```c #include
#include "rtdevice.h" #include "drv_common.h" #include "led.h" #include "key.h" #define DBG_TAG "main" #define DBG_LVL DBG_LOG #include
void pm_notify_callback(rt_uint8_t event, rt_uint8_t mode, void *data) { if(event == RT_PM_ENTER_SLEEP) { //if(mode == PM_SLEEP_MODE_DEEP) { led0_on(); rt_kprintf("on\n"); } } else if (event == RT_PM_EXIT_SLEEP) { //if(mode == PM_SLEEP_MODE_DEEP) { led0_off(); rt_kprintf("off\n"); } } } int main(void) { led_init(); key_irq_init(); rt_pm_notify_set(pm_notify_callback, 0); while (1) { led1_on(); rt_thread_mdelay(500); led1_off(); rt_thread_mdelay(500); } return RT_EOK; } ``` 按键的初始化代码如下,在没有休眠时,按下 KEY0 或者 KEY1 可以进入回调函数打印 "key irq\n" ```c #include
#include "rtdevice.h" #include "drv_common.h" #include "key.h" #define DBG_TAG "led.c" #define DBG_LVL DBG_LOG #include
#define KEY0_RTT_PIN (GET_PIN(H, 3)) // 按下低电平 #define KEY1_RTT_PIN (GET_PIN(H, 2)) // 按下低电平 #define KEY2_RTT_PIN (GET_PIN(C, 13)) // 按下低电平 #define WKUP_RTT_PIN (GET_PIN(A, 0)) // 按下高电平 void key_irq_callback(void *args) { //rt_pm_request(PM_SLEEP_MODE_NONE); rt_kprintf("key irq\n"); } void key_irq_init(void) { // key0 rt_pin_mode(KEY0_RTT_PIN, PIN_MODE_INPUT_PULLUP); // 输入模式 rt_pin_attach_irq(KEY0_RTT_PIN, PIN_IRQ_MODE_FALLING, key_irq_callback, RT_NULL); // 下降沿触发中断 rt_pin_irq_enable(KEY0_RTT_PIN, PIN_IRQ_ENABLE); // 使能中断 // key1 rt_pin_mode(KEY1_RTT_PIN, PIN_MODE_INPUT_PULLUP); // 输入模式 rt_pin_attach_irq(KEY1_RTT_PIN, PIN_IRQ_MODE_FALLING, key_irq_callback, RT_NULL); // 下降沿触发中断 rt_pin_irq_enable(KEY1_RTT_PIN, PIN_IRQ_ENABLE); // 使能中断 // key2 // rt_pin_mode(KEY2_RTT_PIN, PIN_MODE_INPUT_PULLUP); // 输入模式 // rt_pin_attach_irq(KEY2_RTT_PIN, PIN_IRQ_MODE_FALLING, key_irq_callback, RT_NULL); // 下降沿触发中断 // rt_pin_irq_enable(KEY2_RTT_PIN, PIN_IRQ_ENABLE); // 使能中断 // wakeup // rt_pin_mode(WKUP_RTT_PIN, PIN_MODE_INPUT_PULLDOWN); // 输入模式 // rt_pin_attach_irq(WKUP_RTT_PIN, PIN_IRQ_MODE_RISING, key_irq_callback, RT_NULL); // 上降沿触发中断 // rt_pin_irq_enable(WKUP_RTT_PIN, PIN_IRQ_ENABLE); // 使能中断 } ```
查看更多
老斑鸠
2022-05-30
这家伙很懒,什么也没写!
不要在 msh 里用命令请求休眠。 单独写个测试命令,起个线程去请求休眠模式可能就好了。 命令是运行在 tshell 线程中的,你现在可能已经唤醒了,但是 shell 线程没退出来,不能把串口的数据拿回来,就卡在里面了。 ```c static void wakeup_callback(void* p) { rt_event_send(wakeup_event, WAKEUP_EVENT_BUTTON); } void wakeup_sample(void) { /* init */ rt_uint32_t pin = rt_pin_get(USER_INPUT); rt_kprintf("\n pin number : 0x%04X \n", pin); rt_err_t err = rt_pin_attach_irq(pin, PIN_IRQ_MODE_RISING, wakeup_callback, RT_NULL); if (RT_EOK != err) { rt_kprintf("\n attach irq failed. \n"); } err = rt_pin_irq_enable(pin, PIN_IRQ_ENABLE); if (RT_EOK != err) { rt_kprintf("\n enable irq failed. \n"); } } static void wakeup_init(void) { wakeup_event = rt_event_create("wakup", RT_IPC_FLAG_FIFO); RT_ASSERT(wakeup_event != RT_NULL); wakeup_sample(); } static void pm_mode_init(void) { rt_pm_release_all(RT_PM_DEFAULT_SLEEP_MODE); rt_pm_request(PM_SLEEP_MODE_NONE); } void pm_test_entry(void* para) { /* 唤醒回调函数初始化 */ wakeup_init(); /* 电源管理初始化 */ pm_mode_init(); while (1) { /* 等待唤醒事件 */ if (rt_event_recv(wakeup_event, WAKEUP_EVENT_BUTTON, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, RT_NULL) == RT_EOK) { led_app(); } } } int pm_test(void) { rt_thread_t tid = rt_thread_create( "pmtest",pm_test_entry,RT_NULL,512,10,10); if(tid) rt_thread_startup(tid); return 0; } MSH_CMD_EXPORT(pm_test, pm_test); #endif ```
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
1.2k
关于作者
crystal266
嵌入式
提问
33
回答
547
被采纳
161
关注TA
发私信
相关问题
1
RTT Studio STM32f4系列低功耗实现
2
STM32F205 低功耗
3
关于使用cube 做低功耗产品
4
RT适合制作如智能抄表这种低功耗设备吗?长期休眠一天使用NB发送一次数据
5
低功耗框架_pm_change_sleep_mode()一直刷
6
华大芯片如何在rt-thread系统下使用休眠功能
7
RT-Thread nano配合低功耗,有没有指导文件,实现的难度有多大
8
stm32L431进入低功耗会自动唤醒
9
STM32L 停止模式低功耗,断电重启一次功耗更低
10
rt-Thread 设备操作
推荐文章
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
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部