ARM开发之SD卡文件系统读写

yummy 阅读:1203 2022-05-04 16:57:22 评论:0

一、实验目的

调用原语输出单端信号转差分信号逻辑输出。差分信号输出逻辑为:输入一个信号,输出互为相反的两个信号。

二、ZYNQ工程建立

三、新建bd以及ZYNQ处理器IP调用

  1. 新建bd文件

    image.png

  2. 添加IP模块

    image.png

  3. 双击打开配置模式,在PS-PL Configuration->general->Enable Clock Resets,(找不到请右边下拉菜单) 取消勾选 FCLK_RESET_N。Zynq提供了四个对外输出的复位信号,低有效。我们不需要,因 为我们本例程没有FPGA部分设计。然后在general->AXI non secure enablement->GP Master AXI interface下,取消掉M AXI GP0 interface。这里我们也没有任何用到连接其他 模块的总线接口,所以也不需要。

    image.png

  4. 首先,我们需要添加对SD卡的接口支持。我们在ZYNQ和IP配置中,需要配置勾选SD0。我们 再查看一下原理图,引脚位于MIO 40-45:

    image.png

    image.png

  5. 修改BANK电压为1.8v,由于PS的zynq处理器有两个bank,一个为3.3v,另一个为1.8v, 而SD0挂载到了1.8V的bank。关于bank,FPGA的资源都是以BANK区域为单位,对应的 BANK电源也是有专门的引脚区分。关于我们的ZYNQ7010和7020,处理器PS有两个bank, 一个是bank0(原理图相关引脚以500命名),一个是bank1(原理图相关引脚以500命名), 大家可以看一下原理图的电源部分ZYNQ的芯片引脚连接的电源。

    image.png

    image.png

  6. Clock configuration下,PL Fabric clocks,有四个对外提供的时钟。这四个也是给 FPGA提供的,我么也不需要,将其勾选掉

    image.png

  7. DDR3配置,程序运行是在DDR3上运行,所以不能配置错误。这里我们配置型号和位 宽如下图所示,型号是MT41J256M16 RE-125,位宽是16位。请一定要确认,否则程序无法 运行或下载到DDR3上。

  8. image.png


  1. 9. 最后点击OK完成设置。回到Diagram界面,我们点击Diagram上方的Run Block Automation进行自动模块连接操作


      10 .回到Sources,我们在Design_1右键,点击Generate Output Products输出生成相关文件。包括bd图表文档里面所有IP核的例化硬件代码文件,仿真相关文件等。


      11.等待生成完成之后,我们再次design_1图表文件右键点击Create HDL Wrapper自动创建工程的顶层例化文件。

      12. export hardware导出硬件。导出硬件也无需bit文件。

四、SDK下的代码开发

 1. 我们launch sdk启动SDK。新建工程,名为sdcard_fatfs。选择工程模板也选择helloword模 板,因为也是用到了串口进行打印输出信息。完成工程新建后,我们设置一下支持包工程。在左边工程栏,sdcard_fatfs_bsp工程右键,选择Board Support Packege Settings进入板级 支持包设置:

image.png

2. 配置界面打开如下,我们勾选xilffs,也就是对FAT的文件系统支持库,点击OK:

image.png

3.照一张TF卡,格式化成FAT32:

右键开始图标,找到磁盘管理,点击进去。

点击sd卡的磁盘分区,每个分区右键,选择删除卷,直至全部删除完,sd卡格式化完成。

4.格式化完成之后,插入开发板中,将代码写入helloworld.c文件中。

 * ------------------------------------------------

 * | UART TYPE   BAUD RATE                        |

 * ------------------------------------------------

 *   uartns550   9600

 *   uartlite    Configurable only in HW design

 *   ps7_uart    115200 (configured by bootrom/bsp)

 */


#include <stdio.h>

#include "platform.h"

#include "xil_printf.h"

#include "xdevcfg.h"

#include "xparameters.h"

#include "ff.h"


int SD_Init(void);

int Sd_Test_Write(void);

int Sd_Test_Read(void) ;



int main()

{

    init_platform();


    print("zynq_sd_card_fatfs_test\n\r");


    SD_Init();


    Sd_Test_Write();


    Sd_Test_Read();


while(1)

{

;

}

    cleanup_platform();

    return 0;

}

static FATFS fatfs ;

//sd卡初始化

int SD_Init()

{

FRESULT rc ;

rc = f_mount(&fatfs,"",0);

if(rc)

{

xil_printf("ERROR:f_mount returned %d\r\n",rc);

return XST_FAILURE;

}

return XST_SUCCESS ;

}

//sd卡写函数

int Sd_Test_Write()

{

FIL fil;

FRESULT rc;

UINT br;

const char src_str1[] = "hsp test sd card write and read line1 string. if you see this message,sd_card fatfs test ok!\n";

rc = f_open(&fil,"test.txt",FA_WRITE|FA_CREATE_NEW);

if(rc)

{

xil_printf("ERROR : f_open returned %d\r\n",rc);

return XST_FAILURE;

}

rc = f_write(&fil,src_str1,sizeof(src_str1),&br);rc = f_sync(&fil);

rc = f_close(&fil);

}

//sd卡读函数

int Sd_Test_Read()

{

FIL fil;

FRESULT rc;

UINT br;

const char src_str[4096]={0};

rc = f_open(&fil,"test.txt",FA_READ);

if(rc)

{

xil_printf("ERROR : f_open returned %d\r\n",rc);

return XST_FAILURE;

}

rc = f_lseek(&fil, 0);

rc = f_read(&fil,src_str,4096,&br);

rc = f_read(&fil,src_str,4096,&br);

rc = f_close(&fil);


}

5.将开发板连接电脑

替换完成之后,SDK里面直接按ctrl+s保存之后会自动编译,不用认为点击编译代码。编 译代码状态会在SDK右下角显示进度。我们等待状态完成并且消失即便以完成可以debug。我 们点击工具栏下方的小虫子,然后还是选择第一个,弹出的对话框点击OK。打开terminal, 设置为串口,COM11,波特率115200,连接串口,点击启动运行。 最后,打印信息可以看到,输出了我们写入新创建的文件类容,读出来为正确。也没有打 印任何错误信息,所以测试OK。


本文 zblog模板 原创,转载保留链接!网址:http://www.xn--zqqs03dbu6a.cn/?id=51

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。