CCS 6新建TMS320F2812工程
准备材料
- CCS6
下载地址:http://www.ti.com/tool/ccstudio
- F2812的C语言头文件
下载地址:http://www.ti.com/lit/zip/sprc097
安装后的文件结构样式如下:
新建空的工程
- 点击"Project"->"New CCS Project"。
- 在New CCS Project窗口中,按需要填写以下内容后按"Finish"完成新建空的工程。
新建完成后的工程,结构如下:
- 点击左上方的编译按钮,应该能够顺利的编译通过,但是会出现一个警告。
工程配置
添加系统的头文件
- 在工程名上右击,添加两个文件夹,分别名为source和include。
- 打开"tidcs\c28\DSP281x\v120"文件夹,将"DSP281x_headers\include"中的所有头文件复制到刚刚新建的include目录。
- 打开"tidcs\c28\DSP281x\v120"文件夹,将"DSP281x_common\include"中的所有头文件复制到刚刚新建的include目录(会提示文件已存在,覆盖即可)。
此时,工程文件夹的结构如图所示:
配置工程
右击工程文件名,选择"Properties"
- 更改include的选项:
在新弹出的窗口中选择"Workspace":
然后选择对应工程的"include"目录:
- 更改链接选项中的"Base option":
将Stack中填充合适的数值,默认为空(也就是上文中编译的时候出现的警告):
完成以上的设置后,编译应该没有任何的错误和警告:
- 额外的设置——添加C99支持:
可板上执行的工程配置
根据上文的配置过程,虽然代码能够正常的通过编译,但是却没有任何的实际功能。这里,以点亮运行灯(即主循环执行过程中,固定间隔点亮的灯)为例,介绍可用的代码的配置过程。
添加必须的头文件代码
在main函数中,添加以下的头文件:
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
其中,DSP281x_Device.h提供了对应的CPU寄存器的结构体信息,DSP281x_Examples.h主要提供了一个纳秒级的延时函数DELAY_US(A)。不过,为了使用此函数,还需要将一个汇编代码文件添加到工程中:
在项目文件名称上右击,选择"Add Files",打开的窗口中选择"DSP281x_common\source"文件夹中的"DSP281x_usDelay.asm"。然后手动将asm文件拖动到source目录下。
此时,项目文件夹的组织结构如图。
添加必要的源文件
一个能够正常在开发板上运行的工程,应该具备一下的必要的源文件。
- 添加"DSP281x_headers\source"目录下的"DSP281x_GlobalVariableDefs.c"以指定所有系统结构体的存储位置。
- 添加"DSP281x_common\source"目录下的"DSP281x_SysCtrl.c"以初始化系统的控制选项,包括PLL,看门狗,预分频。
- 添加"DSP281x_common\source"目录下的"DSP281x_Gpio.c"以初始化系统的GPIO口。
- 添加"DSP281x_common\source"目录下的"DSP281x_PieCtrl.c以初始化PIE控制器。
- 添加"DSP281x_common\source"目录下的 "DSP281x_PieVect.c"以初始化PIE向量表。
- 添加"DSP281x_common\source"目录下的"DSP281x_InitPeripherals.c"以初始化其他外设。
- 添加"DSP281x_common\source"目录下的"DSP281x_DefaultIsr.c"以使用默认的中断函数。
添加cmd文件
本程序非TI的BIOS系统应用,所以需要添加"DSP281x_headers\cmd"目录下的"DSP281x_Headers_nonBIOS.cmd"。
到此,可以尝试编译工程,应该能够正常的编译通过,且没有任何的警告。目录结构应该如下所示(分别是头文件,源文件和链接文件):
第一个可执行程序——点亮LED灯
- 编辑main函数,将main函数修改成如下的内容:
#include "DSP281x_Device.h" // 添加必要的头文件
#include "DSP281x_Examples.h" // 添加必要的头文件
int main(void)
{
// 1. 初始化系统控制,PLL,看门狗,预分频
InitSysCtrl();
// 2. 初始化GPIO
InitGpio();
// 3. 关闭中断,然后初始化PIE向量表
DINT; // INTM 置一,关中断
InitPieCtrl(); // 初始化 PIE 控制寄存器到默认状态
//(所有PIE中断禁用,标志清空)
// 在 DSP281x_PieCtrl.c 中定义
IER =
0x0000; // 禁用 CPU 中断
IFR =
0x0000; // 清空 CPU 中断标志
InitPieVectTable(); // 初始化 PIE 向量表
// 在 DSP281x_PieVect.c 中定义
// 4. 初始化所有的外设
// InitPeripherals(); // 在 DSP281x_InitPeripherals.c 中定义
// 需要启用哪些硬件,在此函数中设置
// 5. 用户指定的代码后启用中断
// 用户指定的其他函数
EINT;
ERTM;
for(;;)
{
}
}
main函数虽然是int类型的,但是这里不需要结尾的"return 0;",否则在编译时会提示一个警告。
- 编辑"DSP281x_Gpio.c",修改InitGpio()函数:
void InitGpio(void)
{
// GpioMuxRegs 受到保护,需要EALLOW后才能配置
EALLOW;
// 设置为GPIO口
GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6 =
0;
// 配置为输出引脚
GpioMuxRegs.GPADIR.bit.GPIOA6 =
1;
EDIS;
}
- 在main函数中定义一个变量(Uint32)main_counter,然后修改for循环,添加如下语句:
for(;;)
{
main_counter++;
if(main_counter >
5000000)
{
main_counter =
0;
GpioDataRegs.GPATOGGLE.bit.GPIOA6 =
1;
}
}
到此,编译后点击Debug,可以观察到开发板上对应于102引脚上的LED灯能够规律性的闪烁。
将程序固化到Flash中
将程序固化到flash中非常的"简单"。
- 添加"DSP281x_common\cmd"目录下的"F2812.cmd"。
- 添加"DSP281x_common\source"目录下的"DSP281x_CodeStartBranch.asm"。
- 禁用"2812_RAM_lnk.cmd"。
重新编译工程后点击Debug,程序就会自动下载到Flash中,下载完成后,将开发板重新上电,就能够看到对应的LED灯离线运行。
但是,你也许会奇怪,为什么灯运行的明显比仿真的时候要慢。那是因为,Flash实在是太慢了。为了能够让程序跑的快些,那只有让系统上电时,让程序跑在RAM中。
让程序跑在RAM中
Ti官方提供了2种让程序固化在Flash中而能够运行于RAM中的方法。
- 将需要高效执行的函数加载到RAM中运行;
spra958l - Running an Application from Internal Flash Memory on the TMS320F28xxx DSP
- 将整个代码本身加载到RAM中运行。
spraau8 - Copying Compiler Sections From Flash to RAM on the TMS320F28xxx DSCs
第一种方案,需要设置cmd文件的同时,还需要兼顾代码本身,稍显麻烦。
方法一:部分代码加载到RAM
再议……
方法二:所有代码加载到RAM
- 下载spraau8代码示例:
- 将上面工程中的"DSP281x_CodeStartBranch.asm"替换为代码示例中的"DSP281x_CodeStartBranch"。
- 将代码示例中的"DSP28xxx_SectionCopy_nonBIOS.asm"添加到source中。
- 使用代码示例中的cmd文件替换示例代码中的cmd文件。
不过,示例代码中的cmd文件对内存结构相比于ti提供的默认头文件,有较大的更改,假如不想使用示例代码中的cmd,那就看看都做了哪些更改吧。
spraau8的cmd文件中的主要变化
对比spraau8提供的cmd文件,可以看到,最大的变化是,诸如下图所示的初始化方法:
其中标注1的地方,表示将".text"存储在"FLASH_AB"区;标注2的地方,表示此存储区的代码将会在"RAM_L0L1"中运行;标注3的地方,表示此部分代码的起始位置为"_text_loadstart";标注4的地方,表示此部分代码的结束位置为"_text_runstart";最后一行也即第5行,表示此部分代码的长度为"_text_size"。那么,值得好奇的是,这些最前面是下划线的字段都是哪里来的呢。其实,它们都在文件"DSP28xxx_SectionCopy_BIOS.asm"中定义了。
其次,就是初始化的段中多了一个".cinit"。这个东西又是哪里来的呢。它的定义,在"DSP28xxx_SectionCopy_nonBIOS.asm"中,具体的含义,可以看spraau8的pdf文档。
最后,示例代码中,将需要移动的段都放在了FLASHAB中,而启动后复制到的位置,都在"RAM_H0"和"RAML0L1"中。
到这里我们差不多就可以自己修改cmd文件了。
- 将上面工程中的"DSP281x_CodeStartBranch.asm"替换为代码示例中的"DSP281x_CodeStartBranch"。
- 将代码示例中的"DSP28xxx_SectionCopy_nonBIOS.asm"添加到source中。
- 修改"DSP281x_Headers_nonBIOS.cmd"
- 修改"F2812.cmd"
- 将RAML1从PAGE1中移动到PAGE0,且和RAML0合并
RAML0L1 : origin = 0x008000, length = 0x002000 /* on-chip RAM block L0 L1 */
- 将RAMH0从PAGE1中移动到PAGE0。
- 原始的FLASH是严格A、B……分段的,这里可以直接复制cmd文件中的内容,将其合并为AB、CD……。
- SECTIONS部分,直接复制示例代码中的".cinit"、".const"、".econst"、".pinit"、".switch "和".text"。
- 为了防止在代码中,可能存在将某些函数放在"ramfuncs"部分,这一部分予以保留(示例代码中,没有这一部分)。但是要稍作修改:
- IQmath部分,也要将其存储段修改,比如改成FLASH_CD
作者:东风唯笑
联系方式:dongfengweixiao@hotmail.com
关于版权:
CCS 6新建TMS320F2812工程 由 东风唯笑 创作,采用 知识共享 署名-非商业性使用 4.0 国际 许可协议进行许可。
基于http://www.cnblogs.com/dongfengweixiao/上的作品创作。
本许可协议授权之外的使用权限可以从 http://www.cnblogs.com/dongfengweixiao/ 处获得。
CCS 6新建TMS320F2812工程的更多相关文章
- 如何在Flash Builder里新建ActionScript工程
新建ActionScript工程 1. File > New > ActionScript Project 2. 按照提示完成工程的创建 使程序直接在Flash Player中运行 1. ...
- ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题
] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题 标签: myeclipsejavawebWeb App Libraries 2013-10-16 1 ...
- Cocos Code IDE新建lua工程报错解决方案
今天想用cocos code IDE新建一个工程,但是控制台报错:Read json file null failed, the reason is:null.我下载的是官方3.5源码,sdk,ndk ...
- 新建android工程的时候eclipse没有生成MainActivity和layout布局
一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...
- Android Studio新建Jni工程
2.2版本的Android Studio支持新建Jni工程,不用再像以前自己构建工程目录,首先把自己的升级自己的AS到2.2以上 然后打开Tools->Andorid->SDK manag ...
- eclipse 配置Maven问题解决办法:新建maven工程时报错:Could not resolve archetype org.apache.maven.archetypes .
此文乃本作者配置maven,被其折磨n天,究极解决方案,好文要顶啊.欢迎致电: zhe-jiang.he@hp.com 首先各maven.archetypes下载地址: http://mirrors. ...
- Keil MDK入门---从新建一个工程开始
熟悉Keil C51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的.但ARM内核毕竟不同于51内核,因此无论在设置上还是在编程思想上,都需要下番功夫研究的.本文以MDK V4.03为例, ...
- 新建maven工程时pom.xml报错
新建maven工程时,pom.xml报错:第一行报如下错误:multiple annotations found at this line后添加org.eclipse.m2e相关的plugin配置后, ...
- iOS平台软件开发工具(一)-新建的工程使用CocoaPods工具集成第三方框架
CocoaPods是一款集合了上千个第三方开源库的开发工具,能够大幅度的提升团队项目的开发效率,降低时间成本. 那么就看一下CocoaPods这个工具在项目中的使用体现吧. 我们马上用ASIHTTPR ...
随机推荐
- 1-2 nodejs小节 文件读取
1.表达式 在命令行输入 node回车后,可以在后边输入相应的表达式,进行运算操作 2.阻塞文件读取 var data=fs.readFileSync('input.txt', 'utf-8') ...
- IIS10中使用OpenSSL来创建CA并且签发SSL证书
参考: http://www.cnblogs.com/lierle/p/5140187.html http://alvinhu.com/blog/2013/06/12/creating-a-certi ...
- 了解HTML 盒模型
HTML在布局上, 有一个非常重要的模型, 那就是盒子模型, 在盒子模型中把标签内容理解为一个物品, 而css样式理解为包容着这个物品的盒子, 一般的块级标签都具有盒子模型的特征, 你可以在css中对 ...
- Objective-C内存管理之-引用计数
本文会继续深入学习OC内存管理,内容主要参考iOS高级编程,Objective-C基础教程,疯狂iOS讲义,是我学习内存管理的笔记 内存管理 1 内存管理的基本概念 1.1 Objective-C中的 ...
- 文件的上传(如何兼容火狐与IE)与国际化的原理
1.文件的上传 [1] 简介 > 将本地的文件上传到服务器中 > 用户需要通过一个表单将文件上传到服务器中 [2] 表单的设置 ...
- Windows on Device 项目实践 5 - 姿态控制灯制作
在前面几篇文章中,我们学习了如何利用Intel Galileo开发板和Windows on Device来设计并完成PWM调光灯.感光灯.火焰报警器和智能风扇的制作,涉及到了火焰传感器.DC直流电机. ...
- ORA-00604: error occurred at recursive SQL level 1
在测试环境中使用某个账号ESCMOWNER对数据库进行ALTER操作时,老是报如下错误: ORA-00604: error occurred at recursive SQL level 1 ORA- ...
- Linux备份ifcfg-eth0文件导致的网络故障问题
今天在给一台操作系统为Oracle Linux Server release 5.7的服务器配置网络时,遇到了备份ifcfg-eth0配置文件,导致网卡无法绑定IP地址的情况.觉得是个有意思的案例,特 ...
- 【转】天啦噜!原来Chrome自带的开发者工具还能这么用!(提升JS调试能力的10个技巧)
天啦噜!原来Chrome自带的开发者工具还能这么用! (提升JS调试能力的10个技巧) Chrome自带开发者工具.它的功能十分丰富,包括元素.网络.安全等等.今天我们主要介绍JavaScript ...
- 通过RTMP play分析FLV格式详解
最近做了一个rtmp中转服务程序,通过实践,熟悉rtmp play和push中各类格式,这里总结一下. 程序github地址: https://github.com/runner365/rtmp_re ...