完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我正在使用 mpc5777c 微控制器。我在 nxp 闪存代码示例中看到了这些代码。我不明白为什么他们在闪存操作后恢复闪存控制器缓存。据我了解,RestoreFlashControllerCache 函数在禁用这些寄存器后启用 P0_BFEN 和 P1_BFEN 寄存器。首先禁用闪存控制器缓存,经过一些闪存操作后,启用闪存控制器缓存。我不明白为什么他们在这些操作后启用缓存。
#include "Cpu.h" #include "flash_c55_driver.h" volatile int exit_code = 0; /* User includes (#include below this line is not maintained by Processor Expert) */ /* Lock State */ #define UNLOCK_LOW_BLOCKS 0x00000000U #define UNLOCK_MID_BLOCKS 0x00000000U #define UNLOCK_HIGH_BLOCKS 0x00000000U #define UNLOCK_FIRST256_BLOCKS 0x00000000U #define UNLOCK_SECOND256_BLOCKS 0x00000000U /* buffer size * / #define buffer_size_byte 0x1000u #define block_start_addrs 0x00000000u #define block_end_end_addrs 0x000000fffu #define number_of_word_blank_check_check_check_check_check_check_check_check _check_check _check 0x90 #define FLASH_FMC PFLASH_BASE #define FLASH_PFCR1 0x000000000U #define FLASH_PFCR2 0x000000004U #define FLASH_FMC_BFEN_MASK 0x000000001U uint32_t g_usrCnt = 0U; uint32_t 缓冲区[BUFFER_SIZE_BYTE / C55_WORD_SIZE]; flash_context_data_t pCtxData; void UserCallBack(void) { /* 增加 g_usrCnt */ g_usrCnt++; / *************************************************** ************** * 禁用闪存 * ******************************* *********************************/ void DisableFlashControllerCache(uint32_t flashConfigReg, uint32_t disableVal, uint32_t *origin_pflash_pfcr) { /* 读取闪存配置寄存器的值 */ *origin_pflash_pfcr = REG_READ32(FLASH_FMC + flashConfigReg); /* 禁用缓存 */ REG_BIT_CLEAR32(FLASH_FMC + flashConfigReg, disableVal); / *************************************************** ****************** * 恢复FCM配置寄存器 * ************************** *******************************************/ void RestoreFlashControllerCache(uint32_t flashConfigReg, uint32_t pflash_pfcr) { REG_WRITE32(FLASH_FMC + flashConfigReg, pflash_pfcr); } /*! \brief 项目的主要功能。 \details 启动初始化顺序如下: * - 启动 asm 例程 * - main() */ int main(void) { status_t ret = STATUS_SUCCESS; uint32_t blkLockState;/* 要检索的块锁定状态 */ flash_block_select_t blockSelect; flash_state_t 操作结果; uint32_t numOfWordCycle; uint32_t 目标;/* 目标地址 */ uint32_t 大小;/* 适用尺寸 */ uint32_t source; /* 编程和验证的源地址 */ uint32_t failedAddress; /* 将失败的地址保存在闪存中 */ uint32_t sum; /* 校验和结果 */ uint32_t i; /* 索引 */ uint32_t pflash_pfcr1, pflash_pfcr2; /*** Processor Expert 内部初始化。不要删除此代码!!!***/ #ifdef PEX_RTOS_INIT PEX_RTOS_INIT(); /* 所选 RTOS 的初始化。宏由 RTOS 组件定义。*/ #endif /*** Processor Expert 内部初始化结束。***/ /* 使闪存控制器缓存无效 */ DisableFlashControllerCache(FLASH_PFCR1, FLASH_FMC_BFEN_MASK, &pflash_pfcr1); DisableFlashControllerCache(FLASH_PFCR2, FLASH_FMC_BFEN_MASK, &pflash_pfcr2); /**************************************************** ****************************/ /* 初始化源缓冲区 */ /**************** ****************************************************** ********/ for (i = 0; i < (BUFFER_SIZE_BYTE / C55_WORD_SIZE); i++) { 缓冲区 = 0x0U; } /* 闪存初始化 */ ret = FLASH_DRV_Init(); DEV_ASSERT(ret == STATUS_SUCCESS); /**************************************************** ****************************/ /* 锁定以保护 UTest 地址空间 */ /************* ****************************************************** ***********/ ret = FLASH_DRV_GetLock(C55_BLOCK_UTEST, &blkLockState); 如果 (!(blkLockState & 0x00000001U)) { ret = FLASH_DRV_SetLock(C55_BLOCK_UTEST, 0x1U); 如果 (STATUS_SUCCESS != ret) { 返回 ret; / ************************************************** _ ******************************/ /* 解锁低地址空间中的所有块 */ /********** ****************************************************** ***************/ ret = FLASH_DRV_SetLock(C55_BLOCK_LOW, UNLOCK_LOW_BLOCKS); 如果 (STATUS_SUCCESS != ret) { 返回 ret; / *************************************************** ***************************/ /* 解锁中间地址空间中的所有块 */ /*********** ****************************************************** *************/ ret = FLASH_DRV_SetLock(C55_BLOCK_MID, UNLOCK_MID_BLOCKS); 如果 (STATUS_SUCCESS != ret) { 返回 ret; / *************************************************** *****************************/ /* 解锁高地址空间中的所有块 */ /*********** ****************************************************** *************/ ret = FLASH_DRV_SetLock(C55_BLOCK_HIGH, UNLOCK_HIGH_BLOCKS); 如果 (STATUS_SUCCESS != ret) { 返回 ret; / *************************************************** ***************************/ /* 解锁256K块中的所有块 */ /************ ****************************************************** ************/ ret = FLASH_DRV_SetLock(C55_BLOCK_256K_FIRST, UNLOCK_FIRST256_BLOCKS); 如果 (STATUS_SUCCESS != ret) { 返回 ret; } ret = FLASH_DRV_SetLock(C55_BLOCK_256K_SECOND, UNLOCK_SECOND256_BLOCKS); 如果 (STATUS_SUCCESS != ret) { 返回 ret; / *************************************************** *****************************/ /* 调用 FLASH_DRV_Erase, FLASH_DRV_BlankCheck, FLASH_DRV_Program, */ /* FLASH_DRV_ProgramVerify, FLASH_DRV_CheckSum 函数 */ /********************************* ***********************************************/ blockSelect.lowBlockSelect = 0x1U ; blockSelect.midBlockSelect = 0x0U; blockSelect.highBlockSelect = 0x0U; blockSelect.first256KBlockSelect = 0x0U; blockSelect.second256KBlockSelect = 0x0U; g_usrCnt = 0U; /* 擦除块 */ ret = FLASH_DRV_Erase(ERS_OPT_MAIN_SPACE, &blockSelect); if (STATUS_SUCCESS == ret) { do { /* 用户可以在检查状态功能仍在进行时执行任何任务 */ UserCallBack(); ret = FLASH_DRV_CheckEraseStatus(&opResult); }while(ret == STATUS_FLASH_INPROGRESS); } if (STATUS_SUCCESS != ret) { 返回 ret; } dest = BLOCK_START_ADDRS; 大小 = BLOCK_END_ADDRS + 1 - BLOCK_START_ADDRS; numOfWordCycle = NUMBER_OF_WORD_BLANK_CHECK; /* 空白检查 */ ret = FLASH_DRV_BlankCheck(dest, size, numOfWordCycle, &failedAddress, NULL_CALLBACK); 如果 (STATUS_SUCCESS != ret) { 返回 ret; } /* 编程到块的开头 */ dest = BLOCK_START_ADDRS; 大小 = BUFFER_SIZE_BYTE; 来源=(uint32_t)缓冲区; g_usrCnt = 0U; ret = FLASH_DRV_Program(&pCtxData, dest, size, source); if (STATUS_SUCCESS == ret) { do { /* 用户可以在检查状态功能仍在进行时执行任何任务 */ UserCallBack(); ret = FLASH_DRV_CheckProgramStatus(&pCtxData, &opResult); }while(ret == STATUS_FLASH_INPROGRESS); } if (STATUS_SUCCESS != ret) { 返回 ret; } numOfWordCycle = NUMBER_OF_WORD_PGM_VERIFY; /* 程序验证 */ ret = FLASH_DRV_ProgramVerify(dest, size, source, numOfWordCycle, &failedAddress, NULL_CALLBACK); 如果(STATUS_SUCCESS != ret) { 返还; } numOfWordCycle = NUMBER_OF_WORD_CHECK_SUM; /* 检查总和 */ ret = FLASH_DRV_CheckSum(dest, size, numOfWordCycle, &sum, NULL_CALLBACK); if ((STATUS_SUCCESS != ret) && (sum != 0U)) { return ret; } /* 恢复闪存控制器缓存 */ RestoreFlashControllerCache(FLASH_PFCR1, pflash_pfcr1); RestoreFlashControllerCache(FLASH_PFCR2, pflash_pfcr2); /*** 不要写任何经过这一行的代码,否则它会在代码生成时被删除。***/ /*** RTOS 启动代码。宏 PEX_RTOS_START 由 RTOS 组件定义。不要修改此代码!!!***/ #ifdef PEX_RTOS_START PEX_RTOS_START(); /* 所选 RTOS 的启动。宏由 RTOS 组件定义。*/ #endif /*** RTOS 启动代码结束。***/ /*** Processor Expert 主例程结束。不要修改此代码!!!***/ for(;;) { if(exit_code != 0) { 中断; } } 返回退出代码; /*** Processor Expert 主例程结束。不要在下面写代码!!!***/ } /*** 主程序结束。不要修改此文本!!!***/ /* 主线结束 */ |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2135个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
37376 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
6775 浏览 1 评论
7793 浏览 1 评论
7642 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
5071 浏览 0 评论
1555浏览 2评论
关于NINA-W132 Wi-Fi模块SPI通信遇到的疑问求解
1207浏览 2评论
如何在MPC PowerPC MCU上首次刷写后禁用BDM?
749浏览 1评论
将HFREFR和LFREFR寄存器值设置为错误的值来将故障注入CMU,但CMU_ISR值始终为零,为什么?
734浏览 1评论
将SPSDK for FRDM-MCX-W71 SDK与VS一起安装时出现hidapi构建错误怎么解决?
677浏览 1评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 18:36 , Processed in 1.005033 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
401