You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 09:47:05