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