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.

[参考译文] 编译器/MSP430FR5848:SWPOR 之后来自 CRC 模块的 CRC 不正确

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/782509/compiler-msp430fr5848-incorrect-crc-from-crc-module-after-swpor

器件型号:MSP430FR5848

工具/软件:TI C/C++编译器

你(们)好。

在 PMMCTL0寄存器中触发 SWPOR 后、我一直遇到一个有趣的现象、即产生 CRC。

如果我在调试器上执行"硬复位"、我接收到的 CRC 符合预期、但如果我只执行软复位、CRC 始终是不同的值。

这是条目代码:

#pragma CODE_SECTION (boot_crc16、".section_u")
#pragma Flen_no_inline (boot_crc16)
static void boot_crc16 (volatile uint16_t* src、uint16_t








src、volatile uint16_t* rcrc){HWREG16 (crc_BASE + OFS+)

= 0xt++ CRCf (0xt++++++++)+++= 0xt+= 0xt+++++++ Ct+(0xt++++++)++++++ Ct+++ Ct++++ Ct+ Ct+ Ct+ Ct+ Ct+ Ct+ Ct++ Ct++ Ct+ Ct while (len >0);

* rCRC = HWREG16 (crc_BASE + OFS_CRCINIRES);
}

#pragma RETAIN (boot_entry)
#pragma CODE_SECTION (boot_entry、".section_u")
#ram pragma Fasm_never_returnS (boot_entry)#pragma
FUNC_EXT_CALLED (boot_SECTION)(boot_entry)#pragma CODE/(boot_entry



、"*/void)(ble_clock_entry);*= 0x43/

(ble/(ble_clock_delay)= unt)(bay = n_clock_clay)、'/void /t)/+/+= nome_delay
_asm ("MOV.W#_STACK_END、SP");
__asm ("sub.W#0x0400、SP");

{/*!<以最安全的方式设置 fram 控制器*/
HWREG16 (FRAM_base + OFS_FRCTL0)=(FRCTLPW | NWAITS_HW7);


* HWREG16 (WDT_WDT_KIT
)+ WDTWRTS_KIT + WRTS_KIT (WDT_WLD_WRTL)*+ WDTWRTS_7)+ WRTS_KIT (*+ WDTWDTWRTS_WRTS_KIT


{/*!< MPU 设置*/
HWREG16 (MPU_base + OFS_MPUCTL0)= MPUPW | HWREG8 (MPU_base + OFS_MPUCTL0);//解锁
HWREG16 (MPU_base + OFS_MPUSEGRUS)=(MPUSREE +MPREG16

)| MPUSEGPOR_AM4_AM_AMBEEGx + MPREGx = 0xUSEGP_AM4+ MPUSEGP_AM_AM_AM_AM4+ MPEEG16 (MPEEGx + MPEEGx + MPEEGx + MPREGx + MPREGx + MPREGx + MPUSEGPAM_AM_AM_AM_SECTION + MPEEGx + MPEEGx + MPREGx + MPREGx + MPREGx + MPUSEGPAM_AM_AM_AM_SECUREMBEEG16)| MPUSEGPAM_AM_SECUR_AM_AM_AM_AM_AM_AM_AM_SEC// 0xa400或0x4800
HWREG16 (MPU_base + OFS_MPUSAM)|=(MPUSEG1VS | MPUSEG2VS | MPUSEG3VS | MPUSEGIVS);//冲突选择
HWREG16 (MPU_base + OFS_MPUCTL0)=(MPUPW | MPUEG0*+
MPUCTL0


)+ MPU0 + MPU0 + MPUCTL0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 + MPU0 1、M/S 的 DCO 和辅助请求的 VLO、已启用*/
HWREG16 (CS_BASE + OFS_CSCTL0)= CSKEY;//访问 HWREG16 (
CS_BASE + OFS_CSCTL1)的密码=(DCORSEL | DCOFSEL_4);//高速| 16MHz (可能以24MHz 运行)
HWREG16 (CS_BASE + OFS_CSCTL2)=(SEALL_1 | SELS_3 | SELM_3);// ACLK -> VLOCLK -> DCOCLK、MCLK -> DCOCLK
HWREG16 (CS_BASE + OFS_CSCTL3)=(DCOCLK -> DCOCLK + DCOCLK1 | DCOCLK + DCOCL1 + DCOLD_ 1 + DCOCLF_ 1)|< DCOCLF_ 1 + DCOLD1 + DCOLDV1+ DCOCLF_ 1 (DIV1_ 1 + DTOF_ 1)|不是
1 + DCOLDV1_ 1 + DCOCLF_ 1 + DCOLD+ DCO// LFXFT 关闭、HFXT 关闭、VLO 打开、HWREG16上的 SMCLK
(CS_BASE + OFS_CSCTL5)=(0U << 7 | 0U << 6 | 0U << 1 | 0U << 0);// LFXT 故障计数器禁用、清除 HFXTOF <7 | 0U <6 | HFX_CLKEN_REQL
(HW_REQCLK ~)| LCML + LQCLK + LQCLK (REQEN + LQCLK)//启用除 MODCLK
以外的所有条件请求}

