news 2026/5/23 18:02:11

征程 6 | power management sample

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
征程 6 | power management sample

1. 功能概述

本文通过示例演示如何通过相关接口对启动标志进行读写,以及对 main 域电源进行控制与查询。相关 API 定义,请查询 电源管理用户手册 API 部分 。

2. main 域上下电及状态查询示例代码

请参考版本中 Service/Cmd_Utility/power_sample_cmd/src/PowerControl.c 相关代码:

// PowerControl.c代码 #include "Os.h" #include "Log.h" #include "Pmu.h" #include "Boot.h" #include "Shell_Port.h" // main域电源状态定义 #define MAINDOMAIN_STATUS_UNINIT (0U) #define MAINDOMAIN_STATUS_RUNNING (1U)

注意

注意以下章节中的截图,在不同的版本上可能会有一些差异,只要关键信息部分一致即可。 请结合其中提到的验证方法做进一步确认。

2.1. MCU 对 Acore 进行上下电接口及命令说明

// 需要包含的头文件 #include "Power_Manager_Cust.h" // 通知Acore进行下电 hb_PM_RequestSt(MAINSTATE_OFF_ST); // 对Acore进行强制下电 hb_PM_RequestSt(MAINSTATE_FORCE_OFF_IT); // 对Acore进行上电

地平线版本中可使用如下命令:

testmainpower 0 # 通知Acore下电,同时会做bootflag和power状态查询 testmainpower forceoff # 对Acore强制下电 testmainpower 1 # 对Acore上电,同时会做bootflag和power状态查询

效果确认:

  1. 当对 Acore 进行下电,MCU 会有如下打印:

此时 MCU 正常,Acore 因为下电串口无法交互;

  1. 当对 Acore 进行强制下电,MCU 会有如下打印:

此时 MCU 正常,Acore 因为下电串口无法交互;

  1. 当对 Acore 进行上电,MCU 会有很长的打印,MCU 走完相关流程后,会有如下关键打印:

同时 Acore 会进入 kernel:

并可以正常进行命令行交互;

2.2. MCU 读写 bootflag 接口及命令说明

// 需要包含的头文件 #include "Boot.h" // 设置bootflag Std_ReturnType Bl_MainDomainBootFlagSet(uint32 Flag); // 获取bootflag Std_ReturnType Bl_MainDomainBootFlagGet(uint32 *Flag);

地平线版本中可使用如下命令:

testmainpower 0 # 对Acore下电,同时会做bootflag和power状态查询 testmainpower 1 # 对Acore上电,同时会做bootflag和power状态查询

效果确认:

示例代码中会尝试对 bootflag 进行读取/修改/恢复的流程;后边的数值代表对应 boot 标志,可以查询相关头文件。

2.3. MCU 获取 Acore power 状态接口及命令说明

// 需要包含的头文件 #include "Pmu.h" // 获取main power状态 Std_ReturnType Pmu_MainDomainStatusGet(uint32 *Status);

地平线版本中可使用如下命令:

getmainstatus # main power状态查询

效果确认:

示例代码中尝试去获取状态并打印出对应通过函数获取到的 Acore power 状态。

3. main 域 reset 示例

调用如下接口后,如果有接 Acore 串口,可以看到 Acore 串口有重启并再次正常进入 kernel,并且 Acore 的命令行可以进行正常交互。

3.1. main 域 reset 接口说明

// 需要包含的头文件 #include "Power_Manager_Cust.h" hb_PM_RequestSt(MAINSTATE_RESET_IT);

4. 征程 6X 全部下电示例

调用对应接口,MCU 和 Acore 都下电,两者的命令行都无法进行交互。要想重新启动,需要断电重启。

4.1. 全部下电接口说明

// 需要包含的头文件 #include "Power_Manager_Cust.h" hb_PM_RequestSt(SYSSTATE_SHUTDOWN_ST);

5. 不同场景休眠唤醒示例代码

请参考版本中 Service/Cmd_Utility/power_sample_cmd/src/PowerControl.c 相关代码,目前主要实现以下六个场景:

horizon:/$ powersample [0512.790449 0]powersample {index:d} rtc_time:d> [0512.790824 0] index: 0: main suspend + mcu suspend + rtc wakeup + shutdown [0512.791703 0] 1: main off + mcu suspend + rtc wakeup + shutdown [0512.792538 0] 2: main suspend + mcu suspend + can wakeup + resume [0512.793395 0] 3: main off + mcu suspend + can wakeup + poweron [0512.794337 0] 4: main suspend + mcu suspend + rtc wakeup + resume [0512.795077 0] 5: main off + mcu suspend + rtc wakeup + poweron

注意:各 sample 场景为都是单独流程,不要混合使用。如果在执行完一个 sample 场景后,需要更换场景测试,需要先进行整机下电,再重新上电。

场景拆分为以下几种流程:

流程 1: main off + mcu suspend:

流程 2:main suspend + mcu suspend:

流程 3:mcu on + main on:

