单片机 flash 擦写(先擦除 后写任意字节)

news/2024/9/24 21:22:06/

很多情况下,我们写扇区病不一定512对齐,甚至有的情况下跨扇区读写,为了满足这个需求,进行判断先擦除再写,并且不影响之前扇区的数据

擦除再写:

#define FLASH_TOTAL      0x50000 // 共320K
#define BLOCK_START_ADDR 0x2F800 // 前190K为COS预留空间
#define PAGE_SIZE        512     // ! 注意这里并不是页大小,而是可以擦除的最小单位/*** @description: 先擦除再写* @detail:* @return {*}* @author: lkc*/
ULONG DRV_FLASHWriteWithErase(UCHAR *pucSrc, ULONG ulDes, ULONG ulBytelen)
{USHORT unalignment_bytes1 = 0, unalignment_bytes2 = 0, totle_len = 0;UCHAR buf1[PAGE_SIZE], buf2[PAGE_SIZE], i;if (ulBytelen <= 0 || ulDes < BLOCK_START_ADDR || (ulDes + ulBytelen) >= FLASH_TOTAL) {return FALSE;}/*判断是否地址PAGESIZEbyte对齐*/if ((ulDes % PAGE_SIZE) != 0) {unalignment_bytes1 = ulDes % PAGE_SIZE; // X1的数据长度,即需要保护的数据DRV_FlashRead(buf1, ulDes - unalignment_bytes1, unalignment_bytes1); // 读取X1的数据到buf1中}/*判断写入长度PAGESIZE字节对齐,*/if (((ulDes + ulBytelen) % PAGE_SIZE) != 0) {unalignment_bytes2 = PAGE_SIZE - (ulDes + ulBytelen) % PAGE_SIZE; // X2的数据长度DRV_FlashRead(buf2, ulDes + ulBytelen, unalignment_bytes2);       // 读取X2的数据到buf2中}/*数据拼接*/totle_len = ulBytelen + unalignment_bytes1 + unalignment_bytes2;/*擦除从地址des-unalignment_bytes1开始的n页,n = totle_len/PAGE_SIZE*/DRV_FLASHEraseN(ulDes - unalignment_bytes1, totle_len / PAGE_SIZE);/*当只有一页*/if (totle_len / PAGE_SIZE == 1) {memcpy(buf1 + unalignment_bytes1, pucSrc, ulBytelen);memcpy(buf1 + unalignment_bytes1 + ulBytelen, buf2, unalignment_bytes2);DRV_FlashWrite(buf1, ulDes - unalignment_bytes1, PAGE_SIZE);} else {for (i = 0; i < totle_len / PAGE_SIZE; i++) {if (i == 0) {memcpy(buf1 + unalignment_bytes1, pucSrc, PAGE_SIZE - unalignment_bytes1);} else if (i == (totle_len / PAGE_SIZE - 1)) {memcpy(buf1, pucSrc + ulBytelen - (PAGE_SIZE - unalignment_bytes2), PAGE_SIZE - unalignment_bytes2);memcpy(buf1 + PAGE_SIZE - unalignment_bytes2, buf2, unalignment_bytes2);} else {memcpy(buf1, pucSrc + PAGE_SIZE - unalignment_bytes1 + (i - 1) * PAGE_SIZE, PAGE_SIZE);}DRV_FlashWrite(buf1, ulDes - unalignment_bytes1 + i * PAGE_SIZE, PAGE_SIZE);} }return SUCCESS;
}

 擦除多扇区:

VOID DRV_FLASHEraseN(ULONG ulAddr, ULONG ulPageN)
{unsigned int i = 0;for (i = 0; i < ulPageN; i++) {DRV_FlashErasePage(ulAddr + i * PAGE_SIZE);}
}

读写擦除接口:

/*** @description: 读取flash* @detail:* @param {UCHAR} *pucBuf 读取buf* @param {ULONG} ulSrcAddr 地址* @param {ULONG} ulBytelen 字节长度* @return {*}* @author: lkc*/
VOID DRV_FlashRead(UCHAR *pucBuf, ULONG ulSrcAddr, ULONG ulBytelen)
{if ((NULL == pucBuf) || (0 == ulBytelen)) {return;}if ((ulSrcAddr + ulBytelen) > FLASH_TOTAL) {return;}// 实现return;
}/*** @description: flash写* @detail:* @param {UCHAR} *pucBuf 写buf* @param {UINT32} ulDstAddr 目的地址* @param {ULONG} ulBytelen 字节长度* @return {*}* @author: lkc*/
VOID DRV_FlashWrite(UCHAR *pucBuf, ULONG ulDstAddr, ULONG ulBytelen)
{if ((NULL == pucBuf) || (0 == ulBytelen)) {return;}if ((ulDstAddr + ulBytelen) > FLASH_TOTAL) {return;}// 实现return;
}/*** @description: flash单页擦除* @detail:* @param {UCHAR} *pucBuf 写buf* @param {UINT32} ulDstAddr 目的地址* @param {ULONG} ulBytelen 字节长度* @return {*}* @author: lkc*/
VOID DRV_FlashErasePage(ULONG ulAddress)
{// 实现return;
}


http://www.ppmy.cn/news/1507376.html

相关文章

千里江山图,自动化成诗:Expect脚本详解——从入门到进阶的自动化利器

目录 引言 Expect脚本基础 什么是Expect 基本语法 进阶应用 错误处理 正则表达式 并发处理 使用Shell脚本管理多个Expect脚本 在Expect脚本内部模拟并发 脚本复用与模块化 总结 引言 在自动化运维和测试领域&#xff0c;Expect脚本无疑是一把强大的利器。它以其灵…

正点原子imx6ull-mini-Linux驱动之Linux IIO 驱动实验

工业场合里面也有大量的模拟量和数字量之间的转换&#xff0c;也就是我们常说的 ADC 和 DAC。 而且随着手机、物联网、工业物联网和可穿戴设备的爆发&#xff0c;传感器的需求只持续增强。比如手 机或者手环里面的加速度计、光传感器、陀螺仪、气压计、磁力计等&#xff0c;这些…

Oracle 导出dmp文件

Oracle 导出dmp文件 exp FPMS20230909/FPMS20230909193.193.193.20:1521/ORCL fileF:\workingData\huishangyinhang\20240808\EXP\20240808hsyh.dmp fully 参考1 参考2 参考3

神经网络 (NN) TensorFlow Playground在线应用程序

神经网络 (NN) 历史上最重要的发现之一是神经网络 (NN) 的强大功能。 在神经网络中&#xff0c;称为神经元的许多数据层被添加在一起或相互堆叠以计算新的数据级别。 常用的简称&#xff1a; DNN 深度神经网络CNN 卷积神经网络RNN 循环神经网络 神经元 科学家一致认为&am…

mysql事务与索引

1.事务 &#xff08;1&#xff09;提出背景&#xff1a; 在日常开发环境中&#xff0c;有一些场景是需要“一气呵成”完成某一个操作。 eg&#xff1a;银行转账的场景&#xff1a;张三&#xff08;手里有1000&#xff09;现要给李四&#xff08;手里有500&#xff09;转500&…

cpio 命令

前言 cpio&#xff08;Copy In and Out&#xff09;是一种在类 Unix 操作系统中处理归档文件的多功能工具。与 tar 不同&#xff0c;cpio 有其独特的优势和使用场景&#xff0c;特别是在与其他命令结合使用时。本文将带你了解 cpio 的基础知识、用法及实际示例。 什么是 cpio…

重生之我 学习【数据结构之顺序表(SeqList)】

⭐⭐⭐ 新老博友们&#xff0c;感谢各位的阅读观看 期末考试&假期调整暂时的停更了两个多月 没有写博客为大家分享优质内容 还容各位博友多多的理解 美丽的八月重生之我归来 继续为大家分享内容 你我共同加油 一起努力 ⭐⭐⭐ 数据结构将以顺序表、链表、栈区、队列、二叉树…

获取客户端真实IP

出于安全考虑&#xff0c;近期在处理一个记录用户真实IP的需求。本来以为很简单&#xff0c;后来发现没有本来以为的简单。这里主要备忘下&#xff0c;如果服务器处于端口回流&#xff08;hairpin NAT&#xff09;,keepalived&#xff0c;nginx之后&#xff0c;如何取得客户端的…