This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我在调试板子时,发现PowerClock_init()函数过不去,跟踪发现,是DMASS0的DMASS0_SEC_PROXY_0_STATUS寄存器的CUR_CNT,在Sciclient_sendMessage()发送消息后,无法计数置1。请问,什么情况下,Sciclient_sendMessage()发送消息,可以使DMASS0的DMASS0_SEC_PROXY_0_STATUS寄存器的CUR_CNT,可以收到计数,并置1???DMASS0应该如何设置???
Sciclient_sendMessage() 是一个低级别的 Sciclient 内部函数,从多个 Sciclient 函数调用,这些函数从 PowerClock_init() 调用。我收集到对 Sciclient_sendMessage() 的调用(用于将 DMASS0_SEC_PROXY_0_STATUS:CUR_CNT 设置为 1)在 PowerClock_init() 的某处被调用,请问它具体在哪里被调用?
您是否在 LP 和您的定制板上使用了相同的启动方法(boot method)?
都是同一个工程,代码一模一样,PowerClock_init()>>>Module_clockEnable()>>>SOC_moduleClockEnable()>>>...>>>Sciclient_sendMessage()
好的,我了解到您正在使用 CCS/JTAG 进行调试。
您是否使用 SBL NULL(从 OSPI 或 SD 卡启动)或 CCS 脚本进行 SOC 初始化?
SOC初始化方法介绍如下:
调试时,LP 和自定义硬件平台上的启动(boot)模式引脚设置是否相同呢?
两个板子都设置成一样的启动模式,主启动QSPI,第二启动NONE,LP-AM243上时可以正常正确调试的,自己做的板子,用XDS110或XDS200就不行
另外,你说的SBL NULL,是只在串口模式启动吧?这个模式,也是相同结果。
还有,用tools/ccs_load/am243x/load_dmsc.js初始化后,再加载app,也是一样
PowerClock_init()>>>Module_clockEnable()>>>SOC_moduleClockEnable()>>>...>>>Sciclient_sendMessage()
当您在自定义硬件板上观察到异常行为时,Sciclient()(或其他)API 函数是否返回任何类型的故障?
异常行为是否导致应用程序在 PowerClock_init() 期间失败,或者应用程序是否继续通过 PowerClock_init() 并且稍后发生新的故障?
发生该异常行为时您正在启用哪个模块时钟呢?您可以找到 gSocModules[] 数组中的索引(变量 i)的值,然后检查 ti_power_clock_config.c.c 中的 gSocModules[] 数组,从而确定这一点。
两个板子都设置成一样的启动模式,主启动QSPI,第二启动NONE
抱歉,我不太理解,一般一次只能选择一种启动模式。
两块板通常都设置为 QSPI 启动(即 SBL 和应用程序在 QSPI 闪存中)。
您什么时候使用NONE作为第二启动?是当通过 JTAG 调试时吗?或者您说第二启动NONE是不是指没有用二次bootloader (secondary bootloader)?
自己做的板子,用XDS110或XDS200就不行
它们是运行不正常(可能是由于某些 JTAG 硬件信号问题),还是完全无法运行呢?
说的SBL NULL,是只在串口模式启动吧?
关于这个问题,我要进一步询问TI工程师。
有关bootflow和bootloader的更多详细信息,请参见此处:https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/08_04_00_17/exports/docs/api_guide_am243x/BOOTFLOW_GUIDE.html
SBL NULL 详细信息可参阅此链接:https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/08_04_00_17/exports/docs/api_guide_am243x/BOOTFLOW_GUIDE.html#autotoc_md263
用tools/ccs_load/am243x/load_dmsc.js初始化后,再加载app,也是一样
在设置为 NO BOOT 并使用 CCS 脚本的自定义硬件板上,您是在加载和执行程序后发现问题的吗?
为保证准确性,我有一点想和您确认一下,因为 CCS 脚本方法需要 JTAG 连接,如果 JTAG (XDS110/XDS200) 无法在您的定制板上工作,CCS 脚本是如何在您的定制硬件板上工作的?
请在此处查看有关NO BOOT引脚设置的详细信息:NO BOOT: https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/08_04_00_17/exports/docs/api_guide_am243x/EVM_SETUP_PAGE.html#BOOTMODE_NOBOOT
第二启动NONE,就是没有设置Backup Boot。
XDS110或XDS200是可以连接调试MCU的,只是自己板子在PowerClock_init()函数处,无法通过。
SOC_moduleClockEnable()在使能任何模块,比如UART等都会无法通过,进入Sciclient_waitForMessage(),死循环。
昨天我把SBL重新烧了一次,感觉又可以了,请问是什么原因?是不是可能SBL损坏,DMSC检测不到正确的SBL,直接关闭了所有模块?
关于SBL NULL的描述可参阅:https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/08_04_00_17/exports/docs/api_guide_am243x/BOOTFLOW_GUIDE.html#autotoc_md263
SBL NULL 通常flash到 OSPI 或 SD,然后从这些非易失性内存源之一启动。
这是工程师昨天给您的回复,您的最新疑问已经为您转达给了工程师。
感谢您的反馈。
我目前的理解是:
1. LP 和您的硬件板的启动方法(boot method)都是 SBL OSPI。自定义硬件板无法正确执行应用程序,但具体原因尚不清楚。
2. 为了调试该问题,电路板被置于 NO BOOT 模式并且 CCS 脚本用于 SOC 初始化。
1) LP:没有观察到挂起。
2) 自定义板:应用程序在 PowerClock_init() 中挂起。
3. 在自定义硬件板上刷新 SBL OSPI 后,不再观察到启动(boot)失败。
您是否在使用 SBL OSPI 时尝试调试自定义硬件板上的故障?
操作方法:
1) 在 System_init() 之前的应用程序启动时添加自旋锁。有关示例,请参见 <SDK>\examples\drivers\boot\sbl_ospi\am243x-lp\r5fss0-0_nortos\main.c
2) 重建/刷新应用程序。
3) 启动后,在 CCS 中启动目标。
4) 不使用“目标连接”GEL 功能连接到 R5F0_0。
5) 从 .out 文件加载符号。
6) 禁用自旋锁以允许应用程序继续。
7) 逐步执行 PowerClock_init() 以查看是否发生挂起。
昨天我把SBL重新烧了一次,感觉又可以了,请问是什么原因?是不是可能SBL损坏,DMSC检测不到正确的SBL,直接关闭了所有模块?
我无法确定是否一定是这样,需要跟您确认一下。
您是否使用了 Uniflash(UART 或 JTAG)? https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/08_04_00_17/exports/docs/api_guide_am243x/TOOLS_FLASH.html
最初在自定义硬件板上刷写 SBL/应用程序时,您在刷写过程中是否观察到任何错误?
如果您反复刷机,能否重现同样的开机错误?
我加了自旋锁,结果还是一样,请问加自旋锁,目的是什么???
status = Spinlock_lock(CSL_SPINLOCK0_BASE,3);
...
Spinlock_unlock(CSL_SPINLOCK0_BASE,3);
/* call this API to stop the booting process and spin, do that you can connect * debugger, load symbols and then make the 'loop' variable as 0 to continue execution * with debugger connected. */ void loop_forever() { volatile uint32_t loop = 1; while(loop) ; }
如果您反复刷机,能否重现同样的开机错误
方法是添加一个软件自旋锁,而不是硬件自旋锁。请参阅 <SDK>\examples\drivers\boot\sbl_ospi\am243x-evm\r5fss0-0_nortos\main.c 示例:
/* call this API to stop the booting process and spin, do that you can connect * debugger, load symbols and then make the 'loop' variable as 0 to continue execution * with debugger connected. */ void loop_forever() { volatile uint32_t loop = 1; while(loop) ; }
这种类型的旋转可以添加到应用程序中。应用程序启动后,您可以使用 JTAG 连接到内核、加载符号、设置 loop=0 并单步执行 PowerClock_init()。
需要确认您在bootload时与使用 NO BOOT 模式并从 JTAG 加载应用程序时看到相同的故障。
想问一下,如果您反复刷机,能否重现同样的boot错误?
软件自旋锁,是不是说,循环等待DMSC在后台准备好设备吗?还是什么目的?我这边现象是,只要flash里面固化了SBL,程序就可以正常执行 PowerClock_init(),否则就在PowerClock_init()内部等待死循环。
我看SDK源码,里面的SCI接口函数,应该是DMSC完全控制MCU外设,APP必须要和DMSC通讯,才能使能外设模块。同时,DMSC在QSPI启动模式时,一定要检查Flash中是否有完整的SBL,如果没有,相关外设就禁用了,不知我理解是否正确?
另外,DMSC相当于PC机里面的BIOS,管理外设,但很难用,能否禁止DMSC功能,在Flash全空(0xFF)情况下,让用户自己的SBL或APP完全控制外设的使能和禁止?
软件自旋锁,是不是说,循环等待DMSC在后台准备好设备吗?还是什么目的?
目的是证明在 SBL 完成后,应用程序代码在 PowerClock_init() 中失败。我认为当使用 CCS 脚本进行 SOC 初始化时,您的硬件上也发生了应用程序故障。
我将总结我目前对情况的理解,能否请您确认我的总结是否正确?
Uniflash 用于将 OPSI SBL、SYSFW 和应用程序写入flash。
LP 和客户 HW 板的boot method都是 SBL OSPI。
如果板被放置在 NO BOOT 模式下并且 CCS 脚本用于 SOC 初始化:
这意味着该问题仅在自定义硬件上的 OSPI 引导时出现。
在自定义硬件板上刷新 SBL OSPI 后,不再观察到启动故障。
我这边现象是,只要flash里面固化了SBL,程序就可以正常执行 PowerClock_init(),否则就在PowerClock_init()内部等待死循环。
好的,所以这个问题与 Uniflash 有关,与 SBL、SYSFW、PowerClock_init() 或 DMASS 无关,请问这样理解对吗?对于失败案例,Uniflash 在flash过程中是否报告任何错误呢?