PY32F003F18之sleep模式

一、WFI和WFE
WFI: wait for interrupt,是"等待中断"的意思;
WFE: wait for event,是"等待事件"的意思;

1)执行HAL_PWR_DisableSleepOnExit(),则令SLEEPONEXIT位置0;
当SLEEPDEEP=0,SLEEPONEXIT=0,如果执行WFI,则立即进入"sleep模式",中断唤醒后,程序会继续执行main()中的其它语句
退出睡眠方式是:中断


当SLEEPDEEP=0,SLEEPONEXIT=0,如果执行WFE,则立即进入"sleep模式",唤醒后,程序会继续执行main()中的其它语句;
退出睡眠方式是:唤醒事件,包括中断


2)执行HAL_PWR_EnableSleepOnExit(),则令SLEEPONEXIT位置1
若执行WFI或WFE,则立即进入"sleep模式";中断唤醒后,程序只执行"相应的中断服务程序",退出中断后,会再次进入"sleep模式",
因此,不再执行执行main()中的其它语句;
唤醒退出方式是:中断

3)执行HAL_PWR_EnableSEVOnPend(),则令SEVONPEND位置1;允许事件唤醒内核(包括中断唤醒),
在执行WFE指令前,需要先设置SEVONPEND=1,才可以使用事件唤醒,否则,只能使用中断唤醒;
但通过WFI进入的"sleep模式",即使设置SEVONPEND=1,事件也无法唤醒CPU核,不清楚原因?

翻译的文档,写得实在糟糕,一些功能性表格,就不截图了,免得会产生误解!!!

4)"stop模式"可以执行事件唤醒和中断唤醒。

注意:在sleep模式中,所有的"IO引脚"和"run模式"保持相同的电平状态;
在进入睡眠前,需要配置好"相应的唤醒源",关闭不用的模块,如SysTick,以便CPU进入Sleep模式;

二、测试程序

