当前位置: 首页 > news >正文

N32G4xx单片机休眠以及RTC唤醒问题

1. STOP0模式

进入STOP0模式之前必须要关闭SysTick中断,否则会唤醒STOP0械,唤醒之后再开启SysTick中断,对应的代码步骤为:

(1)关闭 SysTick (暂停计数+关闭中断),保留原有配置值(LOAD/VAL), 下次开启恢复运行:

SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);

(2)进入STOP0模式代码:

PWR_EnterSLEEPMode(0, PWR_STOPENTRY_WFI);

(3)开启 SysTick (恢复计数+开启中断),使用之前配置好的时钟源、重装载值:

SysTick->CTRL |= (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);

2. STOP2模式

进入STOP2模式前要关闭RCC_APB1_PERIPH_PWR时钟,配置系统时钟为内部高速时钟,唤醒后再开启RCC_APB1_PERIPH_PWR时钟(注意读写备份域数据必须开启),同时配置外部时钟:

RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_PWR, DISABLE); //禁止PWR时钟
SetSysClockToHSI(); //配置为内部时钟
PWR_EnterSTOP2Mode(PWR_STOPENTRY_WFI); //进入STOP2模式
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_PWR, ENABLE); //开启PWR时钟

SYSCLKConfig_STOP(RCC_CFG_PLLMULFCT18); //重新配置时钟,18倍频,144M

3. RTC唤醒

休眠和RTC唤醒全过程:

(1)上电RTC初始化,只上电处理即可,可配置为LSI / LSE(独立时钟),进 STOP2 也不断电,继续跑;

(2)进入休眠前,配置ALARM唤醒时间,配置唤醒时间前要先关闭中断,配置完后再开启中断,如设置唤醒时间为20秒钟,代码如下:

(3)进入休眠模式;

(4)唤醒后重新初始化外设;

4. 详细代码如下:

(1) ALARM中断使能禁止函数:

void Mcu_RtcAlarmEnable(uint8_t En)
{
RTC_EnableAlarm(RTC_A_ALARM, En);
RTC_ConfigInt(RTC_INT_ALRA, En);
}

(2)重新设置时间:

static ErrorStatus Mcu_RtcTimeSet(void)
{
RTC_TimeType RTC_TimeStructure;
RTC_TimeType RTC_TimeRead = {0};

RTC_TimeStructure.H12 = RTC_AM_H12;
RTC_TimeStructure.Hours = 0;
RTC_TimeStructure.Minutes = 0;
RTC_TimeStructure.Seconds = 0;

if (RTC_ConfigTime(RTC_FORMAT_BIN, &RTC_TimeStructure) == ERROR)
{
return ERROR;
}
else
{
RTC_GetTime(RTC_FORMAT_BIN, &RTC_TimeRead);
return SUCCESS;
}
}

(3)设置告警间隔时间,单位为秒:

void Mcu_RtcSetAlarm(uint32_t AlarmTime)
{
RTC_AlarmType RTC_AlarmStructure;
RTC_AlarmType RTC_AlarmRead = {0};

Mcu_RtcTimeSet();

RTC_EnableAlarm(RTC_A_ALARM, DISABLE);

RTC_AlarmStructure.AlarmTime.H12 = RTC_AM_H12;
RTC_AlarmStructure.AlarmTime.Hours = 0;
RTC_AlarmStructure.AlarmTime.Minutes = 0;
RTC_AlarmStructure.AlarmTime.Seconds = AlarmTime;

RTC_AlarmStructure.DateWeekValue = 31;
RTC_AlarmStructure.DateWeekMode = RTC_ALARM_SEL_WEEKDAY_DATE;
RTC_AlarmStructure.AlarmMask = RTC_ALARMMASK_WEEKDAY | RTC_ALARMMASK_HOURS | RTC_ALARMMASK_MINUTES;
RTC_SetAlarm(RTC_FORMAT_BIN, RTC_A_ALARM, &RTC_AlarmStructure);

RTC_GetAlarm(RTC_FORMAT_BIN, RTC_A_ALARM, &RTC_AlarmRead);

RTC_ClrIntPendingBit(RTC_INT_ALRA);
EXTI_ClrITPendBit(EXTI_LINE17);

}

