• TDA4VM/VH 单核软复位原理与实现实现


    说明

    由于 TI 的 RTOS SDK 没有提供单核复位的代码,经过仔细阅读 TDA4VM 芯片技术参考手册,发现可以通过触发 Local Reset 实现单核软复位。

    结论

    该方法已验证,可以复位 MAIN 域的 A 核与 R 核,以及 MCU 域的 R5F1_1( mcu_r5f1_0 需要按照 SBL 启动 app 的方式实现复位,DSP 核未测试)

    原理

    在 TDA4VM TRM 的第 5.2.2.2.1.4.3 章节,Local Reset 用于复位芯片上的某一单独模块,而不复位整个芯片。
    同时该章节说明了 Local Reset 的触发方式,Local Reset 通过 WKUP_PSC0/PSC0 寄存器组触发:

    1. Set WKUP_PSC0_MDCTL_y[8] LRST or PSC0_MDCTL_y[8] LRST to 0x0 to assert local reset.
    2. Set WKUP_PSC0_MDCTL_y[8] LRST or PSC0_MDCTL_y[8] LRST to 0x1 to de-assert local reset

    y 对应于模块的 LPSC 索引,具体模块索引值请查看 TRM。

    TDA4VH 单核软复位部分代码实现

    首先分别列出R核与 A 核对应的 WKUP_PSC0_MDCTL / PSC0_MDCTL 寄存器地址数组:

    /* A/R 核所对应的 wkup_psc0_mdctl/psc0_mdctl 寄存器地址  */
    static uint32_t g_uiPSC0_MDCTL_Addr[] = 
    {
        0x400A00   + (80 * 4),      /* MPU1_0 */
        0x400A00   + (81 * 4),      /* MPU1_1 */
        0x400A00   + (108 * 4),     /* MPU1_2 */
        0x400A00   + (109 * 4),     /* MPU1_3 */
        0x400A00   + (84 * 4),      /* MPU2_0 */
        0x400A00   + (85 * 4),      /* MPU2_1 */
        0x400A00   + (110 * 4),     /* MPU2_2 */
        0x400A00   + (111 * 4),     /* MPU2_3 */
        0x42000A00 + (19 * 4),      /* MCU1_0 */
        0x42000A00 + (20 * 4),      /* MCU1_1 */
        0x400A00   + (93 * 4),      /* MCU2_0 */
        0x400A00   + (94 * 4),      /* MCU2_1 */
        0x400A00   + (96 * 4),      /* MCU3_0 */
        0x400A00   + (97 * 4),      /* MCU3_1 */
        0x400A00   + (122 * 4),     /* MCU4_0 */
        0x400A00   + (123 * 4),     /* MCU4_1 */
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    然后按照 Local Reset 触发方式,触发 Local Reset:

        /* 根据 uiCoreId 获取复位触发寄存器地址 */
        uiBaseaddr = g_uiPSC0_MDCTL_Addr[uiCoreId];
    
        /* 触发 Loacl reset */
        uiVal  = readw(uiBaseaddr);
        uiVal &= ~(LRSTZ_MASK << LRSTZ_POS);
        writew(uiVal, uiBaseaddr);
    
        uiVal  = readw(uiBaseaddr);
        uiVal |= (LRSTZ_MASK << LRSTZ_POS);
        writew(uiVal, uiBaseaddr);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    美团2024届秋招笔试第一场编程【代码】
    SpringMVC(进阶版)
    昔日红极一时,如今重出江湖,这种按键位要怎么设计
    云原生与低代码:重塑软件开发新生态
    [点云分割] 基于颜色的区域增长分割
    深度学习入门(三十八)计算性能——多GPU训练
    SQL的注入对于安全测试的重要性~
    nginx解决vue跨域图片问题
    H5页面内嵌到微信小程序和APP,做分享操作
    MERLIN-AToolfor Multi-party Privacy-preserving Record Linkage论文总结
  • 原文地址:https://blog.csdn.net/qq_42711537/article/details/133159046