当前位置: 首页 > news >正文

如何使用mcu 内置 flash 实现fatfs

一、环境与目的

AT32F403AVGT7,FLASH从0x80e0000到最后,共128K。扇区大小为512。

注意:Flash 的扇区大小为2KB。

fatfs 80286    /* Revision ID */

目标在于利用单片机1MBflash后面的一小部分,以方便应用程序存储系统参数。

1)diskio.c里ioctl下:

case DEV_SYS :switch(cmd){case CTRL_SYNC:result = RES_OK;break;case GET_SECTOR_SIZE:*(DWORD*)buff = 512;result = RES_OK;break;case GET_SECTOR_COUNT://*(DWORD*)buff = ABLINKFLASH_SIZE/2048;*(DWORD*)buff = 256;result = RES_OK;break;case GET_BLOCK_SIZE:*(DWORD*)buff = 1;result = RES_OK;break;default:result = RES_PARERR;break;}

2)  读写函数:

void flash_write_byte_nocheck(uint32_t write_addr, uint8_t *p_buffer, uint32_t num_write){             uint32_t i;uint32_t writeNum   = num_write*512;uint32_t headAddr, tailAddr;write_addr = write_addr*512+ABLINKFLASH_START_ADDR;while(writeNum){headAddr        = write_addr - write_addr%2048;//(write_addr>>11)<<11;tailAddr        = headAddr+2048;n_ReadSector(headAddr);for(i=write_addr; i<tailAddr; i++){flushSectorBuff[i-headAddr]     = p_buffer[i-write_addr];writeNum--;if(0==writeNum){break;}}n_WriteSector(headAddr);}} void flash_read_byte(uint32_t read_addr, uint8_t *p_buffer, uint32_t num_read){ uint32_t i;uint32_t readCount  = num_read*512;uint32_t sectora    = read_addr<<9;uint8_t* pu8T_Temp;for(i = 0; i < readCount; i++){pu8T_Temp         = (uint8_t*)(sectora+ABLINKFLASH_START_ADDR+i);p_buffer[i]       = *pu8T_Temp; }  
}

二、解析如下:

三、验证代码如下:

 res = f_mkfs("0:", 0, buffer, 1024);if(FR_OK==res){aBlink.uart_usb->send("f_mkfs ok...\r\n", 14);}else{aBlink.uart_usb->send("f_mkfs error...\r\n", 17);}res = f_mount(&fatfs, "0:", 1);if(FR_OK==res){aBlink.uart_usb->send("fatfs mount success.\r\n", 22);res = f_open(&fil, "0:123456.txt", FA_OPEN_ALWAYS);if(FR_OK==res){aBlink.uart_usb->send("fatfs open success...\r\n", 23);res = f_close(&fil);if(FR_OK==res){aBlink.uart_usb->send("fatfs close success...\r\n", 24);}else{aBlink.uart_usb->send("fatfs close error...\r\n", 24);}}else{aBlink.uart_usb->send("fatfs open error...\r\n", 23);}}else{aBlink.uart_usb->send("fatfs mount error.\r\n", 22);}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • jQuery基础——DOM
  • 要隐藏滚动条,您可以使用CSS中的overflow属性。
  • 编译可执行命令的FFmpeg
  • 达达熊搭建工程日志(持续更新中)
  • 【Python报错已解决】`ModuleNotFoundError: No module named ‘graphviz‘`
  • java利用JXL操作excel
  • 自然语言处理系列四十八》Word2vec词向量模型》算法原理
  • MyBatis 源码解析:SqlSessionFactoryBuilder 解析与实现
  • EasyExcel动态映射Excel数据到任意实体类教程
  • 会议记录|MAS Lab 年度组会记录
  • 低代码开发与数据库:数字化转型的新引擎
  • SpringBoot 集成 kafka
  • Leetcode199二叉树的右视图(java实现)
  • SQLite 创建表:一场数据库里的“造物运动”
  • CAN总线简介
  • [case10]使用RSQL实现端到端的动态查询
  • 【Linux系统编程】快速查找errno错误码信息
  • 4. 路由到控制器 - Laravel从零开始教程
  • AngularJS指令开发(1)——参数详解
  • conda常用的命令
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ESLint简单操作
  • express如何解决request entity too large问题
  • in typeof instanceof ===这些运算符有什么作用
  • Java多线程(4):使用线程池执行定时任务
  • java正则表式的使用
  • log4j2输出到kafka
  • MQ框架的比较
  • PHP 小技巧
  • text-decoration与color属性
  • vue总结
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 动态魔术使用DBMS_SQL
  • 分享一份非常强势的Android面试题
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 简单易用的leetcode开发测试工具(npm)
  • 免费小说阅读小程序
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 正则表达式-基础知识Review
  • #if等命令的学习
  • (~_~)
  • (1)(1.11) SiK Radio v2(一)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (补)B+树一些思想
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (算法)前K大的和
  • (算法)区间调度问题
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (轉)JSON.stringify 语法实例讲解
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .bat批处理(四):路径相关%cd%和%~dp0的区别