准备材料

  1. CCS6

    下载地址:http://www.ti.com/tool/ccstudio

  2. F2812的C语言头文件

    下载地址:http://www.ti.com/lit/zip/sprc097

    安装后的文件结构样式如下:

新建空的工程

  1. 点击"Project"->"New CCS Project"。

  1. 在New CCS Project窗口中,按需要填写以下内容后按"Finish"完成新建空的工程。

新建完成后的工程,结构如下:

  1. 点击左上方的编译按钮,应该能够顺利的编译通过,但是会出现一个警告。

工程配置

添加系统的头文件

  1. 在工程名上右击,添加两个文件夹,分别名为source和include。

  1. 打开"tidcs\c28\DSP281x\v120"文件夹,将"DSP281x_headers\include"中的所有头文件复制到刚刚新建的include目录。
  2. 打开"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灯

  1. 编辑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;",否则在编译时会提示一个警告。

  1. 编辑"DSP281x_Gpio.c",修改InitGpio()函数:

void InitGpio(void)

{

        // GpioMuxRegs 受到保护,需要EALLOW后才能配置

        EALLOW;

        // 设置为GPIO口

        GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6 =
0;

        // 配置为输出引脚

        GpioMuxRegs.GPADIR.bit.GPIOA6 =
1;

        EDIS;

}

  1. 在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中非常的"简单"。

  1. 添加"DSP281x_common\cmd"目录下的"F2812.cmd"。
  2. 添加"DSP281x_common\source"目录下的"DSP281x_CodeStartBranch.asm"。
  3. 禁用"2812_RAM_lnk.cmd"。

    重新编译工程后点击Debug,程序就会自动下载到Flash中,下载完成后,将开发板重新上电,就能够看到对应的LED灯离线运行。

    但是,你也许会奇怪,为什么灯运行的明显比仿真的时候要慢。那是因为,Flash实在是太慢了。为了能够让程序跑的快些,那只有让系统上电时,让程序跑在RAM中。

让程序跑在RAM中

Ti官方提供了2种让程序固化在Flash中而能够运行于RAM中的方法。

  1. 将需要高效执行的函数加载到RAM中运行;

    spra958l - Running an Application from Internal Flash Memory on the TMS320F28xxx DSP

  2. 将整个代码本身加载到RAM中运行。

    spraau8 - Copying Compiler Sections From Flash to RAM on the TMS320F28xxx DSCs

    第一种方案,需要设置cmd文件的同时,还需要兼顾代码本身,稍显麻烦。

方法一:部分代码加载到RAM

    再议……

方法二:所有代码加载到RAM

  1. 下载spraau8代码示例:

    http://www-s.ti.com/sc/techlit/spraau8.zip

  2. 将上面工程中的"DSP281x_CodeStartBranch.asm"替换为代码示例中的"DSP281x_CodeStartBranch"。
  3. 将代码示例中的"DSP28xxx_SectionCopy_nonBIOS.asm"添加到source中。
  4. 使用代码示例中的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文件了。

  1. 将上面工程中的"DSP281x_CodeStartBranch.asm"替换为代码示例中的"DSP281x_CodeStartBranch"。
  2. 将代码示例中的"DSP28xxx_SectionCopy_nonBIOS.asm"添加到source中。
  3. 修改"DSP281x_Headers_nonBIOS.cmd"

     

  4. 修改"F2812.cmd"
    1. 将RAML1从PAGE1中移动到PAGE0,且和RAML0合并

      RAML0L1 : origin = 0x008000, length = 0x002000 /* on-chip RAM block L0 L1 */

    2. 将RAMH0从PAGE1中移动到PAGE0。
    3. 原始的FLASH是严格A、B……分段的,这里可以直接复制cmd文件中的内容,将其合并为AB、CD……。
    4. SECTIONS部分,直接复制示例代码中的".cinit"、".const"、".econst"、".pinit"、".switch    "和".text"。
    5. 为了防止在代码中,可能存在将某些函数放在"ramfuncs"部分,这一部分予以保留(示例代码中,没有这一部分)。但是要稍作修改:

    6. IQmath部分,也要将其存储段修改,比如改成FLASH_CD

 

作者:东风唯笑

联系方式:dongfengweixiao@hotmail.com

关于版权:


