Part Number:AM2434Other Parts Discussed in Thread:LP-AM243, UNIFLASH
我在调试板子时,发现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应该如何设置???
li ljch:
同样程序,在LP-AM243上就没问题,用在自己板子上,Sciclient_sendMessage()发送消息,DMASS0的DMASS0_SEC_PROXY_0_STATUS寄存器的CUR_CNT,计数就不能增加,DMASS0这部分,应该完全和MCU外部设计硬件无关,同样程序不应该出现这样的问题,估计和仿真调试接口及仿真器识别通讯有关,请专家帮忙看看原因。。。
,
Katherine Wang:
感谢您对TI产品的关注!已为您咨询TI资深工程师,一旦得到回复会立即回复给您。
,
li ljch:
好的,谢谢
,
Katherine Wang:
Sciclient_sendMessage() 是一个低级别的 Sciclient 内部函数,从多个 Sciclient 函数调用,这些函数从 PowerClock_init() 调用。我收集到对 Sciclient_sendMessage() 的调用(用于将 DMASS0_SEC_PROXY_0_STATUS:CUR_CNT 设置为 1)在 PowerClock_init() 的某处被调用,请问它具体在哪里被调用?
您是否在 LP 和您的定制板上使用了相同的启动方法(boot method)?
,
li ljch:
都是同一个工程,代码一模一样,PowerClock_init()>>>Module_clockEnable()>>>SOC_moduleClockEnable()>>>…>>>Sciclient_sendMessage()
,
Katherine Wang:
请问您在 LP 和您的定制板上用的是相同的启动方法(boot method)吗?
,
li ljch:
是的,设置的都是QSPI,我现在的问题,是在用CCS.12.10+XDS110或XDS200调试过程中出来的
,
Katherine Wang:
好的,我了解到您正在使用 CCS/JTAG 进行调试。
您是否使用 SBL NULL(从 OSPI 或 SD 卡启动)或 CCS 脚本进行 SOC 初始化?
SOC初始化方法介绍如下:
SBL NULL (OSPI): https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/08_04_00_17/exports/docs/api_guide_am243x/EVM_SETUP_PAGE.html#EVM_FLASH_SOC_INIT
SBL NULL (SD boot): https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/08_04_00_17/exports/docs/api_guide_am243x/EVM_SETUP_PAGE.html#EVM_SOC_INIT_SD_BOOT_MODE
CCS scripts: https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/08_04_00_17/exports/docs/api_guide_am243x/EVM_SETUP_PAGE.html#EVM_SOC_INIT_NOBOOT_MODE调试时,LP 和自定义硬件平台上的启动(boot)模式引脚设置是否相同呢?
,
li ljch:
两个板子都设置成一样的启动模式,主启动QSPI,第二启动NONE,LP-AM243上时可以正常正确调试的,自己做的板子,用XDS110或XDS200就不行
另外,你说的SBL NULL,是只在串口模式启动吧?这个模式,也是相同结果。
还有,用tools/ccs_load/am243x/load_dmsc.js初始化后,再加载app,也是一样
,
li ljch:
感觉上,是不是和ARM内核调试系统有关系,可以问问专家查一查
,
Katherine Wang:
li ljch 说:PowerClock_init()>>>Module_clockEnable()>>>SOC_moduleClockEnable()>>>…>>>Sciclient_sendMessage()
当您在自定义硬件板上观察到异常行为时,Sciclient()(或其他)API 函数是否返回任何类型的故障?
异常行为是否导致应用程序在 PowerClock_init() 期间失败,或者应用程序是否继续通过 PowerClock_init() 并且稍后发生新的故障?
发生该异常行为时您正在启用哪个模块时钟呢?您可以找到 gSocModules[] 数组中的索引(变量 i)的值,然后检查 ti_power_clock_config.c.c 中的 gSocModules[] 数组,从而确定这一点。
li ljch 说:两个板子都设置成一样的启动模式,主启动QSPI,第二启动NONE
抱歉,我不太理解,一般一次只能选择一种启动模式。
两块板通常都设置为 QSPI 启动(即 SBL 和应用程序在 QSPI 闪存中)。
您什么时候使用NONE作为第二启动?是当通过 JTAG 调试时吗?或者您说第二启动NONE是不是指没有用二次bootloader (secondary bootloader)?
li ljch 说:自己做的板子,用XDS110或XDS200就不行
它们是运行不正常(可能是由于某些 JTAG 硬件信号问题),还是完全无法运行呢?
li ljch 说:说的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
li ljch 说:用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
,
li ljch:
第二启动NONE,就是没有设置Backup Boot。
XDS110或XDS200是可以连接调试MCU的,只是自己板子在PowerClock_init()函数处,无法通过。
SOC_moduleClockEnable()在使能任何模块,比如UART等都会无法通过,进入Sciclient_waitForMessage(),死循环。
昨天我把SBL重新烧了一次,感觉又可以了,请问是什么原因?是不是可能SBL损坏,DMSC检测不到正确的SBL,直接关闭了所有模块?
,
Katherine Wang:
关于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,然后从这些非易失性内存源之一启动。
这是工程师昨天给您的回复,您的最新疑问已经为您转达给了工程师。
,
li ljch:
好的,我看看,谢谢
,
Katherine Wang:
感谢您的反馈。
我目前的理解是:
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.c2) 重建/刷新应用程序。3) 启动后,在 CCS 中启动目标。4) 不使用“目标连接”GEL 功能连接到 R5F0_0。5) 从 .out 文件加载符号。6) 禁用自旋锁以允许应用程序继续。7) 逐步执行 PowerClock_init() 以查看是否发生挂起。
li ljch 说:昨天我把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/应用程序时,您在刷写过程中是否观察到任何错误?
如果您反复刷机,能否重现同样的开机错误?
,
li ljch:
我加了自旋锁,结果还是一样,请问加自旋锁,目的是什么???
status = Spinlock_lock(CSL_SPINLOCK0_BASE,3);
…
Spinlock_unlock(CSL_SPINLOCK0_BASE,3);
,
Katherine Wang:
已为您询问TI工程师,稍后会给您回复
,
li ljch:
好的,谢谢
,
Katherine Wang:
解决办法是添加一个软件自旋锁,而不是硬件自旋锁。请参阅 <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 加载应用程序时看到相同的故障。
Katherine Wang 说:如果您反复刷机,能否重现同样的开机错误
如果您反复刷机,能否重现同样的开机错误?
,
li ljch:
你的回复,怎么看不到呢
,
Katherine Wang:
方法是添加一个软件自旋锁,而不是硬件自旋锁。请参阅 <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错误?
,
li ljch:
软件自旋锁,是不是说,循环等待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完全控制外设的使能和禁止?
,
Katherine Wang:
已将您的疑问转达至TI工程师,您也可以访问(3) AM2434: Problems regarding how to use DMASS0 – Arm-based microcontrollers forum – Arm-based microcontrollers – TI E2E support forums了解最新进展
,
li ljch:
好的,谢谢
,
li ljch:
没有回应呢?
,
Katherine Wang:
实在抱歉,因为E2E英文论坛工程师正处在圣诞假期中,所以要到1月3号以后才能回复
,
Katherine Wang:
li ljch 说:软件自旋锁,是不是说,循环等待DMSC在后台准备好设备吗?还是什么目的?
目的是证明在 SBL 完成后,应用程序代码在 PowerClock_init() 中失败。我认为当使用 CCS 脚本进行 SOC 初始化时,您的硬件上也发生了应用程序故障。
我将总结我目前对情况的理解,能否请您确认我的总结是否正确?
Uniflash 用于将 OPSI SBL、SYSFW 和应用程序写入flash。
LP 和客户 HW 板的boot method都是 SBL OSPI。
LP的boot和执行都正确。
自定义硬件板在启动后无法正确执行应用程序。连接 JTAG 并加载符号后,发现应用程序代码卡在 PowerClock_init() 循环中。如果板被放置在 NO BOOT 模式下并且 CCS 脚本用于 SOC 初始化:
LP:没有观察到挂起。
自定义板:未观察到挂起。这意味着该问题仅在自定义硬件上的 OSPI 引导时出现。
在自定义硬件板上刷新 SBL OSPI 后,不再观察到启动故障。
li ljch 说:我这边现象是,只要flash里面固化了SBL,程序就可以正常执行 PowerClock_init(),否则就在PowerClock_init()内部等待死循环。
好的,所以这个问题与 Uniflash 有关,与 SBL、SYSFW、PowerClock_init() 或 DMASS 无关,请问这样理解对吗?对于失败案例,Uniflash 在flash过程中是否报告任何错误呢?