{/*!< IO */
HWREG16 (PMM_BASE + OFS_PM5CTL0)&&~(LOCKLPM5);
_BIC_SR_register (CPUOFF);
}

{/*!<初始化 UART *//
设置=

~(LOCKLPM5)| HW1_RUSCI_RST_0 (HW1_BUCTL)+ 0 + 0 (UCCTRUST_0)| UCTUST_0 (UCC1)+ 0 + BGS1 + R0 + R0 (UCTU0)+ G8 (UCC1 + TRUCC1 + TRU0)+ 0 + 0 + B0 (UCC1 + B0 + TRUCC1 + B0 + TRUCC1 (UCTU0)+ B0 (U

//设置 SWRST (无论如何都在 PUC 后自动设置)
HWREG16 (EUSCI_A1_BASE + OFS_UCAxCTLW0)=(UCSSEL1);// SMCLK (源 DCO CLK)
HWREG16 (EUSCI_A1_BASE + OFS_UCAxCTLW1)=(UCSSEL1
);// HWREG0008 + UCAx8 + EUSCI_BLDINK =(UCA0008)// 0x08 == 8 ==(uint16_t)((16e6 / 115.2e3)/ 16)(这是 UCBRx)
HWREG16 (EUSCI_A1_BASE + OFS_UCAxMCTLW)=(0x00F7 << 8 | 0x000A << 4 | UCOS16);[UCBx7_UCAxF7](UCBUSCI_UCAx15)= 0xUCB0X15 + UCATX_UCATX_UCAx + UCB0X15](UCB0X15 + UCBUSCx + UCAFx + UCB0X15 UCAFx + UCBUCAFx + UCBUCBUCB0X15)
//清除所有状态,设置禁用监听
HWREG16 (EUSCI_A1_BASE + OFS_UCAxABCTL)= 0x0000;//禁用默认自动波特
禁用 HWREG16 (EUSCI_A1_BASE + OFS_UCAxIRCTL)= 0x0000;//禁用
HWREG16 (EUSCI_A1_BASE)+ UCAxUSCI_UCAST_UCA16= 0x0000

(UCAST_UCAST_UCAST_UCAST_UCAST_RAND);不需要的 UCAxWUST_UCAST_UCAST_UCAST_UCAST_UCAST_LAK= 0x0000 ~//启动外设
}

{/*!<代码*/
volatile uint16_t PCRC;
volatile uint16_t uCRC;
boot_crc16 (&HWREG16 (section_main_start)、section_main_size、&PCRC);
boot_crc16 (&HWREG16 (section_update__start)、section_update_size、&uCRC);

_op_code (0x4343);/*!<断点*/
}

在手动放置的断点、我接收两个不同的 CRC、具体取决于我使用的是硬复位还是软复位。

如果我在调用第一个 crc16之前手动暂停大量时间、那么 CRC 在两种情况下都是精确的...

发生什么事了?

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

    哦、我想我已经发现了这个问题、使用"软复位"意味着一个断点会自动放置在实际程序中#main 的入口。

    我猜调试器不会在遇到该字节后重新写入该字节。

    这可能与我的调试配置有关。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    1.如何发现使用'soft reset'意味着断点会自动置于实际程序中#main 的条目中?
    2.如果它是软件断点、它将用中断代码执行的调用来替换断点地址上的指令。
    3.我也不确定原因,因为它将首先使用硬件断点。
    伊斯天
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我发现它的行为是这样的、因为我在自定义程序地址处输入之后检查了整个程序存储器、调试器预期会在该地址遇到 main。

    但是、我无法通过删除设置来在 main 处停止来更改此行为。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您能告诉我 SECTION _MAIN__START、SECTION _MAIN_SIZE、SECTION _UPDATE_START 和 SECTION _UPDATE_SIZE 的数量吗?
    2.请提供更多详细信息,如打印屏幕和整个代码。
    3.由于软复位不会初始化堆栈和寄存器,这是否是原因?
    伊斯天