请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 在两种情况下都是精确的...
发生什么事了?