流程 4:mcu on + main resume:

流程 5:rtc wakeup + shutdown:

在 rtc 唤醒场景中 - 如果需要 rtc 唤醒后直接关机,需要外部 kl15 信号源为低电平,否则会导致唤醒后一级电源无法正常下电

5.1. sample0

//sample0: main suspend + mcu suspend + rtc wakeup + shutdown // 设置rtc唤醒时间 Ret = SysPower_RtcWakeupSet(RtcWakeupTime); if (Ret != E_OK) { LogNotice("set rtc wakeup failed with %d\r\n", Ret); return -1; }

5.2. sample1

//main off + mcu suspend + rtc wakeup + shutdown /** acore scmi just control acore */ scmi_reset_mode = 1; // 通知acore进入下电 Ret = hb_PM_RequestSt(MAINSTATE_OFF_ST); if (Ret != E_OK) { LogNotice("notify shutdown failed with %d\r\n", Ret);

5.3. sample2

//main suspend + mcu suspend + can wakeup + resume //设置一个较大的rtc唤醒时间,以防止rtc误唤醒 Ret = SysPower_RtcWakeupSet(8388); if (E_OK != Ret) { LogNotice("SysPower_RtcWakeupSet failed with %d.\r\n", Ret); return -1; } //TJA1145进入低功耗模式相关配置 Ret = TJA1145_EnterLowPowerMode(1);

5.4. sample3

//3: main off + mcu suspend + can wakeup + poweron /** acore scmi just control acore */ scmi_reset_mode = 1; // 通知acore进入下电 Ret = hb_PM_RequestSt(MAINSTATE_OFF_ST); if (Ret != E_OK) { LogNotice("notify shutdown failed with %d\r\n", Ret); return -1;

5.5. sample4

//main suspend + mcu suspend + rtc wakeup + resume //设置一个rtc唤醒时间 Ret = SysPower_RtcWakeupSet(RtcWakeupTime); if (Ret != E_OK) { LogNotice("set rtc wakeup failed with %d\r\n", Ret); return -1; } // 通知acore开始休眠流程 Ret = hb_PM_RequestSt(MAINSTATE_SLEEP_ST);

5.6. sample5

//main off + mcu suspend + rtc wakeup + poweron /** acore scmi just control acore */ scmi_reset_mode = 1; // 通知acore进入下电 Ret = hb_PM_RequestSt(MAINSTATE_OFF_ST); if (Ret != E_OK) { LogNotice("notify shutdown failed with %d\r\n", Ret); return -1;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 17:32:07

网安公司,亏麻了!

又到一年一度的“网安比惨季”。每年这个时候,上市公司一发业绩预告,朋友圈就像开了弹幕:“亏得真稳定”、“一年更比一年凉”、“这行业还有救吗?”我把2025年的成绩单摊开一看,好家伙——这哪是财报,分明…

作者头像 李华
网站建设 2026/5/23 18:01:42

晋升名单其实早就在答辩前定好了?答辩只是走个过场

刚看到个贴子,楼主说自己为了晋升,熬夜做了20页PPT,把一年成绩吹到天上去。结果评委只问了一句:你在项目里的不可替代性是什么?更扎心的是,后来才知道晋升名单早就定好了,答辩纯属走流程。我的看…

作者头像 李华
网站建设 2026/5/20 21:56:15

iPhone17大热,网传有国产手机品牌的旗舰手机最高跌超三成

由于苹果的iPhone17卖得实在太好,一些国产手机品牌总是喜欢对标iPhone17,眼见着在整体销量方面落后太多,于是他们不断缩短时间周期,例如从季度缩短到月份,甚至会时不时拿周销量来证明自己并未必iPhone17差太多&#xf…

作者头像 李华
网站建设 2026/5/18 21:26:01

CANN hixl 在单机多卡场景下的 PCIe 带宽优化策略

相关链接: CANN 组织主页:https://atomgit.com/cannhixl 仓库地址:https://atomgit.com/cann/hixl 前言 在单机多设备(Multi-Device)AI 训练与推理系统中,设备间的数据交换常通过 PCIe 总线完成。然而&am…

作者头像 李华
网站建设 2026/5/23 7:42:44

SemaphoreCountDownlatchCyclicBarrier源码分析

一、CountDownLatch:闭锁机制 1.1 基本原理与核心逻辑 CountDownLatch 让一个或多个线程等待其他线程执行完成后再执行。在创建 CountDownLatch 对象时,必须指定线程数 count,每当一个线程执行完成调用 countDown()方法,线程数 co…

作者头像 李华
网站建设 2026/5/15 8:49:23

5分钟部署Whisper语音识别:零基础搭建多语言转录服务

5分钟部署Whisper语音识别:零基础搭建多语言转录服务 引言:语音识别原来这么简单 你有没有遇到过这样的场景?会议录音需要整理成文字,外语视频需要翻译字幕,或者想给音频内容添加文字说明。传统方法要么手动打字费时…

作者头像 李华