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

如何使用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);
  }


http://www.kler.cn/a/286549.html

相关文章:

  • 深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据
  • PySide(PyQT)进行SQLite数据库编辑和前端展示的基本操作
  • SQL注入漏洞之高阶手法 宽字节注入以及编码解释 以及堆叠注入原理说明
  • 获取snmp oid的小方法1(随手记)
  • QT 通过ODBC连接数据库的好方法:
  • “AI视频智能分析系统:让每一帧视频都充满智慧
  • 原来这就是 布隆过滤器
  • 【JS】async函数返回promise
  • VR虚拟驾驶未来发展_vr自动驾驶汽车所带来的改变
  • 一次bad udp checksum故障
  • 深度解析CancellationToken在HttpClient请求中的应用
  • 【Python】数据容器
  • 从文本坐标数据转换为矢量(点线面)
  • 微服务间调用
  • sqlserver数据库常见操作
  • 自闭症孩子的康复治疗方法
  • javaEE
  • ISIS路由渗透
  • MyBatis 源码解析:SqlSessionFactoryBuilder 解析与实现
  • LeetCode15. 三数之和(2024秋季每日一题 8)
  • Navicat连接Mongodb成功了,但是无法显示数据库怎么办?
  • 第三十九篇-TeslaP40+CosyVoice-安装
  • tornado获取请求参数
  • 2408wtl,玻璃类
  • 构建大师:深入理解Linux下的Make和Makefile
  • 火焰传感器详解(STM32)