主题中讨论的其他器件:SEGGER、MSPM0G3107 、 SysConfig
工具与软件:
你(们)好
我遇到过这样的问题:通过 Segger JLink 编程器从 CCS Theia (v20.1.0.6_1.7.0)中刷写 MSPM0G3107 MCU 并不总是有效的。
现在我经常会遇到这种情况、并且使用多个(完全相同的定制)电路板。 在某些较旧版本的 IDE 中已经观察到同样的行为
结果如下所示
所以很显然,该故障在某种程度上与编程的 NONMAIN 段(它确实是要生成的二进制的一部分,我知道是有效的所有默认值,除了 BSL 调用引脚,因为在默认情况下会导致我们的应用程序中的问题....)
这种行为与闪烁的尝试密切相关、闪烁的顺序为一分钟、而不是最多几秒。
我当前的解决方法是通过 Jflash 编程工具刷写一个已知的工作二进制文件(虽然具有相同的非主内容),然后铺就 IDE
(当我谈论通过 IDE 进行刷写时、我其实是指闪存和启动调试会话...)
我的启动配置是这样的
{ "version": "0.2.0", "configurations": [ { "name": "MCUCode", "type": "ccs-debug", "request": "launch", "projectInfo": { "name": "MCUCode", "resourceId": "/MCUCode" } } ] }
我按此方式设置目标配置
我的工作 jlink 配置 设置如下(必须以.jflash 文件附件上传方式存储、这样对我来说似乎无效)
AppVersion = 79611 FileVersion = 2 [GENERAL] aATEModuleSel[24] = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ConnectMode = 0 CurrentFile = "C:\Users\pbendema\OneDrive - Clarios\Dokumente - Clarios Li-ION 12V LISB battery - LISB III\06_Product_Engineering\07_Software\Releases\Staging Releases\SW_BSample_105_23012025_1804_55c737d5.elf" DataFileSAddr = 0x00000000 GUIMode = 0 HostName = "" TargetIF = 1 USBPort = 0 USBSerialNo = 0x00000000 UseATEModuleSelection = 0 [JTAG] IRLen = 0 MultipleTargets = 0 NumDevices = 0 Speed0 = 4000 Speed1 = 4000 TAP_Number = 0 UseAdaptive0 = 0 UseAdaptive1 = 0 UseMaxSpeed0 = 0 UseMaxSpeed1 = 0 [CPU] NumInitSteps = 1 InitStep0_Action = "Reset" InitStep0_Value0 = 0x00000000 InitStep0_Value1 = 0x00000000 InitStep0_Comment = "Reset and halt target" NumExitSteps = 0 UseScriptFile = 0 ScriptFile = "" RAMAddr = 0x20200000 RAMSize = 0x00008000 CheckCoreID = 1 CoreID = 0x0BB11477 CoreIDMask = 0x0F000FFF UseAutoSpeed = 0x00000001 ClockSpeed = 0x00000000 EndianMode = 0 ChipName = "TI MSPM0G3107" [FLASH] NumBanks = 2 [FLASH0] aRangeSel[1] = 0-127 BankName = "Internal flash" BankSelMode = 1 BaseAddr = 0x00000000 [FLASH1] aRangeSel[1] = 0 BankName = "NONMAIN" BankSelMode = 1 BaseAddr = 0x41C00000 [PRODUCTION] AutoPerformsDisconnect = 1 AutoPerformsErase = 1 AutoPerformsProgram = 1 AutoPerformsSecure = 0 AutoPerformsStartApp = 1 AutoPerformsVerify = 1 EnableFixedVTref = 0 EnableTargetPower = 0 EraseType = 1 FixedVTref = 0x00000CE4 MonitorVTref = 0 MonitorVTrefMax = 0x0000157C MonitorVTrefMin = 0x000003E8 OverrideTimeouts = 0 ProgramSN = 0 SerialFile = "" SNAddr = 0x00000000 SNInc = 0x00000001 SNLen = 0x00000004 SNListFile = "" SNValue = 0x00000001 StartAppType = 0 TargetPowerDelay = 0x00000014 TimeoutErase = 0x00003A98 TimeoutProgram = 0x00002710 TimeoutVerify = 0x00002710 VerifyType = 1 [PERFORMANCE] DisableSkipBlankDataOnProgram = 0x00000000 PerfromBlankCheckPriorEraseChip = 0x00000001 PerfromBlankCheckPriorEraseSelectedSectors = 0x00000001
我配置的非主设置是(SysConfig 工具自动生成):
PLACE_IN_MEMORY(".BCRConfig") const BCR_Config BCRConfig = { .bcrConfigID = 0x1, .debugAccess = BCR_CFG_DEBUG_ACCESS_EN, .swdpMode = BCR_CFG_SWDP_EN, .tifaMode = BCR_CFG_TIFA_EN, .bslPinInvokeEnable = BCR_CFG_BSL_PIN_INVOKE_EN, .passwordDebugLock = {CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE}, .fastBootMode = BCR_CFG_FAST_BOOT_DIS, .bootloaderMode = BCR_CFG_BOOTLOADER_MODE_EN, .massEraseMode = BCR_CFG_MASS_ERASE_EN, .factoryResetMode = BCR_CFG_FACTORY_RESET_EN, .passwordMassErase = {CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE}, .passwordFactoryReset = {CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE}, .staticWriteProtectionMainLow = CFG_DEFAULT_VALUE, .staticWriteProtectionMainHigh = CFG_DEFAULT_VALUE, .staticWriteProtectionNonMain = BCR_CFG_NON_MAIN_STATIC_PROT_DIS, .secureBootMode = BCR_CFG_SECURE_BOOT_DIS, .userSecureAppStartAddr = CFG_DEFAULT_VALUE, .userSecureAppLength = CFG_DEFAULT_VALUE, .userSecureAppCrc = CFG_DEFAULT_VALUE, .userCfgCRC = 0x1879dac3, }; /* Bootloader configuration */ PLACE_IN_MEMORY(".BSLConfig") const BSL_Config BSLConfig = { .configID = 0x1, .interfacePins.UART_RXD_pad_num = DEF_UART_RXD_PAD, .interfacePins.UART_RXD_PF_mux_sel = DEF_UART_RXD_MUX, .interfacePins.UART_TXD_pad_num = DEF_UART_TXD_PAD, .interfacePins.UART_TXD_PF_mux_sel = DEF_UART_TXD_MUX, .interfacePins.I2C_SDA_pad_num = DEF_I2C_SDA_PAD, .interfacePins.I2C_SDA_PF_mux_sel = DEF_I2C_SDA_MUX, .interfacePins.I2C_SCL_pad_num = DEF_I2C_SCL_PAD, .interfacePins.I2C_SCL_PF_mux_sel = DEF_I2C_SCL_MUX, .pin.pinData0 = DEFAULT_BSL_PIN_INVOCATION_DATA0, .pin.pinData1 = DEFAULT_BSL_PIN_INVOCATION_DATA1, .memoryRead = BSL_CFG_MEMORY_READOUT_DISABLE, .password = {CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE, CFG_DEFAULT_VALUE}, .pluginType = BSL_CFG_PLUGIN_TYPE_ANY, .flashPluginEnable = BSL_CFG_PLUGIN_FLASH_NOT_EXIST, .pluginSramSize = 0xff, .pluginHook[0] = CFG_DEFAULT_VALUE, .pluginHook[1] = CFG_DEFAULT_VALUE, .pluginHook[2] = CFG_DEFAULT_VALUE, .pluginHook[3] = CFG_DEFAULT_VALUE, .BSLAlternateConfig = BSL_CFG_FLASH_BSL_NOT_EXIST, .reserved = 0xFFFFU, .BSLAlternateAddr = CFG_DEFAULT_VALUE, .appRev = (uint32_t *) CFG_DEFAULT_VALUE, .securityAlert = BSL_CFG_SECURITY_IGNORE, .i2cSlaveAddress = 0x48, .userCfgCRC = 0xc46912c7, };
我在采用 MCU 省电模式的两个软件版本和未采用该模式的软件版本中都发现了此问题、因此我可以排除这种可能性