STM32F429之五:nandflash+文件系统

1.nandflash初始化

    包含两部分:1.位宽等、延时与cpu无关的参数设置;2.与cpu有关的引脚初始化。(可直接参考例程)

2.文件系统格式化

1.首先分为两个区,用户区和系统区。 0:用户区; 1:系统区

2.坏块管理:擦除块,并建立逻辑块到物理块的转换表 vtable,逻辑分区小于物理分区,因为可能存在坏块。

3.将转换表保存在数据区

4.挂载用户区 f_mount(0, &usrfs); -> FatFs[vol] = fs;

5.创建用户区文件系统 f_mkfs(0, 0, 4096); ->disk_write -> nand_flash_write(nand_usr, sector, temp, count);根据分区选择不同资源,进而操作不同分区。

void nand_flash_create_fs(void)
{
    int i;
    int block = 1;
    unsigned char ret = 0;
    unsigned char buff[2048] = {'F','O','R','M','A','T',};
    
    ret = NF_EraseBlock(0); //擦除第一个块

    if (ret&0x1)
    {
        printf("Block 0 is error\r\n");
        return;
    }

    vtable[0] = 0; //转换表

    for (i=1; i<BLOCK_NUM_TOTAL; i++)
    {
        ret = NF_EraseBlock(i<<6);
        if (ret&0x1)
        {
            continue; //坏块就跳过
        }
        
        vtable[block] = i;  //块转换表,逻辑块block对应物理块i(好块)
        block++;

        if (block > BLOCK_NUM_SYS+BLOCK_NUM_USR+1)
        {
            break;
        }
    }

    block = 0;
    for (; i<BLOCK_NUM_TOTAL; i++)
    {
        ret = NF_EraseBlock(i<<6);
        if (ret&0x1)
        {
            continue;
        }
        
        goodblock[block] = i; //系统空间和用户空间外的剩余好块
        block++;
    }


    //以下都存放在系统区,未被格式化文件系统。读取和写入都不经过文件系统而直接读写。
    NF_WritePage(0, buff); //格式化后标记
    NF_WritePage(1, (unsigned char*)vtable); //保存转换表
    NF_WritePage(2, (unsigned char*)(vtable+1024));
    NF_WritePage(3, (unsigned char*)goodblock);

    printf("Write block system ok\r\n");

    /*
      分区:0表示用户区,1表示系统区
    */
    ret = f_mount(0, &usrfs);  //挂载文件系统,用户区
    if (ret)
    {        
        printf("Error: mount user fs!(%d)\r\n", ret);
        ret = 0;
    }
    /*创建文件系统,0:逻辑驱动器号(用户区);0:格式化方式; 4096:簇大小,最小存储空间
    */
    ret = f_mkfs(0, 0, 4096); 
    if (ret)
    {
        printf("Error: make user file system!(%d)\r\n", ret);
        ret = 0;
    }

    printf("after make fs\r\n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值