#include "SleepMode.h"/*
"sleep模式"
WFI: wait for interrupt,是"等待中断"的意思;
WFE: wait for event,是"等待事件"的意思;1)执行HAL_PWR_DisableSleepOnExit(),则令SLEEPONEXIT位置0;
当SLEEPDEEP=0,SLEEPONEXIT=0,如果执行WFI,则立即进入"sleep模式",中断唤醒后,程序会继续执行main()中的其它语句;
退出睡眠方式是:中断;
当SLEEPDEEP=0,SLEEPONEXIT=0,如果执行WFE,则立即进入"sleep模式",唤醒后,程序会继续执行main()中的其它语句;
退出睡眠方式是:唤醒事件,包括中断;2)执行HAL_PWR_EnableSleepOnExit(),则令SLEEPONEXIT位置1;
若执行WFI或WFE,则立即进入"sleep模式";中断唤醒后,程序只执行"相应的中断服务程序",退出中断后,会再次进入"sleep模式",
因此,不再执行执行main()中的其它语句;
唤醒退出方式是:中断;3)执行HAL_PWR_EnableSEVOnPend(),则令SEVONPEND位置1;允许事件唤醒内核(包括中断唤醒),
在执行WFE指令前,需要先设置SEVONPEND=1,才可以使用事件唤醒,否则,只能使用中断唤醒,
但通过WFI进入的"sleep模式",即使设置SEVONPEND=1,事件也无法唤醒CPU核,不清楚原因?4)"stop模式"可以执行事件唤醒和中断唤醒。注意:在sleep模式中,所有的"IO引脚"和"run模式"保持相同的电平状态;
在进入睡眠前,需要配置好"相应的唤醒源",关闭不用的模块,如SysTick,以便CPU进入Sleep模式;
*/void EnterSLEEPMode_With_WFE(void);
void EnterSLEEPMode_With_WFI(void);
void EnterSLEEPMode_With_WFE_And_After_Interrupt(void);
void EnterSLEEPMode_With_WFI_And_After_Interrupt(void);//函数功能:中断或事件唤醒后,程序会继续执行main()中的其它语句
//通过WFE进入的"sleep模式",退出方式是:唤醒事件,也可以是中断
void EnterSLEEPMode_With_WFE(void)
{__HAL_RCC_PWR_CLK_ENABLE();//PWR时钟使能//这一句不能少,否则,不能进入"sleep模式"HAL_PWR_DisableSleepOnExit();//则令SLEEPONEXIT位置0;//如果执行WFE,则立即进入"sleep模式"HAL_PWR_EnableSEVOnPend();//当"SEVONPEND=1"时,允许事件唤醒内核(包括中断唤醒)//这一句不能少,否则,事件无法唤醒CPUHAL_PWR_EnterSLEEPMode(PWR_SLEEPENTRY_WFE);//令SLEEPDEEP=0,然后执行WFE,令CPU进入"sleep模式"
}//函数功能:中断唤醒后,程序会继续执行main()中的其它语句
//通过WFI进入的"sleep模式",退出方式是:只能是中断
void EnterSLEEPMode_With_WFI(void)
{__HAL_RCC_PWR_CLK_ENABLE();//PWR时钟使能//这一句不能少,否则,不能进入"sleep模式"HAL_PWR_DisableSleepOnExit();//则令SLEEPONEXIT位置0;//如果执行WFI,则立即进入"sleep模式"HAL_PWR_EnableSEVOnPend();//当"SEVONPEND=1"时,允许事件唤醒内核(包括中断唤醒)//这一句不能少,否则,事件无法唤醒CPUHAL_PWR_EnterSLEEPMode(PWR_SLEEPENTRY_WFI);//令SLEEPDEEP=0,然后执行WFI,令CPU进入"sleep模式"
}//函数功能:中断唤醒后,程序只执行"相应的中断服务程序",退出中断后,会再次进入"sleep模式";
//SLEEPONEXIT位置1,通过WFE进入的"sleep模式",退出方式是:只能是中断
void EnterSLEEPMode_With_WFE_And_After_Interrupt(void)
{__HAL_RCC_PWR_CLK_ENABLE();//PWR时钟使能//这一句不能少,否则,不能进入"sleep模式"HAL_PWR_EnableSleepOnExit();//则令SLEEPONEXIT位置1,若执行WFE,则立即进入"sleep模式";当有中断发生后,则执行完中断服务程序,会继续进入"sleep模式"HAL_PWR_EnterSLEEPMode(PWR_SLEEPENTRY_WFE);//令SLEEPDEEP=0,然后执行WFE,令CPU进入"sleep模式"
}//函数功能:中断唤醒后,程序只执行"相应的中断服务程序",退出中断后,会再次进入"sleep模式";
//SLEEPONEXIT位置1,通过WFI进入的"sleep模式",退出方式是:只能是中断
void EnterSLEEPMode_With_WFI_And_After_Interrupt(void)
{__HAL_RCC_PWR_CLK_ENABLE();//PWR时钟使能//这一句不能少,否则,不能进入"sleep模式"HAL_PWR_EnableSleepOnExit();//则令SLEEPONEXIT位置1,若执行WFI,则立即进入"sleep模式";当有中断发生后,则执行完中断服务程序,会继续进入"sleep模式"HAL_PWR_EnterSLEEPMode(PWR_SLEEPENTRY_WFI);//令SLEEPDEEP=0,然后执行WFI,令CPU进入"sleep模式"
}
#include "py32f0xx_hal.h"
#include "SystemClock.h"
#include "delay.h"
#include "LED.h"
#include "SystemClock.h"
#include "USART2.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()
#include "EXTI.h"
#include "SleepMode.h"const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
const char CPU_Run_REG[]="\r\nCPU run!\r\n";
int main(void)
{HSE_Config();
//	HSI_Config();
//	HAL_Init();//systick初始化delay_init();HAL_Delay(1000);USART2_Init(115200);
//PA0是为USART2_TX,PA1是USART2_RX
//中断优先级为0x01
//波特率为115200,数字为8位,停止位为1位,无奇偶校验,允许发送和接收数据,只允许接收中断,并使能串口printf("%s",CPU_Reset_REG);HAL_Delay(1000);printf("%s",CPU_Run_REG);MCU_LED_Init();HAL_SuspendTick();//systick中断关闭,防止systick中断唤醒EXTI12_Init();//将PA12引脚配置为外部中断引脚printf("SLEEP MODE!\n\n");EnterSLEEPMode_With_WFE();
//	EnterSLEEPMode_With_WFI();
//	EnterSLEEPMode_With_WFE_And_After_Interrupt();
//	EnterSLEEPMode_With_WFI_And_After_Interrupt();__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_12);//清除外部事件标志位//清除"GPIO_PIN_12外部事件标志位"//当软件或者硬件产生上升沿/下降沿触发事件时,该位置位;NVIC_ClearPendingIRQ(EXTI4_15_IRQn);//清除EXTI4_15_IRQn中断源的中断标志位HAL_ResumeTick();//systick中断开启printf("WAKEUP OK!\n\n");while (1){HAL_Delay(500);MCU_LED_Toggle();printf("1234567890\r\n");}
}

