ATSAML21E17 Data Flash写入失败问题求助(曾正常工作一次)
ATSAML21E17 Data Flash写入失败问题排查
我无法向ATSAML21E17的Data Flash写入数据,该功能曾正常工作过一次。所有熔丝均为默认设置,单步调试函数时状态寄存器和中断寄存器无任何错误,每步操作后NVMCTL状态都显示就绪,但Flash内容完全没有变化。就算不接调试器探针,功能依然无法正常工作。
我怀疑处理器手册遗漏了写入该Flash的全部条件,或是我的操作存在失误,希望能得到相关帮助。
我尝试向Flash存储数据,相关代码如下:
int SaveNvmData (void *uBufr, uint16_t bytCnt) { uint16_t *src = uBufr, *dst = (uint16_t *)DATAFLASH_ADDR; uint32_t ctlB = NVMCTRL->CTRLB.reg; int rtnVal = ERR_OK; /* 启用手动页写入模式 */ NVMCTRL->CTRLB.bit.MANW = 1; /* 检查地址是否按字对齐 */ if ((uint32_t)uBufr & 3) rtnVal = ERR_Align; /* 检查数据大小是否超过2048字节 */ else if (bytCnt > 2048) rtnVal = ERR_NvmSize; /* 检查数据大小是否为4的倍数 */ else if (bytCnt & 3) rtnVal = ERR_NvmMod4; /* 参数校验通过,开始写入Data Flash */ else { /* 清除页缓冲区 */ NVMCTRL->CTRLA.reg = 0xA544; while ( ! (NVMCTRL->INTFLAG.reg & 1)); /* 逐页写入Flash */ do { /* 每256字节(一个行)执行一次擦除操作 */ if (((uint32_t)dst & 0xFF) == 0) { NVMCTRL->ADDR.reg = (uint32_t)dst; NVMCTRL->CTRLA.reg = 0xA51A; while ( ! (NVMCTRL->INTFLAG.reg & 1)); } /* 向页缓冲区写入最多64字节数据 */ do { *dst++ = *src++; bytCnt -= 2; } while (bytCnt && ((uint32_t)dst & 0x3F) != 0); /* 执行页写入操作 */ NVMCTRL->CTRLA.reg = 0xA51C; while ( ! (NVMCTRL->INTFLAG.reg & 1)); } while (bytCnt); } /* 恢复原始的写入控制配置 */ NVMCTRL->CTRLB.reg = ctlB; /* 返回值非0表示出错 */ return (rtnVal); }
内容的提问来源于stack exchange,提问作者Mark L
相关产品推荐
相关产品推荐

