从图像 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();
}