实验指导Word格式.docx
- 文档编号:22250363
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:29
- 大小:1.54MB
实验指导Word格式.docx
《实验指导Word格式.docx》由会员分享,可在线阅读,更多相关《实验指导Word格式.docx(29页珍藏版)》请在冰豆网上搜索。
例如:
一个字到FLASH(WordProgram),需要4个周期。
如将地址为DSPRamStart的随机存储器单元内容复制到FLASH的FlashStart单元,编程如下:
*(FlashStart+0x5555)=0xAA;
*(FlashStart+0x2AAA)=0x55;
*(FlashStart+0x5555)=0xA0;
*(FlashStart)=*(DSPRamStart);
3.实验功能分析
在《main_EXRAM.C》中,读写外部RAM与读写普通的存储器方法相同。
在《main_NOR_FLASH.C》中读FLASH与普通存储器没有区别,但写FLASH等操作需要发送相应的命名。
为叙述方便,将RAML7前半部分存储器简称为A,后半部分简称为B,FLASH存储器简称为C,外部RAM存储器简称为D。
主函数的主要功能为
(1)初始化外部接口为16位的总线接口(InitXintf());
(2)A初始化为0~0x3FF(InitRam(0));
(3)擦除C(ChipErase();
execute_150ms);
(4)将A数据复制到C(写FLASH)(FlashWrite(0,0,0x400));
(5)将B清零(EraseRam(0x0));
(6)将C数据复制到B(读FLASH)(FlashRead(0,0,0x400));
图4EXRAM及FLASH存储器分布简图
四、源程序分析
1.延迟函数
原型:
voiddelay_loop(Uint32x)
2.擦除整个FLASH数据函数
Uint16ChipErase(void)
//FLASH芯片地址接在ZONE6段,地址从0x100000开始
//FlashStart=0x100000
//擦除整个FLASH,擦除后,每个单元均为0xFFFF
//函数返回0:
擦除完成(EraseOK=0)
//函数返回1:
擦除超时退出(TimeOutErr=1)
//函数返回3:
擦除错误(EraseErr=3)
3.将RAML7的数据写到FLASH函数
Uint16FlashWrite(Uint32RamStart,Uint32RomStart,Uint16Length)
//DSPRamStart=0x00F000
//RAML7起始偏移地址:
RamStart
//FLASH起始偏移地址:
RomStart
//复制数据个数:
Length
全部写到FLASH完成(WriteOK=0)
//函数返回2:
写数据错误(VerifyErr=2)
4.读FLASH的数据,复制到RAML7后半部分函数
voidFlashRead(Uint32RamStart,Uint32RomStart,Uint16Length)
//DSPRamStart2=0x00F800
5.初始化RAML7前半部分寄存器函数
voidInitRam(Uint16Start)
//从RAML7前半部分的偏地址:
start,单元数为0x400
//初始化值为0~0x3FF,单元个数为0x400。
6.擦除RAML7的后半部分数据函数
voidEraseRam(Uint16Start)
//从RAML7后半部分的偏地址:
//初始化值:
全0,单元个数为0x400。
7.擦除RAML7的后半部分数据函数
voidRamRead(Uint16Start)
//将RAML7的前半部分数据复制到RAML7的后半部分函数
//DSPRamStart2=0x00F800(RAML7的后半部分)
//将RAML7的前半部分偏移地址为start,
//复制单元数为0x400
8.《main_NOR_FLASH.C》中的主函数
voidmain(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVectTable();
InitXintf();
//初始化16位数据的外设总线
InitRam(0);
ChipErase();
execute_150ms;
FlashWrite(0,0,0x400);
EraseRam(0x0);
//RAML7后半部分从0xF800开始
FlashRead(0,0,0x400);
}
五、实验预习
完成预习报告。
六、实验过程
(一)新建实验项目
1.点击CCS软件的Project菜单下的NewCCSProject选项,如图5所示,新建一个名为“ZQ28335_ExRAMand_NOR_FLASH”的空项目,有关参数设置如图6所示。
点击EmptyProject和Finish完成项目的新建。
图5新建一个项目
图6项目参数设置
2.将参考项目文件夹中的00ic_EXRAM.c文件重命名为“main_EXRAM.c”后,复制到这个项目文件夹中。
00ic_NOR_FLASH.c文件重命名为“main_NOR_FLASH.c”后,也复制到这个项目文件夹中。
并删除“main.c”文件。
将参考项目文件夹“DSP2833x_common”和“DSP2833x_headers”也复制到这个项目文件夹中,并禁用一些不需要的文件。
注:
DSP2833x_common中已删去CMD文件夹。
DSP2833x_headers已删去CMD文件夹中的“DSP2833x_Headers_BIOS.cmd”。
4.右击项目名称,选择Properties(属性),如图7所示,点击IncludeOptions选项,添加DSP2833x_common和DSP2833x_headers中的头文件和源文件途径。
如图4所示。
图7添加文件途径
(二)扩展RAM实验
1.禁用“main_NOR_FLASH.c”文件,方法是:
在“main_NOR_FLASH.c”文件上右击选择
下的
选项。
如图8所示。
在随后出现的界面上,点击
和
按钮即可。
这时“main_NOR_FLASH.c”文件不参与编译。
图8禁用文件选项
2.点击,编译、下载程序,当程序运行到下图OK地方停止表示外部SRAM读写数据正常,否则停止在error处。
图9执行main_EXRAM停止位置
3.此时点击View->
Memory,打开内存观察窗口,输入外扩RAM起始地址0x200000,按回车键,即可看到从0x0000依次递增的数据。
图10执行main_EXRAM结果数据
(三)扩展FLASH实验
1.禁用“main_EXRAM.c”文件,方法是同禁用“main_NOR_FLASH.c”文件相同。
2.激活“main_NOR_FLASH.c”。
方法是:
在随后出现的界面上,去掉
左侧的两个小沟,点击OK即可。
3.点击,编译、下载程序,在InitRam(0)这一行设置一个断点,点击运行程序到此。
点击(单步执行),执行下面一行代码:
InitRam(0);
打开内存观察窗口,输入RAML7起始地址0xF000,按回车键,看数据是否从0x0000依次递增。
图11执行InitRam(0)结果数据
4.点击,执行下面两行代码:
ChipErase();
execute_150ms;
打开内存观察窗口,输入FLASH起始地址0x100000,按回车键,看FLASH擦除后的数据是否都是0xFFFF。
图12执行ChipErase()结果数据
5.点击,执行下面一行代码:
FlashWrite(0,0,0x400);
打开内存观察窗口,输入FLASH起始地址0x100000,按回车键,看写到FLASH的数据是否从0x0000依次递增。
若是则说明写FLASH数据完成。
图13执行FlashWrite(0,0,0x400)结果数据
6.点击,执行下面一行代码:
EraseRam(0x0);
打开内存观察窗口,输入RAML7后半部分起始地址0xF800,按回车键,看其数据是否都是0。
若是则说明写清除RAML7后半部分数据完成。
图14执行EraseRam(0x0)结果数据
7.点击,执行下面一行代码:
FlashRead(0,0,0x400);
打开内存观察窗口,输入RAML7后半部分起始地址0xF800,按回车键,看其数据是否从0x0000依次递增,若是则说明读FLASH数据正常,若否,说明函数有问题。
图15执行FlashRead(0,0,0x400)结果数据
七、课堂编程作业
先备份程序,然后修改代码。
依次完成以下操作:
1、将数值0x1234写入到存储器区间0xF000~0xF3FF中;
2、将存储器区间0xF000~0xF3FF中的值对应地复制到存储器区间0x100000~0x1003FF中;
3、将存储器区间0x100000~0x1003FF中的值对应地复制到存储器区间0x200000~0x2003FF中;
4、将存储器区间0x200000~0x2003FF中的值对应地复制到存储器区间0xF000~0xF3FF中;
查看存储器区间0xF000~0xF3FF的数值情况。
八、完成实验报告
实验二:
键盘操作实验
1.理解3*3矩阵键盘的工作原理和扫描确认方式。
2.掌握F28335中GPIO相关寄存器的功能配置。
1.3*3矩阵键盘的工作原理和扫描确认方式
当键盘中按键数量较多时,为了减少对I/O口的占用,通常将按键排列成矩阵形式,也称为行列键盘。
矩阵式键盘接口如图1所示,它由行线和列线组成,按键位于行、列的交叉点上。
当按键按下时,其交点的行线和列线接通,相应的行线或列线的电平发生变化,DSP通过检测行或列线上的电平变化可以确定哪个按键被按下。
图1F28335键盘接口图
在矩阵键盘的软件接口程序中,经常使用的按键识别方法有行列扫描法和线反转法,本项目采用列扫描法对矩阵键盘进行判别。
图1中GPIO53、GPIO52、GPIO51为3根行线,作为键盘的输入口(工作于输入方式);
GPIO50、GPIO49、GPIO48为3根列线,作为输出口(工作于输出方式),由DSP控制其输出的电平值。
按键识别的过程如下。
1)将全部列线GPIO50、GPIO49、GPIO48置低电平输出,然后读GPIO53、GPIO52、GPIO51三根输入行线中有无低电平出现。
只要有低电平出现,则说明有按键按下(实际编程时,还要考虑按键的消抖);
如果读到的电平都是高电平,则表示无按键按下。
2)在确认某行有按键按下后,需要确定具体是哪一列的按键按下。
其思路是:
依次将列线置为高电平,并检测行线的输入,如果行线的电平值由低电平变为高电平,则该列对应的按键处于闭合状态。
由此,DSP对矩阵键盘的按键识别是,采用扫描方式控制列线的输出信号和检测行线输入的信号相配合实现。
3)矩阵按键的识别仅仅是确认和定位了行和列的交叉点上的按键,接着还要考虑键盘的编码,也就是对各个按键进行编号。
在软件中常采用计算的方法或查表的方法对按键进行具体的定义和编号,本项目采用查表的方法。
在DSP系统中,键盘扫描只是DSP的工作内容之一。
DSP除了要检测键盘和处理键盘操作外,还要进行其他事务处理,因此,DSP如何响应键盘的输入需要在实际系统程序设计时根据需要考虑。
通常,可以把完成键盘扫描和处理的程序编写为一个专用子程序,DSP调用该子程序对键盘进行扫描和处理的方式有三种:
程序控制扫描、定时器扫描和中断扫描。
1)程序控制扫描方式。
在主控程序中的适当位置调用键盘扫描程序,对键盘进行读取和处理。
2)定时扫描方式
在定时扫描方式中,要使用DSP的一个定时器,使其产生一定时间(如10ms)的定时中断,DSP响应定时中断,执行键盘扫描。
当在连续两次中断中都读到相同的按键按下(间隔10ms作为消抖处理),DSP才执行相应的按键处理程序中断方式。
3)中断方式
键盘的硬件电路需要增加一个按键产生中断信号的输入线,当键盘有按键按下时,键盘硬件电路产生一个外部的中断信号,DSP响应外部中断进行键盘处理。
本项目采用程序控制扫描方式完成按键处理。
2.F28335中GPIO相关寄存器的功能配置
GPIO多路开关寄存器用于通用的GPIO复用引脚的选择,通过寄存器可以把这些引脚设置成数字I/O或外设I/O工作模式。
如果是数字I/O模式,可以用方向控制寄存器GPxDIR来配置引脚的信号传输方向。
1)GPxDAT寄存器(数据寄存器)
每个I/O口都有一个数据寄存器,数据寄存器的每一个位对应一个GPIO引脚。
向GPxDAT寄存器的写操作可以清除或设置相应的输出锁定,如果引脚被使能并作为GPIO输出引脚可以用于传输低电平信号,如果引脚没有被配置为GPIO输出引脚则不能用于传输信息。
只有引脚被配置为GPIO输出功能后,才能将被锁定的值传送到引脚。
2)GPxSET寄存器(置位寄存器)
置位寄存器用于在不影响其他引脚的情况下将指定GPIO引脚置成高电平。
每一个I/O口都有一个置位寄存器,且每一位都对应一个GPIO引脚。
置位寄存器的任何读操作均返回0。
如果相应的引脚被配置为输出,那么向置位寄存器的该位写1会将相应的引脚置为高电平。
向置位寄存器中任何位写0将没有影响。
3)GPxCLEAR寄存器(清除寄存器)
清除寄存器用于在不影响其他引脚的情况下将指定GPIO引脚置成低电平。
每一个I/O口都有一个清除寄存器,且每一位都对应一个GPIO引脚。
清除寄存器的任何读操作均返回0。
如果相应的引脚被配置为输出,那么向清除寄存器的该位写1会将相应的引脚置为低电平。
向清除寄存器中任何位写0将没有影响。
(1)按键I/O初始化(Init_KeyGpio());
(2)检测行线输入信号(Read_KX
(1);
Read_KX
(2);
Read_KX(3);
);
(3)扫描方式控制列线输出信号(Read_KY
(1);
Read_KY
(2);
Read_KY(3);
voiddelay(Uint32t);
2.初始化按键IO函数
voidInit_KeyGpio(void);
3.3列全部输出低电平函数
voidResetAllKY(void);
4.读取3行IO电平状态
voidKX_AllStatus(void);
5.读取按键所在行
voidRead_KX(Uint16x);
6.设置任意列输出高电平
voidSet_KY(Uint16x);
7.设置任意列输出低电平
voidRst_KY(Uint16x);
8.读取按键所在列
voidRead_KY(Uint16x);
9.获取按键值Key
voidGetKey(void);
1.点击CCS软件的Project菜单下的NewCCSProject选项,新建一个名为“ZQ28335_xxx”的空项目。
2.将参考项目文件夹中的00ic_3x3_KEY.c文件重命名为“main_3x3_KEY.c”后,复制到这个项目文件夹中。
3.右击项目名称,选择Properties(属性),点击IncludeOptions选项,添加DSP2833x_common和DSP2833x_headers中的头文件和源文件途径。
4.将程序中的Key添加到WatchWindow窗口。
5.点击,编译、下载,运行程序。
按下板子上S1-S9任意一个按键,然后暂停程序观察和记录Key的值。
先备份程序,然后修改程序。
完成以下功能:
按下按键S1~S8分别点亮发光二极管D10~D17;
按下S9键,将发光二极管D10~D17全部熄灭。
八、完成实验报告。
实验三:
外中断实验
1.理解F28335的中断系统。
2.掌握F28335中断的编程。
中断系统在DSP中的地位非常重要,凡是事件驱动型的数字处理系统里面都应有中断系统。
中断方式是一种灵活处理时间的方式,中断的合理安排可以提高DSP整个系统事件执行的效率。
中断是硬件和软件驱动事件,它使得CPU停止当前的主程序,并转而去执行一个中断服务子程序。
中断系统如图1所示。
图1中断系统
F28335的中断采用的是三级中断机制,分别是外设级、PIE级和CPU级,如图2所示,这三级形成了一个串联系统。
也就是说,对于一个具体的外设中断请求,必须通过三级的共同许可,否则,只要有任意一级不许可,CPU最终都不会响应该外设中断。
图2F28335中断系统的三级中断机制
F28335的中断主要有两种触发方式:
一种是在软件中写指令,例如INTR、OR、IFR或者TRAP指令;
另外一种是硬件触发方式,例如来自片内外设或者外围设备的中断信号。
无论是软件中断还是硬件中断,中断又可分为:
可屏蔽中断和不可屏蔽中断。
F28335CPU一共可以支持32个CPU中断,其中每一个中断都有一个32的中断向量。
中断向量是指向中断服务子程序的入口地址。
在DSP控制系统中,各个中断有着属于自己的优先级。
当几个中断同时向CPU发出中断请求时,CPU会根据这些中断的优先级来安排处理的顺序,优先级高的先处理,优先级低的后处理。
表1列出了F28335可以使用的中断向量、各个向量的存储位置以及各自的优先级。
表1F28335的中断向量及优先级
PIE可支持96个独立中断,PIE控制器将96个外设和外部引脚的中断进行了分组,每8个中断为一组,一共是12组,即PIE1~PIE12。
外设中断在PIE的分布如图3所示。
表2列出了F28335的PIE中断向量表和组内的优先级。
图3外设中断在PIE的分布
图4F28335的中断处理框图
表2F28335的PIE中断向量表和组内的优先级
F28335中断处理框图如图4所示。
一个来自于外设或者外部的中断必须经过6次“开关”使能才能最终被CPU相应。
F28335支持7个外部中断,XINT1–XINT7。
XINT13和非屏蔽中断XNMI复用。
每个外部中断可以通过正边沿或负边沿触发,也可以单独被使能或禁止。
CCS5.2与中断相关的文件主要有:
1、头文件DSP28_Piectrl.h,定义了与PIE相关的寄存器数据结构。
2、头文件DSP28_PieVect.h,定义了PIE的中断向量。
3、源文件DSP28_Piectrl.c,对PIE控制器进行初始化。
4、源文件DSP28_PieVect.c,对PIE中断向量表进行初始化,执行完这个程序后,各个中断中断函数就有了明确的入口地址。
5、源文件DSP28_DefaultIsr.c,预定义了所有与外设相关的中断函数,在编写中断函数时,只需将具体的内容写入即可。
四、硬件连接
实验板上利用一个按键来模拟外中断信号,实验板上的外中断硬件连接图如图5所示。
图5外中断与DSP的硬件连接图
五、源程序分析
1.外中断服务函数
interruptvoidxint1_is
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 指导