ARM开发之SD卡文件系统读写
一、实验目的
调用原语输出单端信号转差分信号逻辑输出。差分信号输出逻辑为:输入一个信号,输出互为相反的两个信号。
二、ZYNQ工程建立
三、新建bd以及ZYNQ处理器IP调用
新建bd文件
添加IP模块
双击打开配置模式,在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。这里我们也没有任何用到连接其他 模块的总线接口,所以也不需要。
首先,我们需要添加对SD卡的接口支持。我们在ZYNQ和IP配置中,需要配置勾选SD0。我们 再查看一下原理图,引脚位于MIO 40-45:
修改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的芯片引脚连接的电源。
Clock configuration下,PL Fabric clocks,有四个对外提供的时钟。这四个也是给 FPGA提供的,我么也不需要,将其勾选掉
DDR3配置,程序运行是在DDR3上运行,所以不能配置错误。这里我们配置型号和位 宽如下图所示,型号是MT41J256M16 RE-125,位宽是16位。请一定要确认,否则程序无法 运行或下载到DDR3上。
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进入板级 支持包设置:
2. 配置界面打开如下,我们勾选xilffs,也就是对FAT的文件系统支持库,点击OK:
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.作者投稿可能会经我们编辑修改或补充。