CCS 6新建TMS320F2812工程 由 东风唯笑 创作,采用 知识共享 署名-非商业性使用 4.0 国际 许可协议进行许可。
基于http://www.cnblogs.com/dongfengweixiao/上的作品创作。
本许可协议授权之外的使用权限可以从 http://www.cnblogs.com/dongfengweixiao/ 处获得。

CCS 6新建TMS320F2812工程的更多相关文章

  1. 如何在Flash Builder里新建ActionScript工程

    新建ActionScript工程 1. File > New > ActionScript Project 2. 按照提示完成工程的创建 使程序直接在Flash Player中运行 1. ...

  2. ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题

    ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题 标签: myeclipsejavawebWeb App Libraries 2013-10-16 1 ...

  3. Cocos Code IDE新建lua工程报错解决方案

    今天想用cocos code IDE新建一个工程,但是控制台报错:Read json file null failed, the reason is:null.我下载的是官方3.5源码,sdk,ndk ...

  4. 新建android工程的时候eclipse没有生成MainActivity和layout布局

    一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...

  5. Android Studio新建Jni工程

    2.2版本的Android Studio支持新建Jni工程,不用再像以前自己构建工程目录,首先把自己的升级自己的AS到2.2以上 然后打开Tools->Andorid->SDK manag ...

  6. eclipse 配置Maven问题解决办法:新建maven工程时报错:Could not resolve archetype org.apache.maven.archetypes .

    此文乃本作者配置maven,被其折磨n天,究极解决方案,好文要顶啊.欢迎致电: zhe-jiang.he@hp.com 首先各maven.archetypes下载地址: http://mirrors. ...

  7. Keil MDK入门---从新建一个工程开始

    熟悉Keil C51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的.但ARM内核毕竟不同于51内核,因此无论在设置上还是在编程思想上,都需要下番功夫研究的.本文以MDK V4.03为例, ...

  8. 新建maven工程时pom.xml报错

    新建maven工程时,pom.xml报错:第一行报如下错误:multiple annotations found at this line后添加org.eclipse.m2e相关的plugin配置后, ...

  9. iOS平台软件开发工具(一)-新建的工程使用CocoaPods工具集成第三方框架

    CocoaPods是一款集合了上千个第三方开源库的开发工具,能够大幅度的提升团队项目的开发效率,降低时间成本. 那么就看一下CocoaPods这个工具在项目中的使用体现吧. 我们马上用ASIHTTPR ...

随机推荐

  1. jQuery iPresenter 3D图片旋转

    在线实例 效果一 效果二 使用方法 <div class="htmleaf-container"> <div class="htmleaf-conten ...

  2. kail linux 虚拟机安装实录(一) 新建虚拟机

    各位晚上好. 现在开始进行kail linux 在虚拟机上的安装. 我所使用的工具如下: kail linux 2.0   x64  http://mirrors.neusoft.edu.cn/kal ...

  3. Android开发过程遇到的问题小计

    1.在真机上正常运行,而模拟器会报出一些so文件找不到 unexpected e_machine: 40. 解决方法:采用x86的NDK进行编译,问题解决.

  4. Objective-C语法之KVO使用

    本文转自:http://blog.csdn.net/yuquan0821/article/details/6646400/ 一,概述 KVO,即:Key-Value Observing,它提供一种机制 ...

  5. sqlserver2012更改文件组

    1.查看文件组 sql语句 SELECT Data_located_on_filegroup = fg.groupname, Table_name = obj.name FROM sysfilegro ...

  6. Android 最全Activity生命周期

    新进入Activity:onCreate > onStart > onResume 退出Activity:onPause > onStop > onDestroy 目前处于该A ...

  7. SQL Server Column Store Indeses

    SQL Server Column Store Indeses SQL Server Column Store Indeses 1. 概述 2. 索引存储 2.1 列式索引存储 2.2 数据编码和压缩 ...

  8. Spark调度管理(读书笔记)

    Spark调度管理(读书笔记) 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark调度管理 本文主要介绍在单个任务内Spark的调度管理,Spark调度相关概念如 ...

  9. 【C++】输入多行数字到数组

    前天做某公司笔试题的时候,其输入格式是多行数字,每行以空格为分隔符,以换行符号为结束输入到多个数组.在JAVA中有相应的函数直接将一行拆成数组,感觉在C++中这中输入方式还是挺奇怪的,今天想出一种解决 ...

  10. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...