(4)休眠前RTC唤醒时间配置,如配置20秒唤醒:

Rtc_AlarmEnable(DISABLE);
Rtc_SetAlarm(20);
Rtc_AlarmEnable(ENABLE);

(5)进入休眠模式:

STOP2模式如下:

RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_PWR, DISABLE); //禁止PWR时钟
SetSysClockToHSI(); //配置为内部时钟
PWR_EnterSTOP2Mode(PWR_STOPENTRY_WFI); //进入STOP2模式
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_PWR, ENABLE); //开启PWR时钟

SYSCLKConfig_STOP(RCC_CFG_PLLMULFCT18); //重新配置时钟,18倍频,144M

STOP0模式如下:

SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);

PWR_EnterSLEEPMode(0, PWR_STOPENTRY_WFI);

SysTick->CTRL |= (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);

SYSCLKConfig_STOP(RCC_CFG_PLLMULFCT18); //重新配置时钟,18倍频,144M

http://www.jsqmd.com/news/856325/

相关文章:

  • 用 Excel 手动实现 MLP 前向传播 + 反向传播(完整版)
  • 【设计模式 10】抽象工厂:整体换季
  • Prompt基础与AI产品管理方法论 — 深度解析与实操设计 - hlc
  • 从0到1:企业级AI项目迭代日记 Vol.29|自然语言变工作流:Agent 自动拼装子图的实现路径
  • 免费远控软件良心度横评:ToDesk免费版到底有多能打?
  • 别再手动调阈值了!OpenMV自适应色块识别保姆级教程(附完整Python代码)
  • STM32F103 平行替代方案全面分析(2026 年最新)
  • 2025-2026年优优推电话查询:网络推广前请核实服务范围与收费模式 - 品牌推荐
  • B站视频下载解决方案:基于多API调用的无水印视频获取系统
  • 水质在线监测系统嵌入式工控机选型与实战指南
  • 2025-2026年山东谦和金属制品有限公司电话查询:联系前请核实产品规格与资质 - 品牌推荐
  • React 还是 Vue:2026 年,这个问题问错了
  • 大厂Java面试实战:Spring Boot微服务、Redis缓存、Kafka消息队列与Spring AI RAG
  • Linux运维:Jenkins部署
  • 汽车质量管理体系的核心要素与持续改进之道
  • Gemini 3.5 Flash 完整介绍:定价、性能、接入教程与选型建议
  • ABAQUS模态分析中的‘隐形’设置:材料阻尼、约束与接触,这些细节才是结果不准的元凶
  • 高频高速PCB板材选型:从参数本质到工程落地的专业指南
  • 嵌入式Linux下MT7601U无线网卡驱动移植与网络配置实战
  • 背单词为什么不背词典:CANN上FlashAttention的分块逻辑
  • Hyperf 高并发的庖丁解牛
  • 百考通AI搭起学术研究的“起跑线”
  • STM32/Delay延时函数编程思路
  • 别再死记硬背了!用一张图帮你理清CPU里的MMU、TLB和Cache到底是怎么分工的
  • 不知道怎么挖漏洞?吐血整理40个网络安全漏洞挖掘姿势,看完不信你还挖不到
  • 离线绘图新选择:draw.io桌面版,让敏感数据不再“上网”
  • 音乐学者紧急预警:Perplexity搜索结果偏差率高达47%?3步校验法立即挽救你的学术引用
  • 初识C语言(一)
  • 2026年5月国内优质招标网推荐:五大平台排名专业评测项目找标防遗漏 - 品牌推荐
  • 原生PHP如何才能提高并发?