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

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值