事件唤醒:

//函数功能:将PA12引脚配置为外部事件引脚
void EXTI12_Init(void)
{GPIO_InitTypeDef GPIO_InitStructureure;__HAL_RCC_GPIOA_CLK_ENABLE();  //GPIOA时钟使能GPIO_InitStructureure.Pin = GPIO_PIN_12;//选择第12脚GPIO_InitStructureure.Pull = GPIO_PULLUP;//引脚上拉被激活GPIO_InitStructureure.Speed = GPIO_SPEED_FREQ_MEDIUM;//配置GPIO速度为中速GPIO_InitStructureure.Mode   = GPIO_MODE_IT_FALLING;//配置为下降沿检测模式HAL_GPIO_Init(GPIOA, &GPIO_InitStructureure);//根据GPIO_InitStructureure结构变量指定的参数初始化GPIOA的外设寄存器//因为使用了GPIO_MODE_IT_FALLING,所以使能了外部中断线//	HAL_NVIC_SetPriority(EXTI4_15_IRQn,0x0F,0);//EXTI4_15_IRQn表示外部中断线4~中断线15,EXTI4_15_IRQn//设置中断优先级为0x0F,0无意义,注意:0<=PreemptPriority<=3,值越大,表示中断优先级越低//Enable and set Button EXTI Interrupt to the lowest priority//	HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);//EXTI4_15_IRQn表示外部中断线4~中断线15,EXTI4_15_IRQn//使能EXTI4_15_IRQn中断
}

中断唤醒

//函数功能:将PA12引脚配置为外部中断引脚
void EXTI12_Init(void)
{GPIO_InitTypeDef GPIO_InitStructureure;__HAL_RCC_GPIOA_CLK_ENABLE();  //GPIOA时钟使能GPIO_InitStructureure.Pin = GPIO_PIN_12;//选择第12脚GPIO_InitStructureure.Pull = GPIO_PULLUP;//引脚上拉被激活GPIO_InitStructureure.Speed = GPIO_SPEED_FREQ_MEDIUM;//配置GPIO速度为中速GPIO_InitStructureure.Mode   = GPIO_MODE_IT_FALLING;//配置为下降沿检测模式HAL_GPIO_Init(GPIOA, &GPIO_InitStructureure);//根据GPIO_InitStructureure结构变量指定的参数初始化GPIOA的外设寄存器//因为使用了GPIO_MODE_IT_FALLING,所以使能了外部中断线HAL_NVIC_SetPriority(EXTI4_15_IRQn,0x03,0);//EXTI4_15_IRQn表示外部中断线4~中断线15,EXTI4_15_IRQn//设置中断优先级为0x03,0无意义,注意:0<=PreemptPriority<=3,值越大,表示中断优先级越低//Enable and set Button EXTI Interrupt to the lowest priorityHAL_NVIC_EnableIRQ(EXTI4_15_IRQn);//EXTI4_15_IRQn表示外部中断线4~中断线15,EXTI4_15_IRQn//使能EXTI4_15_IRQn中断
}

三、事件唤醒测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/126792.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络相关的基础知识整理

一、历史 1.1 早期阿帕网特点⭐⭐⭐ 没有纠错功能不能互联不同类型的计算机和不同类型的操作系统 1. 2 TCP/IP协议 点击【此处】跳转&#x1f517; TCP&#xff1a;用来检测网络传输中差错的传输控制协议IP&#xff1a;专门负责对不同网络进行互联的互联网协议&#xff08…

Video Caption / 视频字幕:数据集总结

目录 一、背景 二、介绍 2.1 MSR-VTT 2.2 MSVD 2.3 VATEX 三、参考文献 一、背景 Video Caption / 视频字幕&#xff1a;常用指标&#xff08;BELU-4&#xff0c;ROUGE-L&#xff0c;METEOR&#xff0c;CIDEr&#xff0c;SPICE&#xff09;和数据集总结-CSDN博客Video C…

