You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在STM32MP157A-DK1非安全上下文启用并读取STGEN

STM32MP157A-DK1双核时间同步:启用STGEN并实现A7/M4读写计数器

背景

基于Yocto构建core-image-minimal镜像(非OpenST发行版)的STM32MP157A-DK1开发板,需构建Cortex-A7与Cortex-M4的时间同步系统,计划通过读取STGEN系统计数器的软件时间戳实现双核时间一致,核心需求是让A7和M4都能正常读取STGEN计数器值。

当前问题

M4端读取STGENR(非安全上下文只读寄存器)时始终返回0,调试代码持续触发错误上报。

M4读取STGEN的代码

#include "stgen_read.h"
#include "openamp.h"

#define STGENR_BASE_ADDR 0x5A005000UL
#define STGENR_CNTCVL_OFFSET 0x000
#define STGENR_CNTCVU_OFFSET 0x004

#define STGENR_CNTCVL_REG (*(volatile uint32_t *) (STGENR_BASE_ADDR + STGENR_CNTCVL_OFFSET))
#define STGENR_CNTCVU_REG (*(volatile uint32_t *) (STGENR_BASE_ADDR + STGENR_CNTCVU_OFFSET))

// Debug purpose
extern struct rpmsg_endpoint ept;

uint64_t stgen_get_counter() {
    uint32_t low, high, high_comp;

    do {
        high = STGENR_CNTCVU_REG;
        low = STGENR_CNTCVL_REG;
        high_comp = STGENR_CNTCVU_REG;
    } while (high != high_comp);

    // temporary debug purpose
    if (low == 0 || high == 0)
    {
        stgen_packet packet;
        packet.type = 0xBB;    // This means error packet
        packet.data = 1;
        rpmsg_trysend(&ept, &packet, sizeof(packet));
    }
    // end of debug

    return ((uint64_t)high << 32) | low;
}

尝试过的方案及问题

1. 修改TF-A设备树ETZPC权限

怀疑M4无外设访问权限,尝试将STGENC(安全上下文读写寄存器)的ETZPC访问模式从安全改为非安全:

-       DECPROT(STM32MP1_ETZPC_STGENC_ID, DECPROT_S_RW, DECPROT_LOCK)
+       DECPROT(STM32MP1_ETZPC_STGENC_ID, DECPROT_NS_RW, DECPROT_LOCK)

修改后系统启动触发PANIC,日志如下:

INFO:    BL2: Loading image id 16
INFO:    Loading image id=16 at address 0x2ffc0000
INFO:    Image id=16 loaded: 0x2ffc0000 - 0x2ffc45e2
INFO:    BL2: Loading image id 5
INFO:    Loading image id=5 at address 0xc0100000
INFO:    Image id=5 loaded: 0xc0100000 - 0xc01eced0
NOTICE:  BL2: Booting BL32
INFO:    Entry point address = 0x2ffc5000
INFO:    SPSR = 0x1d3
PANIC at PC : 0x2ffca91b

Exception mode=0x00000016 at: 0x2ffca91b

注:修改的是STGENC而非目标的STGENR,推测这是崩溃原因,但仍需验证是否是安全访问限制导致STGENR无法读取。

2. 内核设备树添加STGEN节点

在内核设备树中添加自定义STGEN节点:

stgen: stgen@5a005000 {
        compatible = "st,stgen", "syscon";
        reg = <0x5a005000 0x1000>;
        clocks = <&rcc STGEN_K>, <&rcc PCLK5>, <&rcc PCLK4>;
        status = "okay";
    };

系统可正常启动,但M4读取STGENR计数器仍始终返回0。

核心目标

  • 启用STGEN计数器功能
  • 实现Cortex-M4与Cortex-A7均可读取STGEN计数器值

内容的提问来源于stack exchange,提问作者dzziq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:12:24