资源描述
基于spi-flash的fatfs配置(完整资料)
(可以直接使用,可编辑 优秀版资料,欢迎下载)
基于spi-flash的fatfs配置
——王京石
硬件平台:stm32f103VCT6、w25x16
软件平台:fatfs R0。10
ﻩ由于产品需要存储大量数据,stm32单片机存储有限需要使用外部flash辅助存储。考虑各方面原因最后选用了一款spi-flash型号为w25x16,spi总线操作,拥有2M的存储单元。为了方便,我们想到了使用文件系统fatfs.此文档记录了配置流程,为以后做参考.
一、 底层移植
Fatfs的diskio.c与diskio。h文件用于兼容底层接口,主要配置过程就是重写 disk_initialize、disk_status、disk_read、disk_write、disk_ioctl、get_fattime六个函数以兼容不同的硬件设备。
1、设备初始化 DSTATUS disk_initialize (BYTE pdrv)
ﻩ用于初始化硬件设备,在本次项目中主要就是初始化SPI总线接口,这个底层函数在执行应用层的open、write、read等函数是都会被执行.本项目没有对flash进行分区操作,因此设备号应该为0。
DSTATUS disk_initialize (
BYTE pdrv ﻩ/* Physical drive nmuber (0..) */
)
{ﻩ
if(pdrv == 0) //设备号为0则进行初始化操作
{
ﻩﻩSPI_Flash_Init();
ﻩﻩreturn 0; //返回0表示成功
ﻩ}
else
{
return STA_NODISK;
}
}
2、读取设备状态 DSTATUS disk_status (BYTE pdrv);
ﻩ用于读取设备状态,判断设备是否处于空闲状态,由于本项目使用的存储单元为spi—flash所以始终是可以操作的状态,因此始终返回OK就可以。
DSTATUS disk_status (
ﻩBYTE pdrv ﻩ/* Physical drive nmuber (0。。) */
)
{
if(pdrv == 0) return 0;
else return STA_NODISK;
}
3、读扇区操作
DRESULT disk_read (
BYTE pdrv,ﻩﻩ/* 物理设备号 */
BYTE *buff, ﻩ/* 读取数据缓冲 */
DWORD sector, /* 扇区号 */
ﻩUINT count ﻩ/* 读取的扇区个数(1-128) */
)
使用读操作在指定扇区里读取出数据。
DRESULT disk_read (
ﻩBYTE pdrv,ﻩ /* Physical drive nmuber (0..) */
ﻩBYTE *buff, ﻩ/* Data buffer to store read data */
DWORD sector,ﻩ/* Sector address (LBA) */
ﻩUINT countﻩ /* Number of sectors to read (1..128) */
)
{
if(pdrv != 0) return RES_WRPRT;
ﻩSPI_Flash_Read(buff, ((uint32_t)sector) << 12, ((uint32_t)count) <〈 12);
ﻩreturn RES_OK;
}
4、写扇区操作DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);
使用写操作在指定扇区里写入相应数据,再写入之前必须要擦除扇区。由于w25x16最小的擦除块为4096字节,因此将fatfs的扇区定义为4096,而w25x16一次性写入256字节数据,因此每个扇区需要写入八次数据.
DRESULT disk_write (
ﻩBYTE pdrv,ﻩﻩ /* Physical drive nmuber (0。.) */
ﻩconst BYTE *buff, /* Data to be written */
ﻩDWORD sector, ﻩ/* Sector address (LBA) */
UINT countﻩ /* Number of sectors to write (1。。128) */
)
{
ﻩBYTE *buf = (uint8_t*)buff;
ﻩuint32_t secAddr = ((uint32_t)sector) 〈< 12;
ﻩuint8_t i;
if(pdrv != 0) return RES_WRPRT;
ﻩfor(i=0; i 〈 count; i++)
{
ﻩ SPI_Flash_Erase_Sector(sector);
sector ++;
ﻩSPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩﻩSPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩSPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩ SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩ SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩ SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩﻩSPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩﻩSPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩSPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩﻩSPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩSPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩﻩSPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩSPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩ SPI_Flash_Write_Page((uint8_t*)buf, secAddr, 256);buf += 256;secAddr += 256;
ﻩ}
return RES_OK;
}
5、磁盘控制函数 DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);
主要用于应用层程序同步磁盘、获取扇区大小、获取磁盘总扇区数、磁盘擦除块大小与擦除操作等功能。注意通过数组buff带入或是带出的参数必须要格式匹配。
#if _USE_IOCTL
DRESULT disk_ioctl (
ﻩBYTE pdrv, /* Physical drive nmuber (0.。) */
ﻩBYTE cmd,ﻩ /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
ﻩif(pdrv != 0) return RES_WRPRT;
switch(cmd)
{
case CTRL_SYNC : //spi-flash不需要同步,这一项始终返回0
ﻩreturn RES_OK;
ﻩcase GET_SECTOR_SIZE :
*((WORD *)buff) = 4096; //始终通过buff返回扇区大小就可以了
ﻩreturn RES_OK;
case GET_SECTOR_COUNT :
ﻩ *((DWORD *)buff) = 512; //始终通过buff返回总扇区数就可以了
return RES_OK;
case GET_BLOCK_SIZE : //禁止擦除功能,这两项无意义
ﻩ return RES_OK;
case CTRL_ERASE_SECTOR :
return RES_OK;ﻩ}
6.获取时间 DWORD get_fattime (void)
在写操作时需要调用的函数,如果需要真实的时间信息则使用RTC始终读出时间信息通过这个函数返回,本项目中不需要时间因此始终返回0就可以了.
/* RTC function */
#if !_FS_READONLY
DWORD
get_fattime (void)
{
return 0;
}
#endif
二、 fatfs配置
在移植完底层之后还需要根据需求配置fatfs,修改各种配置宏是主要的配置手段.
1、配置数据类型
首先我们应该配置的是数据类型,因为fatfs需要运行在各种硬件平台上,而不同位数的机器数据类型的结构也不一样,因此需要统一数据类型,这一配置在integer中完成.
typedef unsigned char BYTE; //BYTE配置为8位无符号类型
typedef shortﻩﻩﻩSHORT; //16位有符号类型
typedef unsigned short WORD;//16位无符号类型
typedef unsigned shortﻩWCHAR;//16位无符号类型
/* These types MUST be 16 bit or 32 bit */
typedef int INT; //32位有符号类型
typedef unsigned int UINT; //32位无符号类型
/* These types MUST be 32 bit */
typedef long ﻩLONG; //32位有符号类型
typedef unsigned longﻩDWORD;//32位无符号类型
2、配置宏定义
Fatfs的配置宏主要在文件ffconf。h中.接下来让我们一个一个分析这些宏.
#define _FS_TINYﻩ 1
0 正常模式 1小型模式
小型模式,主要用于内存资源不丰富的微控制器,在这里我们选1配置为小型模式
#define _FS_READONLYﻩ0ﻩ
0 可读可写
1 只读
配置文件系统位只读文件系统,这里选0
#define _FS_MINIMIZEﻩ3 /* 0 to 3 */
0 使能所有功能函数
1 f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_chmod(), f_utime(),
f_truncate() and f_rename()函数被禁止
2 除了1之外 f_opendir(), f_readdir() and f_closedir()也被禁止
3 除了2之外f_lseek()也被禁止
用于剪裁文件系统,删除不需要的功能,这里选3
#define _USE_STRFUNC 0ﻩ/* 0:Disable or 1-2:Enable */
0 禁止字符串功能
1 使能字符串功能
若使能字符串功能,则可以使用f_gets ,f_putc,f_puts,f_printf等函数,这里选禁止
#define _USE_MKFSﻩ 1 /* 0:Disable or 1:Enable */
0 禁止格式化
1 使能格式化
若选1则可以使用函数f_mkfs函数格式化磁盘,这里选1
#defineﻩ_USE_FASTSEEKﻩ0ﻩ/* 0:Disable or 1:Enable */
0 禁止快速查找功能
1 使能快速查找功能
使能或禁止快速查找功能,这里选禁止
#define _USE_LABEL 0ﻩ/* 0:Disable or 1:Enable */
0 禁止卷标功能
1 使能卷标功能
使能或禁止卷标功能,这里选禁止
#define _USE_FORWARDﻩ0 /* 0:Disable or 1:Enable */
0 禁止f_forward()函数
1 使能f_forward()函数
使能或禁止f_forward()函数,f_forworad()函数用于将文件信息发送到一个数据流设备上去,这里禁止.
/*-—----———-——---—--———-————--——--—--—---—-----------—---—----—-———-—-—--—---/
/ 语言环境配置
/—--——----—-—---—---—----——----————-—-----——-—-----—-—-—-—----—--------—--—-—*/
#define _CODE_PAGEﻩ932
配置语言编码,这里保持默认
#define _USE_LFNﻩ0ﻩ /* 0 to 3 */
#define _MAX_LFNﻩ255ﻩ /* Maximum LFN length to handle (12 to 255) */
/* _USE_LFN 用于使能长文件名功能,
/
/ 0: 禁止长文件名功能。 _MAX_LFN 没有意义;
/ 1: 使能长文件名功能,文件名存储在BSS段中,不可重入;
/ 2: 使能长文件名功能,文件名存储在栈中;
/ 3: 使能长文件名功能,文件名存储在堆中;
/
#defineﻩ_LFN_UNICODEﻩ0ﻩ/* 0:ANSI/OEM or 1:Unicode */
0 ANSI/OEM编码
1 Unicode编码(支持中文)
用于切换文件名编码,这里选0
#define _STRF_ENCODE 3 /* 0:ANSI/OEM, 1:UTF-16LE, 2:UTF—16BE, 3:UTF-8 */
这个选项用于选择 文件字符操作时的编码,禁止unicode时此选项无效
#define _FS_RPATHﻩ 0ﻩ/* 0 to 2 */
0 禁用相对路径功能,并卸载这个功能
1 使能相对路径功能
禁止或使能相对路径功能,这里禁止
/*———---—-—--—-——-—-——--——-———-—-————-—----——-------—--—-—---—---—--—-—-—--—-/
/ 设备配置
/----———----—-———--———--—--—--—-----—------—-------——--————-—----—-—-------——*/
#define _VOLUMES 1
用于定义磁盘中卷的数量
#define _MULTI_PARTITIONﻩ0 /* 0:Single partition, 1:Enable multiple partition */
0 单分区模式
1 多分区模式
若使能多分区模式则可以使用f_fdisk函数对设备进行分区,这里禁止
#defineﻩ_MAX_SS 4096ﻩﻩ/* 512, 1024, 2048 or 4096 */
定义扇区大小,可选的值位 512 1024 2048 4096
#defineﻩ_USE_ERASE 0 /* 0:Disable or 1:Enable */
0 禁止扇区擦出功能
1 使能扇区擦除功能
禁止或使能扇区擦除功能,这里选禁止
#define _FS_NOFSINFO 0 /* 0 or 1 */
若选1则可以使用f_getfree()获取卷中剩余的空间大小,这里不适用
/*—---------—--——--——---———-—-—--——-——-——---—---—-——--—-—-—-—-—--——----—---——/
/系统配置
/-—--—-----——-----—--—-----—---——--—--———--——---—--—-——-———--—--—--—-—----——-*/
#define _WORD_ACCESS 0ﻩ/* 0 or 1 */
如果硬件平台为小端模式则选择1
华北电力大学
实 验 报 告
实验名称基于SNMP的网络管理软件的配置与使用
课程名称网络管理
专业班级:学生姓名:
学 号: 成 绩:
指导教师:实验日期:
(一)基于SNMP的网络管理软件的配置与使用
一、实验目的
1.熟悉路由器和交换机并掌握路由器和交换机的基本配置方法和配置命令。
2。练习构建一个由四个路由器和四台主机构成的网络.
3.操作SiteView NNM管理系统,掌握如何添加网元,构建管理系统,并每一个可被管理的设备进行操作。
4.掌握网络管理软件的使用方法,实现对网络的拓扑发现实时监控,告警设置:
1).应用Siteview软件进行拓扑发现。通过自动和手动两种方式实现。
2)。基于SNMP的实时监控.对设备,链路,端口等进行相应的监控.
3).进行告警设置(告警方式)。通过对不同设备,条件等进行告警设置。
二、实验环境
计算机4台、路由器4台、交换机4台、SiteView NNM网络管理软件系统.
三、实验原理
网络设备只有配置了SNMP协议以后,才能够通过SNMP进行监控和管理,因此,使用网络管理软件之前,需要对所有设备进行配置。主要包括: 1)主机SNMP配置; 2)路由器SNMP配置; 3)交换机SNMP配置.
四、实验步骤:
1、局域网的实现与配置:
网络拓扑图:
路由配置:
1)IP分配:
四台PC的本地连接2的IP分别为:
PC1:222.1.3.5 PC2:222.1.2.5
PC3:222.1。1。5 PC4:222。1.4.5
本地连接1 IP:
PC51:192.168。1.21 PC52:192.168.1。22
PC53:192。168.1.23 PC54:192.168.1.24
2)地址分配:
路由器R1 S2端地址:222.1。6。1
路由器R1 S3端地址:222.1.7.1
路由器R1与路由器R2间的地址:222.1.6.0
路由器R1与两层交换机1间接口G1 地址:222.1.3.1
路由器R2 S2端地址:222。1.6。2
路由器R2 S3端地址:222.1.5.1
路由器R2与路由器R3间的地址:222。1。5.0
路由器R2与两层交换机2间的地址:222。1。2.1
路由器R3 S3端地址:222。1。8.1
路由器R3与路由器R4间的地址:222.1.8.0
路由器R4 S2端地址:222。1.8。2
路由器R4 S3端地址:222.1.7.2
路由器R4与路由器R1间的地址:222.1。7.0
路由器R4与交换机间的地址:222。1.4.1
PC1地址:222.1.3.5 网关:222.1.3。2
PC2地址:222。1。2。5 网关:222.1.2。2
PC3地址:222。1.1。5 网关:222.1.1。2
PC4地址:222。1.4.5 网关:222.1.4。2
3)路由器的配置
路由器R1的配置(代码):
R1 (config)# interface S 2/0
R1(config-if)# ip address 222.1.6.1 255.255。255。0
R1(config-if)#exit
R1(config)# interface S 3/0
R1(config—if)# ip address 222.1.7。1 255。255.255。0
R1(config—if)#exit
R1(config)# interface gi 0/1
R1(config-if)# ip address 222。1。3。1 255.255。255。0
R1(config-if)#exit
R1(config)# router rip
R1(config-router)#network 222。1。6.0
R1(config-router)#network 222。1.7。0
R1(config—router)#network 222.1.3。0
R1(config—router)#end
路由器R2的配置(代码):
R2 (config)# interface S 2/0
R2(config-if)# ip address 222。1。6。2 255。255.255。0
R2(config-if)#exit
R2(config)# interface S 3/0
R2(config-if)# ip address 222。1.5.1 255.255.255.0
R2(config—if)#exit
R2(config)# interface gi 0/1
R2(config-if)# ip address 222.1。2.1 255.255.255。0
R2(config-if)#exit
R2(config)# router rip
R2(config—router)#network 222.1。6。0
R2(config—router)#network 222.1.5.0
R2(config-router)#network 222.1.2.0
R2(config—router)#end
路由器R3的配置(代码):
R3 (config)# interface S 2/0
R3(config-if)# ip address 222。1.5。2 255.255.255.0
R3(config-if)#exit
R3(config)# interface S 3/0
R3(config-if)# ip address 222.1.8.1 255。255.255。0
R3(config—if)#exit
R3(config)# interface gi 0/1
R3(config—if)# ip address 222。1。1。1 255.255.255。0
R3(config—if)#exit
R3(config)# router rip
R3(config-router)#network 222.1.5。0
R3(config-router)#network 222.1.8。0
R3(config—router)#network 222.1。1。0
R3(config—router)#end
路由器R4的配置(代码):
R4 (config)# interface S 2/0
R4(config—if)# ip address 222。1.8。2 255。255。255。0
R4(config—if)#exit
R4(config)# interface S 3/0
R4(config-if)# ip address 222。1。7。2 255.255.255.0
R4(config—if)#exit
R4(config)# interface gi 0/1
R4(config—if)# ip address 222.1.4。1 255。255.255.0
R4(config—if)#exit
R4(config)# router rip
R4(config-router)#network 222。1.8.0
R4(config-router)#network 222.1。7。0
R4(config-router)#network 222.1.4。0
R4(config-router)#end
交换机配置:
R1交换机的配置(代码):
Ruijie<config〉#interface vlan1
Ruijie〈config—if-VLAN 1 >#ip address 222.1.3。2 255。255。255。0
Ruijie<config-if—VLAN 1 〉#exit
R2交换机的配置(代码):
Ruijie<config>#interface vlan1
Ruijie〈config-if—VLAN 1 >#ip address 222.1。2.2 255.255。255.0
Ruijie<config—if-VLAN 1 >#exit
R3交换机的配置(代码):
Ruijie〈config〉#interface vlan1
Ruijie<config-if-VLAN 1 >#ip address 222.1.1.2 255.255.255.0
Ruijie〈config—if-VLAN 1 >#exit
R4交换机的配置(代码):
Ruijie<config〉#interface vlan1
Ruijie<config-if—VLAN 1 〉#ip address 222。1。4。2 255.255.255.0
Ruijie〈config-if-VLAN 1 >#exit
在网络配置好之后,通过ping命令来查看网络是否连通,测试网络的连通性。测试结果:
由图可知:本机到其他机子的网络已全部连通,局域网构建完成.
2、主机SNMP配置
设置管理者(Manager)和代理者(Agent)的动态分布式处SNMP服务控制面板—管理工具-服务,实时性好。它所具有的图形化界面,各种生动形象而又简单的图形操作。(如图所示)
控制面板—管理工具
3、 路由器交换机SNMP配置Router〉enable Router# configure terminal Router(config)# snmp—server community public ro Router(config)# snmp—server community private rw Router(config)# snmp-server enable trap Router(config)# snmp-server host 222.1。3。5 rw
4、SiteView NNM的安装与使用:
(1)拓扑图管理,扫描网络。
(2)IP资源管理,端口连接设备,IP网段分配统计。
(3)设备管理,添加连线,全网设备统计。
(4)监测报表, 端口分析,多端口对比分析,
(5)告警设置。
扫描网络:
设置扫描参数,搜索深度为2,并行线程数为100,重试次数为1,超时时间为200毫秒。
设置扫描范围,添加允许的地址范围为222.1.0。0~222.1.9.0。
结果如下图所示:
设备端口状态实时分析:
端口分析:
多端口对比分析:
端口月报表:
告警设置:
五、实验总结:
本次实验比较复杂,先要设计好网络拓扑图,配置好路由交换机器,然后编写代码分配地址,构成局域网,在网络连通的情况下配置SNMP。整个过程耗时较长,在实验过程中也遇到了一些困难,但在同学与老师的帮助下,最终实现了网络的合理分配。
通过本次实验,让我对网管软件有了一个新的认识,能让在课堂上学到的东西在实际生活中体现出来,使课本知识得到了实际化,同时在实验过程中也学到了许多课本上没有的东西,使我感触颇深。
本科毕业论文(设计)
题 目 基于matlab的单缝衍射
和双缝干涉可视化模拟
学生姓名
学 号
系 别 物理学与电子信息工程系
年 级 08级
专 业 物理学
指导教师
职 称
完成日期
闽江学院毕业论文(设计)诚信声明书
本人郑重声明:
兹提交的毕业论文(设计)《基于matlab的单缝衍射和双缝干涉可视化模拟》,是本人在指导老师 许鸿鹤,李玉良 的指导下独立研究、撰写的成果;论文(设计)未剽窃、抄袭他人的学术观点、思想和成果,未篡改研究数据,论文(设计)中所引用的文字、研究成果均已在论文(设计)中以明确的方式标明;在毕业论文(设计)工作过程中,本人恪守学术规范,遵守学校有关规定,依法享有和承担由此论文(设计)产生的权利和责任。
声明人(签名):
2012年 05月10日
基于matlab的单缝衍射和双缝干涉可视化模拟
摘要:使用matlab处理复杂数学方程并模拟物理图像的方法极大的丰富了物理的教学手段和学习方式,其中夫琅禾费单缝衍射和双缝干涉就属于物理光学中较为抽象的规律,本文通过对这两种实验在不同条件下的光强曲线和条纹分布的变化情况进行matlab仿真,并生成一系列的模拟图像。借此帮助学习者能够较好的理解夫琅禾费单缝衍射和双缝干涉,也有利于对实验的指导。
关键词:matlab;物理图像;夫琅禾费单缝和双缝干涉
Abstract:the use of matlab to deal with complex mathematical equation and simulation method of physical images greatly enriched the physics teaching method and way to learn. Fraunhofer's single-slitdiffraction and the double-slit interference will belong to physical optics rather abstract rules, this article according to the two experiments' changes of the light’s strength andstripes under different conditions used thematlab simulation to produce a series of images.I hope it can not only to help students to better understand the Fraunhofer's single slit diffraction and the double—slit interference, but also to the guidance of the experiment.
Key word:matlab; physical images ;Fraunhofer’s single-slit andthe double—slit interferenceexperiment
目录
1 引言。。。....。..。。..。.........。。。。.。。.....。..。。。。。...。.。.........。。。。.。。...。。。。...。。2 2 夫琅禾费单缝衍射。...。.。..。..。...。...。。。.。。。....。....。.。.。.。...。.。。。。。.。.。4
2.1实验分析...。.。.。。...。。。。.。。..。.。...。..。.。。....。。。。.。....。...。...。。。。..。.。4
2.1。1夫琅禾费单缝衍射条纹与光强分布...。....。。...。.。。。。。...。....。。。...。..。4
2。1。2不同缝宽与入射光对结果的影响。...。....。。..。.。。...。.。.。。。.......。.。。..。.7
2.2实验模拟..。....。。。.。...。.。.....。...。。.。...。。。....。。。.。...。。..。.。..。......。。...。.。.。。10
2。2。1夫琅禾费单缝衍射条纹与光强图样.。.。.。。。..。..。.....。。.。.....。.。。...。.10
2.2.2不同缝宽下的条纹与光强图样...。..。...。.。.。...。..。。...。...。....。....。..13
展开阅读全文