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.

[参考译文] CC2541:从 IMGB 切换到 IMGA 时、CC2541在软件复位后挂起

Guru**** 2386610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/987197/cc2541-cc2541-hangs-after-software-reset-when-switching-from-imgb-to-imga

器件型号:CC2541

从图像 B 切换到图像 A 时、我观察到一些器件上偶尔会挂起。切换执行 LJMP 到0x830、就像 BIM 启动它一样。
将 T2同步到32K 时钟时、在 BLE 堆栈中始终发生挂起。 代码位置似乎正在读取 RSSI 值(但不确定)。

堆栈为1.5.1.1版。


00CC99 04 INC A
00CC9A F5 21 MOV V0,A
00CC9C A9 21 MOV R1,V0
00CC9E EE MOV A,R6
00CC9F FA MOV R2,A
00CCA0 EF MOV A,R7
00CCA1 FB MOV R3,A
00CCA2 90 02 86 MOV DPTR,#0x0286
00CCA5 E0 MOVX A,@DPTR
00CCA6 F5 83 MOV DPH,A
00CCA8 88 82 MOV DPL,R0
00CCAA 12 0F 1C LCALL 0x0F1C
00CCAD A9 22 MOV R1,V1
00CCAF 02 CB E4 LJMP 0xCBE4
00CCB2 A2 AF MOV C,IEN0.EA
00CCB4 E4 CLR A
00CCB5 33 RLC A
00CCB6 F8 MOV R0,A
00CCB7 C2 AF CLR IEN0.EA
00CCB9 53 94 FE ANL T2CTRL,#0xFE
00CCBC E5 94 MOV A,T2CTRL
00CCBE A2 E2 MOV C,A.2
00CCC0 40 FA JC 0x7CCBC
00CCC2 E8 MOV A,R0
00CCC3 A2 E0 MOV C,A.0
00CCC5 92 AF MOV IEN0.EA,C
00CCC7 75 A7 00 MOV T2IRQM,#0x00
00CCCA 75 A1 00 MOV T2IRQF,#0x00
00CCCD 75 9C FF MOV T2CSPCFG,#0xFF
00CCD0 75 C3 00 MOV T2MSEL,#0x00
00CCD3 75 A2 00 MOV T2M0,#0x00
00CCD6 75 A3 00 MOV T2M1,#0x00
00CCD9 75 A4 00 MOV T2MOVF0,#0x00
00CCDC 75 A5 00 MOV T2MOVF1,#0x00
00CCDF 75 A6 00 MOV T2MOVF2,#0x00
00CCE2 75 C3 11 MOV T2MSEL,#0x11
00CCE5 75 A2 00 MOV T2M0,#0x00
00CCE8 75 A3 00 MOV T2M1,#0x00
00CCEB 75 A4 00 MOV T2MOVF0,#0x00
00CCEE 75 A5 00 MOV T2MOVF1,#0x00
00CCF1 75 A6 00 MOV T2MOVF2,#0x00
00CCF4 75 C3 33 MOV T2MSEL,#0x33
00CCF7 75 A2 00 MOV T2M0,#0x00

当在调试器中手动将32MHz 时钟从 XTAL 模式切换为 RC 模式(并向后切换)时、循环结束、器件按预期启动。 在跳至图像 A 之前、我尝试恢复时钟配置、但运气不好。 当尝试执行 LL_Init (0)时、它会在类似的 T2同步循环上挂起。 我在最近一批生产的2台设备上发现了这种行为、每批生产100台设备。 这会阻止最终用户使用 OAD 功能。 是否有解决此问题的想法?

void OS_reboot(char flash)
{
GAPRole_TerminateConnection();

#if defined(HAL_UART_DMA) && HAL_UART_DMA
HAL_DMA_ABORT_CH( HAL_DMA_CH_RX );
#endif

PREFETCH_DISABLE();
CLKCONCMD = 0xC9;
while (CLKCONSTA != 0xC9)
;

// HCI_ResetCmd();
// LL_Init(0);
// gapRole_SetupGAP();
#ifdef FEATURE_OAD_HEADER
if (flash)
{
HAL_DISABLE_INTERRUPTS();
JumpToImageAorB = 0;
// Simulate a reset for the Application code by an absolute jump to the expected INTVEC addr.
asm("LJMP 0x0830");
}
#else
VOID flash;
#endif
SystemReset();
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想知道发生了什么:-)根本原因是在某些模块上,32KHz 晶振是坏的。 图像 B 未使用睡眠模式、并且使用了内部 RC 振荡器。 而映像 B 是在启用外部32KHz 晶振的情况下编译的。  

    解决方案:通过 XOSC32K_INSTALLED=FALSE在预处理器设置中进行设置、使用禁用的外部32KHz 晶振编译了两个映像。