2812初学手册.docx
- 文档编号:11607065
- 上传时间:2023-03-28
- 格式:DOCX
- 页数:34
- 大小:595.16KB
2812初学手册.docx
《2812初学手册.docx》由会员分享,可在线阅读,更多相关《2812初学手册.docx(34页珍藏版)》请在冰豆网上搜索。
2812初学手册
目录:
1简介
1.1DSP281xC/C++头文件和外设例程程序包安装
1.2目录结构
2外设位域结构编程方法
2.1传统#define方法
2.2位域和结构方法
2.2.1外设寄存器结构
2.3增加位域
2.3.1使用Bits-Fields编程时的Read-Modify-Write考虑
2.3.2使用Bits-Fields编程时的代码大小考虑
3外设范例
3.1开始
3.2例程结构
3.2.1包含文件
3.2.2源代码
3.2.3连接命令文件
3.3例子编程流程
3.4包含的例子
3.5从FLASH开始执行例子
4逐步使用头文件和范例代码
4.1准备
4.2包含DSP281X外设头文件
4.3包含通用范例代码
5常见问题和处理
5.1read-modify-wriye的影响
5.1.1多标志位寄存器写1清零
5.1.2VolatileBits寄存器
6版本变化
7包含内容
7.1支持DSP281X的头文件
7.1.1DSP281X的头文件-主函数
7.1.2DSP281X的头文件-外设位域和寄存器结构定义文件
7.1.3CCS的.gel文件
7.1.4变量名和数据段
7.2通用范例代码
7.2.1支持的外设中断扩展模块
7.2.2特殊外设文件
7.2.3有用函数源文件
7.2.4范例连接.cmd文件
1简介
TI针对’DSP281x系列DSP芯片使用通用的C/C++语言编写了外设头文件和范例程序。
这些代码可以作为应用的工具或根据使用者的需要而作为开发平台的基础。
传统的编程方法需要程序员自行编写寄存器的H文件和所需的片内外设的初始化、配置文件,与传统的编程方法比较,基于C281xC/C++的头文件提供了软件开发的程序框架,其中包含有寄存器结构定义文件、外设头文件和器件的宏与类型定义等系统所需的各种文件。
通过在那新的或原有的工程文件使用外设头文件,开发者可很容易的使用C或C++语言来控制片上外设。
除此之外,程序员可以改动工程中需要用到的外设和主控制程序,还可以从提供的范例代码中挑选有用的函数,丢弃那些不需要的函数。
这样程序编写简便、结构清晰、易于修改和维护,同时由于框架不需做太大的变动,程序员可以将精力集中于算法的研究,从而加速项目或产品的研发进度。
注意:
本章没有提供使用CCS来编写C或连接或汇编代码的向导。
前提是用户已经有了281x的硬件平台且通过计算机连接到CCS软件。
使用者应该了解怎么使用CCS通过JTAG下载程序并能进行基本的DEBUG操作。
1.1DSP281xC/C++头文件和外设例程程序包安装
在使用DSP281xC/C++头文件前,计算机中必须安装有CCSFOR2000,然后必须安装DSP281xC/C++头文件和外设例程程序包,此文件可在TI网址下载,安装程序包为sprc097.rar。
解压缩后直接点击安装,显示如下画面;
按提示继续操作,选择相应目录
点击Next安装完成。
在ticds\c28\dsp281x\v100\doc目录下有相应帮助说明。
1.2目录结构
安装后,可以看到C281xC/C++头文件和外设例程清晰的目录结构。
目录结构当前的版本为V1.00,从结构图可以看出C/C++头文件、外设例程和共享源代码分别单独存放。
这种文件分类方法使查找文件方便,易于使用者快捷的将这些文件融合到新的或原来的工程文件中。
表1DSP281x主目录结构
目录
默认安装路径。
文档(包含版本更新信息)
合并外设头文件到新工程文件所需的文件。
头文件的bit-field结构方法的描述请见第3节
如何将外设头文件添加到新的或已有工程文件请见第4节
基于DSP281x头文件的CCS编译的程序代码
这些例程说明了281x片上外设的配置
关于这些例程的综述请见第3节
通过在DSP_281X外设程序中使用共享源文件来说明使用DSP_281X外设头文件来完成各种任务。
如对新的工程文件有帮助,可以随意使用这些文件。
第6节给出了这些文件的列表。
DSP281x_headers和DSP281x_common目录下的源文件根据文件类型被进一步分为各个子目录。
表2列出了这些子目录及其文件的类型。
子目录
描述
DSP281x_headers\cmd
分配位域结构的连接命令文件,详见第2节
DSP281x_headers\source
需要并入新的或原有的项目文件的头文件的源文件
DSP281x_headers\include
281x片上外设的头文件
子目录
描述
DSP281x_common\cmd
281x的存储器命令范例文件
DSP281x_common\source
281x外设例程通用.h文件
DSP281x_common\include
281x外设例程通用.c文件
2外设位域结构编程方法
DSP281x头文件和外设例程使用bit-field结构方法来映射和访问基于281x的外设寄存器。
本节介绍这种方法并与传统的#define方法进行了比较。
2.1传统#define方法
传统使用C语言访问寄存器的方法是通过使用#define宏来创建每个寄存器的地址标志。
例如:
这种#define的定义方法可以重复来定义每个外设的每个寄存器。
即使是的几个同类外设,例如SCI-ASCI-B,每个寄存器都可以根据其地址被独立的分开。
传统的#define方法的不足主要有以下几条:
访问寄存器的每一位困难;
不能在CCS的watchwindow看到寄存器的位变化;
不能利用由CCS自动完成的代码向导的优势;
对于相同外设,头文件的开发者无法利用代码重用的优势。
2.2位域和结构方法
位域结构的编程方法使用C语言将同一类外设的所有寄存器规为一组。
然后连接器将每个C语言编写的外设寄存器结构体映射为存储器空间。
这种映射允许编译器使用CPU的DP指针直接访问外设寄存器。
除此之外,许多寄存器的位域也被定义了,这样编译器就可以直接读或操作寄存器内的单独位。
2.2.1外设寄存器结构
2.1节中使用#define方法定义了CPUTimer0寄存器。
本节同样定义CPUTimer0寄存器,但是使用C语言结构体将CPUTimer寄存器统一定义。
连接器将在内存中映射CPUTimer0的寄存器结构体。
注意以下几点:
寄存器名字出现顺序必须与其在内存中分配的顺序相一致。
内存中保留的空间,在结构体中也用保留变量(rsvd1rsvd2)表示,除非占用保留空间,否则这些保留结构体成员不会被使用。
Uint16Uint32分别表示无符号16-bit,32-bit。
在28x系列中,有unsignedint和unsignedlong两种类型。
这主要是操作方便考虑,其相应的类型定义可以在DSP281x_Device.h中找到。
寄存器文件结构体定义用来声明一个访问寄存器的变量。
芯片的每个外设都需要这样定义。
多个同类外设使用同样的结构体定义。
例如,在某个器件有三个CPUTimer,则可以被定义为三个volatilestructCPUTIMER_REGS变量,如下:
声明变量时关键字volatile很重要,关键字volatile将告诉编译器变量的内容能被硬件改变,这样编译器就不会优化使用volatile定义的变量。
编译器使用DATA_SECTION宏将每个外设结构体的相应变量分配到数据段。
下面的例子,变量CpuTimer0Regs被分配到CpuTimer0RegsFile
数据段。
数据段再次为器件的每个外设寄存器结构体变量分配地址空间。
每个结构体被分到其自己的数据段后,连接器直接映射每个数据段到内存映射寄存器,如下所示:
通过将变量直接映射到相同的外设寄存器内存地址空间,开发者可以使用C语言访问所需的变量成员来访问寄存器。
如想写CPU-Timer0TCR寄存器,则程序员不得不访问CpuTimer0Regs变量中的TCR成员。
2.3增加某一位
实际中可能要经常直接访问寄存器的中的某位。
C281xC/C++头文件和外设例程中使用位域结构编程方法对许多片上寄存器的位进行了定义。
例如,可以对每个CPU-Timer寄存器的每个位定义。
CPU-TimerControl寄存器的位定义如下:
使用统一体声明寄存器的优点就是既可以使寄存器以位域结构体被访问,又可以使其被当作一个16位或32位的变量整体被访问。
例如,timercontrol寄存器的统一体定义如下:
一旦每个寄存器的位域和统一体定义被确立,则CPU-Timer寄存器结构体则能以统一体的定义方式被访问。
这样在C语言代码中,就可以用位域或单独量来操作CpuTimer寄存器了。
位域结构方法具有以下的一些优点:
使用者不需要定义标志就可以操作寄存器的位;
在CCS的watchwindow可以直接查看寄存器文件和位;
当使用CCS时,编辑器将会自动弹出你所要输入的结构/位成分提示列表;这种自动的提示使编写代码变得很容易,从而省去了查找寄存器和位名字文档的麻烦。
2.3.1使用位域编程时的Read-Modify-Write考虑
当对寄存器内的某一位进行写操作时,硬件将会产生一次read-modify-write操作,就是说,寄存器的内容被读出,其中的一位被修改,然后整个寄存器内容再被写回。
对于28x器件这些操作在一个时钟周期即可完成。
当寄存器内容被写回时,寄存器内其他位将会以原值写回。
由于一些寄存器不推荐使用位域方法访问,所以没有统一体定义。
这些例外的寄存器是那些对查询(读)某位有益的寄存器,包括:
当写1时即清除某位,如的事件管理标志寄存器;
无论何时访问都需要以一定的方式写的寄存器,如看门狗控制寄存器。
那些没有位或统一体定义的寄存器不能以.bit或.all访问,如下:
2.3.2使用位域编程方法时的代码量考虑
使用位域定义访问寄存器使得代码易读、易修改、易维护。
同时这种方法对访问或查询寄存器的某一位也非常有效。
然而如果多次访问某一寄存器,每次使用.bit将会比使用一次.all访问寄存器的代码多得多。
例如:
.bit的方法使得代码易读易改,但代码量稍有增加。
如果代码长短对程序很重要则可以使用.all结构方法一次写整个寄存器。
3外设实例
在C281xC/C++HeaderFilesandPeripheralExamples的DSP281x_examples\
目录下有几个工程项目例程,这些例程使用DSP281xV1.00头文件配置片上外设。
3.4节给出了例程的清单。
3.1入门
按以下步骤装载theDSP281xCPU-Timer例程作为开始。
其他例子的调试步骤大同小异。
1.使用F2812eZdsp或其他的硬件平台,在同CCS相连接。
2.装载例程的GEL或工程项目文件
每个例程都包含一个CCS的GEL文件,这个文件自动装载工程项目、编译代码、配置观察窗。
同样如不使用GEL文件可以直接装载工程文件。
按照以下顺序装载DSP281xCPU-Timer的GEL文件:
a打开CCS:
File->LoadGEL
b浏览CPUTimer例程目录:
DSP281x_examples\cpu_timer
c选择并打开Example_281xCpuTimer.gel文件
d从CCS的GEL下拉菜单中选择DSP281xCpuTimerExample->Load_and_Build_Project装载并编译整个工程项目例程。
3查看Example_281xCpuTimer.c原文件中main主文件最上面的注释文件Example_281xCpuTimer.c
在main程序开始有简短的介绍,包括所有的设定、所需的硬件。
4安装调试程序所需的硬件
安装源文件中指出需备的硬件。
DSP281xCPU-Timer例程只需要硬件处于““BoottoH0”方式。
其他的例程可能需要额外的硬件配置,如将模式配置引脚短接或接高、接地。
表3列出引导模式的设置,便于参考。
对于使用F2812eZdsp的用户而言,可以选择相应的跳线来选择引到模式。
关于‘281x引导模式更详细的信息可以参看TMS320F28xBootROMReferenceGuide(SPRU095).、
5装载代码
硬件安装配置完成后,从CCS的GEL下拉菜单选择
DSP281xCpuTimerExample->Load_Code
将.out文件下载到28器件内,在观察窗输入感兴趣的变量,复位然后执行代码到主程序开始的地方。
每次当器件复位时,GEL文件会重新装载输出文件。
如果不想这样,可以把GEL删掉,只要选择GEL文件,点击右键选择remove即可。
6执行程序,在观察窗增加变量,检查内存内容
7试验、修改、重新构建例程
当打算对例程进行一些修改时,最好拷贝一份完整的程序来修改或者至少对原始文件作个备份。
TI提供的新的例程是以这些基本文件为基础的。
3.2节和3.3节对程序结构和流程有更详细的描述。
8从CCS中移除GEL文件或工程项目文件。
移除GEL文件,只要选中文件名点击右键选择remove即可。
例程中使用了theDSP281x_headers目录中的头文件和DSP281x_common目录中的共享文件。
只是example目录下的文件针对不同的例子程序也就不尽相同。
注意:
多数的例程都使用位域的方法来访问寄存器。
这样有利于更好的帮助使用如何去使用外设及器件。
使用位域方法编程使得繁冗的代码易读易于修改。
与.all方法比较只不过会增加些代码量。
注意SPRC097文件中的例程文件关掉了编译优化器,如果需要可以重新设定编译环境,打开编译优化器。
3.2例程结构
每个例程都有非常简单的结构。
其中包括独立的原代码、共享原代码、头文件和连接命令文件。
3.2.1包含文件
所有的例程#include以下2个头文件。
DSP281x_Device.h
这个文件位于DSP281x_headers\include目录下。
它需要使用DSP281x的外设头文件。
这个文件包含所需的外设头文件和器件的宏与类型定义。
DSP281x_Examples.h
此文件定义了例程所需的参数。
它不需要使用DSP281X的头文件,但是某些通用源代码要使用。
这个文件在DSP281x_common\include目录下。
3.2.2源代码
每个例程由相对独立的原代码组成,这个代码可以是通用的,也可以是共享的。
DSP281x_GlobalVariableDefs.c
使用DSP281x外设头文件的任何一个工程都必须包含这个源文件。
在这个文件中,声明了外设寄存器的结构变量和数据段的分配。
这个文件位于DSP281x_headers\source目录下。
详细例程代码
对某个具体的示例,这个文件是是特殊的,它的文件名有前缀Example_281x。
Example_281xCpuTimer.c就是示例CPUTimer的具体文件,其它的例子中不使用这个文件。
此文件位于DSP281x_examples\
通用源代码
剩下的源代码文件在示例程序中是共享的。
这些文件包含外设通用函数或可利用的实用程序。
共享源文件在DSP2812x_shared\source目录下。
用户可以在原有工程文件或新的工程文件中选择、合并一些或全部共享源文件。
3.2.3连接命令文件
每一个示例都使用两个连接命令文件。
这些文件详细的说明了代码和程序段的存储位置。
一个连接文件用来将编译产生的段分配到片上存储区,另一个用来分配使用DSP281x外设头文件编程所需的外设寄存器结构体的数据段。
存储区连接分配:
连接文件如表4所示,它用来分配片上存储段。
这些连接文件在DSP281x_common\cmd目录下。
每一个实例将选择以下文件中的一个,具体选择那一个由示例中的存储器决定。
表4存储连接命令文件
存储连接命令文件示例
目录
描述
F2812_EzDSP_RAM_ink.cmd
DSP281x_common\cmd
EZdsp存储图只分配了SARAM的位置,无Flash,OTP或CSM密码保护位置
F2810.cmd
DSP281x_common\cmd
F2810存储连接命令文件,包含所有的Flash,OTP和CSM密码保护存储位置
F2812.cmd
DSP281x_common\cmd
F2812存储连接命令文件,包含所有的Flash,OTP和CSM密码保护存储位置
F2812_Xintfroot.cmd
DSP281x_common\cmd
来自F812XINTFzone7的boot
DSP头文件结构数据段分配:
任何一个使用DSP281x头文件外设结构的工程必须包含一个连接命令文件,这个连接命令文件将外设寄存器结构数据段分配到正确的存储位置。
在v.058的头文件中,位置分配是包含在存储连接文件中的。
为了容许将头文件从源代码中分离出来,分配文件被分成一个单独的文件,如表5所示。
表5DSP281x外设头连接命令文件
DSP281x外设头连接命令文件
目录
描述
DSP281x_Headers_BIOS.cmd
DSP281x_Headers\cmd
Link.cmd分配BIOS工程中的头文件变量。
这个文件必须包含在任意一个使用头文件的BIOS的工程中,详见4.2
DSP281x_Headers_nonBIOS.cmd
DSP281x_Headers\cmd
Link.cmd分配BIOS工程中的头文件变量。
这个文件必须包含在任意一个使用头文件的nonBIOS的工程中,详见4.2
3.3示例程序流程
在配置281x器件时,所有的示例程序都和以下推荐的流程相似。
表1反应了大致的流程:
3.4DSP281xC/C++头文件和外设例程程序包所包含的例程
表6包含的示例
示例
描述
adc_seqmode_test
ADCSeq方式检测.通道A0连续转换,记录在存储器中
adc_seq_ovd_tests
使用排序ADC检测,超过芯片的C版本相应的特性。
adc_soc
使用ADCINA3和ADCINA2两通道做ADC转换。
中断使能,使用SEQ1,EVA配置产生一个周期的ADCSOC。
cpu_timer
配置cputimer0,在每次ISR中断服务程序里工作累加计数一次。
ecan_back2back
eCAN自检测模式例程。
在高速的时候,用eCAN连续的传送数据
ev_pwm
事件管理器PWM示例。
本程序使用EV定时器产生PWM波形。
可以使用示波器来观测这个波形。
ev_timer_period
事件管理器定时器示例。
本程序使用EVA和EVB定时器,在一个周期溢出的时候,触发中断。
每次中断服务程序中累加计数。
flash
将EV定时器例程从SARAM移到Flash。
其中包含将程序从SARAM拷贝到Flash的相关步骤。
为了更快的执行,也将部分中断服务程序从Flash复制到SARAM
gpio_loopback
通用IO口回送检测。
本程序中,将8位的GPIO口配置为输出,8位口配置为输入。
配置为输出的管脚和输出的管脚形成一个闭环。
输出数据从输入管脚中读回。
gpio_toggle
使用DATA,SET/CLEAR和TOGGLE寄存器等不同的方法切换所有的IO管脚。
可以使用示波器观测这些管脚
mcbsp_loopback
配置McBSP做为回送检测。
使用查询来代替中断
mcbsp_loopback_interrupts
配置McBSP做为回送检测。
使用中断和先进先出寄存器。
run_from_xintf
本示例说明使用F2812eZdsp开发板如何从XINTFzone7导入和配置XINTF存储器接口
sci_autobaud
外部连接SCI-A和SCI-B,在两个外设之间传送数据。
使用SCI的自动波特特性。
在不同的波特率下做重复测试
sci_loopback
SCI示例代码,使用SCI模块的回送测试模式传送数据。
本程序使用位查询,而不是中断。
sci_loopback_interrupts
SCI示例代码,使用内部回送测试模式,通过SCI-A传送数据。
同时使用中断方法和先进先出寄存器。
spi_loopback
SPI示例,使用外部回送检测模式传送数据
spi_loopback_interrupts
SPI示例,使用外部回送检测模式传送数据。
同时使用中断方法和先进先出寄存器。
sw_prioritized_interrupts
在大多数应用中,可以使用标准中断硬件优先级。
本示例说明了如果有需要,可以使用一种中断软件优先级的方法,
watchdog
说明喂狗和间接喂狗触发中断
3.5从Flash执行的例程
大部分DSP281x示例属于“H0引导”模式,都是从SARAM开始执行的。
下面的示例(DSP281x_example\Flash)在“flash引导”模式下,程序将从Flash开始执行。
这个示例是事件管理定时器的例子,通过以下的改变使它从Flash开始执行。
1.改变连接命令文件连接flash
从工程文件夹中将F2812_281x_EzDSP_RAM_lnk.cmd移去,添加F2812.cmd或F2810.cmd。
F2812.cmd和F2810.cmd在DSP281x_common\cmd目录下。
2.添加DSP281x_common\source\DSP281x_CSMPasswords.asm到工程中。
这个文件含有密码,此密码将被编程,放在CSM密码位置。
建议在开发阶段将此密码设为0xFFFF,这样器件可以很容易打开。
详细的信息可以参考TMS320F28xSystemcontrol和InterruptsReferenceGuide(SPRU078).
3.修改代码,拷贝那些从Flash的导入地址到它们在SARAM中的运行地址过程中必须在SARAM中运行的函数。
特别的,flash等待状态初始化程序必须在SARAM外执行。
在DSP281x的例程中,那些从SARAM执行的函数,通过下面所示的编译CODE_SECTION#pragma声明,已经被分配在ramfuns区段中。
然后,寄存器连接命令文件(如下所示)在ramfuns段中分配flash导入地址和SARAM的运行地址。
象上面的详细说明一样,连接器将特殊符号分配到固定的地址,如下:
使用包含示例MemCopy程序或c库的标准mencopy()功能,这些符号能被用来从Flash到SARM拷贝函数.
执行从flash到SARAM的拷贝功能,需包含示例MemCopy函数:
a.添加DSP281x_common\source\DSP281x_MemCopy到工程项目
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2812 初学 手册