满足你甜食需求的葡萄酒是怎样的?

也许这是不言而喻的&#xff0c;但我们认为&#xff0c;如果没有一杯完美的葡萄酒来补充你最喜爱的菜肴的复杂风味&#xff0c;一顿美食就不完整。无论您是享用美味的葡萄酒作为开胃菜&#xff0c;还是搭配主菜&#xff0c;我们相信我们最喜爱的饮料是一餐中任何部分的完美补充…

智慧空调插座:智控生活好伴侣,节能降耗好帮手

所谓“智能插座”&#xff0c;就是在普通插座上增加Wi-Fi模块&#xff0c;通过手机APP控制单个或整个插座的电源通断&#xff0c;并统计一段时间的用电量。 目前市面上所销售的智能插座&#xff0c;大多具备可连接Wi-Fi网路功能&#xff0c;如此一 来便不需要额外再购买定时控…

Arcgis日常天坑问题(1)——将Revit模型转为slpk数据卡住不前

这段时间碰到这么一个问题&#xff0c;revit模型在arcgis pro里导出slpk的时候&#xff0c;卡在98%一直不动&#xff0c;大约有两个小时。 首先想到的是revit模型过大&#xff0c;接近300M。然后各种减小模型测试&#xff0c;还是一样的问题&#xff0c;大概花了两天的时间&am…

软考对找工作有用吗?

软考是指软件技术专业资格考试&#xff0c;是由中国人力资源和社会保障部主管的一项国家级考试。软考的目标是评估和认证软件技术人员的专业能力&#xff0c;提高软件行业的整体素质和竞争力。那么&#xff0c;软考对找工作有用吗&#xff1f;本文将从以下几个方面进行分析。 首…

LabVIEW开发教学实验室自动化INL和DNL测试系统

LabVIEW开发教学实验室自动化INL和DNL测试系统 如今&#xff0c;几乎所有的测量仪器都是基于微处理器的设备。模拟输入量在进行数字处理之前被转换为数字量。对于参加电气和电子测量课程的学生来说&#xff0c;了解ADC以及如何欣赏其性能至关重要。ADC的不确定性可以根据其传输…

【Python】下载和安装

【Python】下载和安装 下载 进入 Python官网&#xff0c;下载最新版本&#xff0c;如下图所示&#xff1a; 如果需要下载其他版本&#xff0c;请下滑该页面&#xff0c;找到如下位置&#xff0c;选择需要的版本进行下载&#xff08;以3.8.10为例&#xff09;&#xff1a; 点击…

天启科技联创郭志强:趟遍教育行业信数化沟坎,创业智能赛道重塑行业生态

郭志强 天启科技联合创始人 近20年互联网、企业信息化、数字化实施、管理及培训经验。对于集团型企业及初创企业、传统企业及互联网企业的信息化、数字化转型有自己独到的见解和实操经验。具备跨区域、集团化信息规划、解决方案、系统架构及企业流程搭建、优化和技术团队管理能…

智慧用电安全云监控系统

近年来&#xff0c;我国电气火灾频发&#xff0c;2017年至2019年&#xff0c;我国共之间发生发展电气控制火灾31.1万起&#xff0c;占全国进行火灾总量及伤亡风险损失的30&#xff05;以上&#xff0c;2019年全年共接报火灾23.3万起&#xff0c;电气火灾11.1万&#xff0c;占52…

《第一行代码Andorid》阅读笔记-第十三章(最终章)

这一部分是天气API的笔记&#xff0c;这本书最后会让你做一个天气的app程序 其他的无关紧要的部分我就不写了&#xff0c;这是因为我原本的笔记是在飞书上面的&#xff0c;同步到CSDN上的流程稍显复杂 天气API 1. 项目结构 类&#xff1a; MainActivity&#xff1a;主活动Wea…

iPhone升级iOS17出现无法连接互联网的错误提示怎么办?

最新的iOS 17系统已经发布了快一个月了&#xff0c;很多人都已升级体验更多全新功能&#xff0c;但有部分用户却在升级过程中遇到一些问题&#xff1a;如无法验证更新&#xff0c;iOS17验证失败&#xff0c;因为您不再连接到互联网、 iPhone无法检查更新等错误问题。明明网络稳…