TMS320C6000基础

[复制链接]
14791|21
手机看帖
扫描二维码
随时随地手机跟帖
zhangjin_comeon|  楼主 | 2015-1-31 17:00 | 显示全部楼层 |阅读模式
主要内容


1. Why process signals digitally?
(1)模拟电路由模拟组件构成:电阻、电容及电感等,这些组件随着电压、温度或机械结构的改变会动态影响到模拟电路的效果;
(2)数字电路具有好的噪声抑制能力,少的开发时间和功耗
虽然数字电路有那么多优点,在有些情况下还必须使用模拟电路:非常高频的信号(>100MHz)。原因有2点:(1)ADC转换的限制;(2)使用数字电路很难实时处理非常高频的信号。


2. Why use DSP?

DSP是Digital Siginal Processor的简称。
(1)相对于PC等上的高端处理器,具有更低的功耗
(2)相对于PC等上的高端处理器,具有更低的价格
因此,在考虑价格、机械尺寸、低功耗以及“高频”处理时使用DSP是较好的选择。
相对于嵌入式ARM而言,DSP在信号处理上具有更大的优势,ARM偏向于控制。


3. Tipically DSP Algorithms?

在大部分的DSP算法中,乘积和(sum of product, SOP)是最基本的单元。


[img][/img]

DSP对乘法和加法做了优化,乘法与加法在DSP上一般在一个指令周期内完成,这也是为什么DSP适用于做信号处理的原因。


4. Choose a DSP

通过数据手册,列表比较两者参数,比如

[img][/img]

[img][/img]

浮点DSP与定点DSP的使用场合对比:
浮点DSP一般用于高精度、宽的动态范围、高信噪比,一般比较容易使用。定点DSP具有更低的功耗,更便宜,相对尺寸更小。


5. DSP 与 ASIC(专用集成电路)

        ASIC听起来更高端,但使用场合较少,主要因为ASIC开发周期长(至少1年左右),灵活性差(一旦生成流片则不可更改),耗资大。除非自己经常使用的模块做成流片重用,在产品开发中一般不使用ASIC。


6. TMS320系列DSP





TI C6000系列主要分为C64x,C62x,C67x三个子系列,C62x与C64x都是定点DSP,C67系列为浮点DSP。

相关帖子

zhangjin_comeon|  楼主 | 2015-1-31 17:01 | 显示全部楼层
本帖最后由 zhangjin_comeon 于 2015-1-31 17:06 编辑

主要内容


1. CPU架构
一幅图片搞定




2. C6000基本指令集

在“DSP TMS320C6000基础学习(1)”中已经说过:SOP是大部分DSP算法的关键单元。C6000的寄存器包括A,B两组。
我们将看看下面的表达式通过DSP指令是怎么一步步实现的,
Y=∑an*xn withn = 1...N

(1)an*xn乘法实现,DSP中有专门的硬件乘法模块,因此只需要一个指令就能完成乘法操作,而且指令周期为1。


  • MPY .M a1,x1,Y1

MPY .M a1,x1,Y1其中MPY为乘法指令,.M表示DSP的乘法单元,上面指令执行Y1=a1*x1。


(2)加法实现,ADD指令,加法单元用.L表示,下面指令执行Y=Y+Y1


  • ADD .L Y,Y1,Y

ADD .L Y,Y1,Y

(3)内存数据装载(上面的操作其实是有问题的,MPY和ADD不能直接操作内存),只能使用如下命令: LDB *Rn, Rm:转载一个字节(8bits)
LDH *Rn, Rm:装载一个半字(16bits)
LDW *Rn, Rm:装载一个字(32bits)
LDDW *Rn, Rm:装载一个double字(64bits)
其中Rn包含要装载操作数内存地址(32bits)的寄存器,Rm为目标寄存器。装载的DSP执行单元称为.D。


(4)将常量装入寄存器指令——MVKL和MVKH
MVKL const, Rn(低16bits)
MVKH const Rn(高16bits)
const是一个常量或标签值,只能先装低位再装高位。
比如(3)中,先要将操作数内存地址载入Rn中,因为地址长度为32bits,必须依次使用上面的2条指令完成地址到寄存器的载入工作,


  • MVKL Addr_low8 Rn
  • MVKL Addr_high8 Rn

MVKL Addr_low8 RnMVKL Addr_high8 Rn


(5)综合(1)~(4)指令完成a1*x1的过程



其中pt1和pt2分别为a与x地址。


(6)循环指令
        为完成Y=∑an*xn withn = 1...N,还有一个循环求和的过程,与其它平台类似,DSP中通过跳转指令和计数器实现循环,实现循环的步骤为:
========================================================
添加一个标签(下一次要跳转到何处);
添加跳转指令(B);
创建一个循环计数器;
添加一条指令用于对循环计数器更新;
使跳转指令根据计数器的值做相应的跳转;
=========================================================
下面为一个示例,



  • MVKL .S count, B0        ; 计数器寄存器B0初始化为count
  • .....
  • SUB .S B0,1B0            ; 计数器减1
  • B .S loop                ; 当B0不为0时跳转

           MVKL .S count, B0        ; 计数器寄存器B0初始化为countloop:      .....           SUB .S B0,1B0            ; 计数器减1                          [B0] B .S loop                ; 当B0不为0时跳转
上面用到了条件指令[Reg],还有取反的条件指令[! Reg]。条件寄存器可以为A0,A1,B0,B1,B2。


到此,我们已经在DSP上使用指令完全实现了Y=∑an*xn withn = 1...N



这里考虑一个问题,如果我们要提高DSP的处理能力,有什么方法么?很容易想到,一方面可以提高时钟频率,从而减小单周期的时间;另一方面是增加处理单元的个数(指上面提到的.D .M .L .S等)。






另外,针对高性能的处理器还有更高处理性能的指令。


3. 内存映射





4. DSP C6000外设

C6000的外设主要包括:
—— 并口
—— 普通GPIO
—— EMIF:外部存储器接口
—— 串口:McBSP(多通道缓冲串口),McASP(多通道音频串口)
—— DMA(EDMA):直接存储器访问(内部,外部)
—— 定时器(Timers)
—— 以太网接口(Ethernet)
—— 视频接口(Video Ports)
—— VCP/TCP接口:实现3G网络
—— PLL锁相环

本文最后记录下C6000系列产型号的命名方法,比如


TMS320C6713B-200
320:表示TI的DSP系列产品  (另 430:MCU    470:ARM)
C:ROM          (另 F:Flash EEROM)          此处有误,改:在6000系列中C表示CMOS,而2000系列中C表示ROM
6713:产品型号
-200:主频为200MHz

使用特权

评论回复
zhangjin_comeon|  楼主 | 2015-1-31 17:02 | 显示全部楼层
本帖最后由 zhangjin_comeon 于 2015-1-31 17:05 编辑

==================================================
DSP CCS工程文件构成
==================================================
1. 源文件(*.c *.asm)
2. 头文件(*.h *.inc)
3. cmd文件
   分为2种。
   一种是用来分配RAM空间的,用来将程序下载到RAM内调试,因为开发过程中大部分
   时间在调试程序,因此多用这类cmd;
   另一种是分配Flash空间的,当程序调试完毕后,需要将其烧写到Flash中固化。
   
4. 库文件(*.lib *.dll)
   库文件包含了寄存器的地址和对应标示符的定义,还包括了标准C/C++运行支持库函数。
   *.lib为静态库文件,在编译时调用,调用时直接加载到内存;
   *.dll为动态库文件,在运行时调用。


==================================================
创建DSP TMS320C6713工程
==================================================   

==================== 准备工作 ====================
1. 从http://www.ti.com/lsds/ti/dsp/c6000_dsp/c67x/toolsw.page下载C6XCSL及其文档
   C6XCSL为DSP C6000系列的芯片支持库(TMS320C6000 Chip Support Library)
   
   安装C6XCSL,点击.exe文件(其实就是解压),选择路径,本文为设为
   C6XCSL_ROOT=E:\MyDesigner\dsp\C6XCSL
   
2. 下载并安装**CCS 5.3,安装路径不要有中文字符


==================== 新建工程 ====================
1. File -> New Project -> CCS Project
   
   工程路径不要有中文字符。


2. 添加库文件
   工程右键 -> Add Files...
   转到C6XCSL_ROOT\lib_3x下。这里有2个6713系列文件:csl6713.lib和csl6713e.lib。
   
   两者区别是csl6713.lib用于小端(little endian)格式DSP,
   而csl6713e.lib用于大端(little endian)格式DSP。
   我们新建工程时选择了小端,因此这里选择csl6713.lib。
   然后弹出提示,选择“copy to files”将库文件拷贝一份到当前工程。
   
3. 添加头文件
   基本头文件是与库文件对应的。
   将C6XCSL_ROOT\include\文件夹拷贝到当前工程目录。
   工程右键 -> Properties, Build -> C6000 Compiler -> Include Options,
   添加../include头文件搜索目录。
   
   
4. 添加.cmd文件,这个可以参考C6XCSL_ROOT\example\下的例子,下面是Timer的例子,


  • /* Memory Map 0 - the default */
  • MEMORY
  • {
  • PMEM:o = 00000000hl = 00010000h
  • BMEM:o = 00010000hl = 00030000h
  • }
  • SECTIONS
  • {
  •     .text       >   PMEM
  •     .csldata> PMEM
  •     .stack>   PMEM
  •     .far>   PMEM
  •     .switch>   BMEM
  •     .tables >   BMEM
  •     .data   >   BMEM
  •     .bss>   BMEM
  •     .sysmem>   BMEM
  •     .cinit>   PMEM
  •     .const>   BMEM
  •     .cio    >   BMEM
  • }

   /* Memory Map 0 - the default */   MEMORY   {   PMEM:o = 00000000hl = 00010000h   BMEM:o = 00010000hl = 00030000h    }      SECTIONS   {           .text       >   PMEM       .csldata> PMEM       .stack>   PMEM       .far>   PMEM       .switch>   BMEM        .tables >   BMEM       .data   >   BMEM       .bss>   BMEM       .sysmem>   BMEM       .cinit>   PMEM       .const>   BMEM       .cio    >   BMEM    }

      
5. 新建mian.c,这个不用多说了吧


  • #include <csl.h>
  • void main(void) {
  • while (1) {
  • }
  • }

   #include <csl.h>         void main(void) {                 while (1) {                         }         }

==================== 附属问题 ====================
1. 新建工程结束,右键 -> Build Project,出现如下error,
   fatal error #35: #error NO CHIP DEFINED (use -dCHIP_XXXX where XXXX is chip number, i.e. 6201)
   原因:使用C6XCSL库需要定义芯片信号,错误提示没定义芯片型号
   解决:一种方法,在main.c中的#inclde <csl.h>前添加#define CHIP_6713;
         另一种方法,工程右键 -> Properties,Build -> C6000 Compiler -> Predefined Symbols,
         在“Pre-define NAME”中添加CHIP_6713



2. 右键 -> Build Project,出现如下warning,
   warning #10210-D: creating ".stack" section with default size of 0x400; use the
      -stack option to change the default size
   warning #10210-D: creating ".sysmem" section with default size of 0x400; use
      the -heap option to change the default size
   原因:没有设置堆大小(stack size)和栈大小(heap size)
   解决:工程右键 -> Properties,Build -> C6000 Linker -> Basic Options,
         设置stack size和heap size都为0x3FF。

使用特权

评论回复
zhangjin_comeon|  楼主 | 2015-1-31 17:07 | 显示全部楼层
本帖最后由 zhangjin_comeon 于 2015-1-31 17:11 编辑

DSP6455的EMIFA模块


之前介绍了DSP6455的GPIO和中断部分。今天,继续介绍EMIFA模块。




--------------------------------------------华丽分割------------------------------------------------




背景
      使用FPGA系统进行视频采集,DSP进行视频处理需要了解以下知识:


  • 1.  DSP-C6000系列的中断与GPIO系统
  • 2.  DSP-C6000系列的EMIFA模块
  • 3.  DSP-C6000系列的EDMA模块
  • 4.  FPGA的乒乓RAM
  • 5.  一种视频格式(例如VGA,PAL等)
  • 6.  视频处理算法

之前已经介绍了第一部分,今天介绍第二部分。



--------------------------------------------华丽分割------------------------------------------------




主题

      EMIF是External Memory Interface的简称。个人认为它是DSP比较强大的地方之一。通过EMIF接口,使得DSP可以和FPGA很方便地进行大数据量的数据传输。


      C6455的EMIFA可以访问多种外部存储器,比如:SRAM,ROM,FLASH等等。当然,也包括FPGA。本文的重点就是介绍使用EMIFA接口与FPGA建立无缝连接。


--------------------------------------------华丽分割------------------------------------------------



EMIFA
根据习惯,还是先贴图,框图总给人一目了然的感觉。






这是官方文档给出的EMIFA模块的接口示意图,乍一看,复杂的很。好多引脚而且还有好多复用。没关系,我们再贴一张,你就会感觉轻松很多了。









这一张图首先是把EMIFA模块的接口分了类,然和呢,我把在与FPGA通信场合下所需要使用的管脚使用红色框框标注了出来。是不是少了很多呢。归纳一下标注的管脚,如下:



  • AED[63:0]        64位数据总线
  • AEA[19:0]        20位地址总线(Optional)
  • ACE2              片选信号(低有效)
  • AECLKOUT      时钟信号
  • ASWE             写使能(低有效)
  • ASRE               读使能(低有效)


(注:应用场合是DSP读FPGA内部RAM中的图像数据,其他场合续根据情况调整)

由于FPGA的可编程性,使得一切从DSP看来简单了许多。因为DSP面对的“存储器”显得格外智能。甚至连地址线都可以不需要。

下面,我们来一一分析上述的信号。


  • 首先,应该是片选信号CE。这里不得不提到DSP的地址空间。下图是DSP6455的EMIFA映射情况



从图中可以看出:

  • EMIFA共支持4个外部存储器,比如可以把CE2分配给FPGA,CE3分配给SRAM,CE4分配给FLASH等。
  • 每个外部存储器的寻址空间大小是8MB。20根地址线即2的20次方,也就是1MB,此外由于数据总线是64位的,故对应的寻址空间是8MB

由于FPGA内部时序逻辑可以产生地址,所以我们可以不使用地址线。这样,下面的事情就简单了。只要把CE2管脚和FPGA的某一个通用IO口连上即可。
在读取FPGA内部RAM数据时告诉EDMA要读取的数据的基地址是0xA0000000,以及读取的数据的长度即可。



  • 第二个信号,ECLKOUT,即时钟信号的。因为FPGA工作是需要时钟激励的,没有时钟信号怎么产生地址逻辑呢?此外,时钟频率不能过高,要考虑到FPGA芯片的能力。OK,因为有了同步时钟,所以EMIFA模块的工作模式也就确定了,即同步工作模式


  • 第三个信号,包括2个,即ASRE,ASWE。更熟悉的叫法是RE,WE。读使能和写使能。这个就不赘述了。


  • 第四个信号,数据总线&地址总线。也不赘述了。


经过上面的分析,我们可以简要的画出FPGA与DSP的连接图:





在连接的思路清晰之后,我们可以开始配置EMIFA的寄存器了。

其实也就只有1个比较重要的寄存器,即CEnCFG。该寄存器有两套完全不同的配置分别对应于同步存储器模式和异步存储器模式由于FPGA内部RAM工作于同步模式,故我们来看一下同步模式下该寄存器的配置。





SSEL设置为1时,表示该CE对应同步模式的外部存储器。
在与FPGA连接时,主要考虑以下四个参数:
R_ENABLE设置SRE/SADS管脚功能
值为 1管脚功能为SRE,即Read Enable
值为 0管脚功能为SADS



W_LTNCY写延时周期
值为 000周期延时
值为 011周期延时
值为 102周期延时
值为 113周期延时



R_LTNCY读延时周期
值为 011周期延时
值为 102周期延时
值为 113周期延时


读延时当CE和RE同时为低电平后,表示DSP开始读FPGA的RAM,经过R_LTNCY个ECLKOUT周期后第一个数据出现在数据总线上

SBSIZE数据位宽
值为 008位数据总线
值为 0116位数据总线
值为 1032位数据总线
值为 1164位数据总线



--------------------------------------------华丽分割------------------------------------------------

EMIFA之CSL


使用CSL配置EMIFA模块时,主要的步骤如下:




  • l  1. 使能设备EMIFA模块
  • l  2. 配置CEnCFG寄存器
  • l  3. 初始化EMIFA模块
  • l  4. 打开EMIFA模块
  • l  5. 把2中配置的参数设置到打开的EMIFA模块中


完整配置代码:(把EMIFA的CE2配置为以FPGA作为外部存储器,64位数据线,2个周期的读延时)




/*-----------------------------------------------------------------------------------


  • *
  • *                  初始化EMIFA
  • *
  • -----------------------------------------------------------------------------------*/
  • #define EMIFA_MEMTYPE_ASYNC     0
  • #define EMIFA_MEMTYPE_SYNC      1
  • #define EMIFA_CE2_BASE_ADDR     (0xA0000000)//地址空间基地址
  • #define CSL_EMIFA_SYNCCFG_RLTNCY_PARAMETER  2//读延时2周期
  • #define CSL_EMIFA_SYNCCFG_SBSIZE_PARAMETER  3//64位数据总线
  • #define CSL_EMIFA_SYNCCFG_READEN_PARAMETER  1//SRE
  • //CEnCFG寄存器参数宏
  • #define CSL_EMIFA_SYNCCFG_PARAMETER {\
  •     (Uint8)CSL_EMIFA_SYNCCFG_READBYTEEN_DEFAULT, \
  •     (Uint8)CSL_EMIFA_SYNCCFG_CHIPENEXT_DEFAULT, \
  •     (Uint8)CSL_EMIFA_SYNCCFG_READEN_PARAMETER, \
  •     (Uint8)CSL_EMIFA_SYNCCFG_WLTNCY_DEFAULT, \
  •     (Uint8)CSL_EMIFA_SYNCCFG_RLTNCY_PARAMETER, \
  •     (Uint8)CSL_EMIFA_SYNCCFG_SBSIZE_PARAMETER \
  • }
  • void Init_EMIF()
  • {
  •     CSL_EmifaObj                    emifaObj;
  •     CSL_Status                      status;
  •     CSL_EmifaHwSetup                hwSetup;
  •     CSL_EmifaHandle                 hEmifa;
  •     CSL_EmifaMemType                syncVal;
  •     CSL_EmifaSync                   syncMem = CSL_EMIFA_SYNCCFG_PARAMETER;
  •     memset(&emifaObj, 0, sizeof(CSL_EmifaObj));
  •     memset(&hwSetup, 0, sizeof(CSL_EmifaHwSetup));
  •     //步骤1: 使能设备的EMIFA功能(不用先解锁外设寄存器)
  •     CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERCFG1, DEV_PERCFG1_EMIFACTL, ENABLE);
  •     //步骤2:配置CE2CFG寄存器
  •     syncVal.ssel    = EMIFA_MEMTYPE_SYNC;
  •     syncVal.async   = NULL;
  •     syncVal.sync    = &syncMem;
  •     hwSetup.ceCfg[0] = &syncVal;
  •     hwSetup.ceCfg[1] = NULL;
  •     hwSetup.ceCfg[2] = NULL;
  •     hwSetup.ceCfg[3] = NULL;
  •     //步骤3:初始化EMIFA模块
  •     status = CSL_emifaInit(NULL);
  • #ifdef SHOW_PRINTF
  •     if (status != CSL_SOK) {
  •         printf("EMIFA: Initialization error.\n");
  •         printf("\tReason: CSL_emifaInit [status = 0x%x].\n", status);
  •         return;
  •     }
  •     else {
  •         printf("EMIFA: Module Initialized.\n");
  •     }
  • #endif
  •     //步骤4:打开EMIFA模块
  •     hEmifa = CSL_emifaOpen(&emifaObj,CSL_EMIFA,NULL,&status);
  • #ifdef SHOW_PRINTF
  •     if ((status != CSL_SOK) || (hEmifa == NULL)) {
  •         printf("EMIFA: Error opening the instance. [status = 0x%x, hEmifa \
  •                 = 0x%x]\n", status, hEmifa);
  •         return;
  •     }
  •     else {
  •         printf("EMIFA: Module instance opened.\n");
  •     }
  • #endif
  •     //步骤5:把步骤2中配置的参数设置到打开的EMIFA模块中
  •     status = CSL_emifaHwSetup(hEmifa,&hwSetup);
  • #ifdef SHOW_PRINTF
  •     if (status != CSL_SOK) {
  •         printf("EMIFA: Error in HW Setup.\n");
  •         printf("Read write operation fails\n");
  •         return;
  •     }
  •     else {
  •         printf("EMIFA: Module Hardware setup is successful.\n");
  •     }
  • #endif
  • }

使用特权

评论回复
zhangjin_comeon|  楼主 | 2015-1-31 17:12 | 显示全部楼层
C6000系列DSP的GPIO模块




最近一直在做DSP与FPGA之间的视频传输工作,使用的通信方式是EDMA,为了系统的介绍通过EDMA方式在DSP与FPGA之间实现数据传输。


首先介绍一下DSP-C6455中的GPIO与中断系统。以后再介绍DSP强大的EDMA模块,以及具体的数据传输实现。


(注:  其实EDMA是C6455芯片中的一个模块,可以认为其是芯片内部的一个”协处理器”)




---------------------------华丽分割----------------------------------




背景
使用DSP+FPGA搭建的嵌入式系统进行视频采集,编解码,传输无疑是一个不错的选择。使用FPGA系统进行视频采集,DSP进行视频处理需要了解一下知识:

  • 1.   DSP-C6000系列的中断与GPIO系统
  • 2.   DSP-C6000系列的EDMA模块
  • 3.   FPGA的乒乓RAM
  • 4.   一种视频格式(例如VGA,PAL等)
  • 5.   视频处理算法

      本文将介绍DSP C6000系列的GPIO系统(针对C6455)





---------------------------华丽分割----------------------------------




C6455的GPIO

      TMS320C6455中共有16个通用输入输出管脚。每一个管脚都可以单独进行配置成如下功能之一:

  •       通用输入管脚Input
  •       通用输出管脚Output
  •       中断&EDMA事件 管脚


---------------------------华丽分割----------------------------------





GPIO框图       首先看一下GPIO的框图:




通过查看GPIO框图,我们可以得出许多信息:


  • DIR寄存器控制GPIO管脚是输入还是输出,其中,对应bit置0表示该管脚配置为输出管脚;对应bit置1表示该管脚配置为输入管脚。
  • 若一个GPIO管脚配置为Output,给SET_DATA寄存器对应位置1,将使该管脚输出高电平,给CLR_DATA寄存器对应位置1,将使该管脚输出低电平。需要注意的是:向SET_DATA和CLR_DATA中写入0无作用。
  • 若一个GPIO管脚配置为Input,可以通过读取IN_DATA寄存器中的对应位来获得管脚的状态。且向SET_DATA和CLR_DATA中写入0无作用。
  • 若一个GPIO管脚配置为中断&EDMA事件模式,此时可以忽略该管脚的Input/Output配置。可以通过置位SET_RIS_TRIG和SET_FAL_TRIG寄存器的相应bit把GPIO管脚配置为中断/事件触发方式。如下图所示:




由于C64+的CPU无法直接访问RIS_TRIG和FAL_TRIG寄存器,若要访问中断模式的配置状态,可以通过读取SET_RIS_TRIG(SET_FAL_TRIG)或者CLR_RIS_TRIG(CLR_FAL_TRIG)来获取。







---------------------------华丽分割----------------------------------





GPIO寄存器组     
C6455中GPIO的寄存器组如下所示:




其中,后面9个不再介绍了。唯独第一个寄存器之前没有介绍到 查看官方文档:


可以看出,只有该寄存器最低位置1时GPIO管脚才可以作为中断源。所以,只要你使用GPIO管脚中的某一个作为系统的中断源,那么该位必须置1。





---------------------------华丽分割----------------------------------





GPIO管脚复用       此外,使用GPIO时,还需要考虑到对应芯片的管脚复用问题,以6455为例,GPIO管脚复用情况如下图示:




可见,16个GPIO管脚中有大半是可以复用的。可以通过配置6455的外设配置寄存器来使能GPIO模块。即把6455中的PERCFG0寄存器中GPIO对应位置1,如下图示:













---------------------------华丽分割----------------------------------



GPIO之CSL库       使用CSL库的API函数配置DSP显然比逐一配置寄存器方面且容易理解。下面介绍一下如何使用CSL库把DSP的GPIO4配置成中断模式。
      

  • 第一步:使能GPIO模块

      使能之前,首先要解除锁,即向PERLOCK寄存器写入0x0F0A0B00,然后把PERCFG0寄存器中GPIO对应位置1。代码如下:

  • <SPAN style="FONT-FAMILY: 'Microsoft YaHei'">Bool   gpioEn;  
  • CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERLOCK,DEV_PERLOCK_LOCKVAL, UNLOCK);  
  •    
  • CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERCFG0, DEV_PERCFG0_GPIOCTL, ENABLE);  
  •   
  • do {  
  •        gpioEn = (Bool)CSL_FEXT(((CSL_DevRegs*)CSL_DEV_REGS)->PERSTAT0,   
  •                                  DEV_PERSTAT0_GPIOSTAT);  
  • } while (gpioEn != TRUE);  
  • </SPAN>  

Bool        gpioEn;CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERLOCK,DEV_PERLOCK_LOCKVAL, UNLOCK); CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERCFG0, DEV_PERCFG0_GPIOCTL, ENABLE);do {       gpioEn = (Bool)CSL_FEXT(((CSL_DevRegs*)CSL_DEV_REGS)->PERSTAT0,                                  DEV_PERSTAT0_GPIOSTAT);} while (gpioEn != TRUE);

  • 第二步:初始化GPIO模块


  • <SPAN style="FONT-FAMILY: 'Microsoft YaHei'">CSL_Status                    status;  
  • CSL_GpioContext               pContext;  
  • status   =     CSL_gpioInit(&pContext);</SPAN>  

CSL_Status                    status;CSL_GpioContext               pContext;status   =     CSL_gpioInit(&pContext);


  • 第三步:打开GPIO模块
  • 第四步:使能GPIO管脚作为中断源的功能
  • 第五步:配置GPIO-PIN4的属性:方向,中断触发方式


使用特权

评论回复
zhangjin_comeon|  楼主 | 2015-1-31 17:13 | 显示全部楼层
C6000系列DSP的中断系统


上一篇介绍了C6455的GPIO系统,最后把GPIO4配置成了中断/事件模式,本文将介绍C6455的中断系统,介绍完基本概念后,给出把GPIO4映射到INT4的代码。

完成了GPIO和中断的配置,我们就可以开始着手DSP与FPGA之间的通讯了。废话不多说,下面开始介绍C6455的中断系统。


----------------------------------------------------华丽分割------------------------------------------------------


中断模块框图

仔细观察上图,可以看出C6455有一下几种中断:

  • 1.   Reset
  • 2.   NMI 不可屏蔽中断
  • 3.   EXCEP 硬件异常
  • 4.   12个普通中断INT[15:4]
我们使用的最多的也就是普通中断,所以这也是本文的重点。




----------------------------------------------------华丽分割------------------------------------------------------




接下来,沿着INT[15:4]往后退,看到的是Interrupt Selector,它的功能好比一个筛子(shuffle),对所有中断事件进行选择性映射。如下图示:






看了这个图,我们又不难发现,中断选择器是一个128-->12的映射,这也就意味着,有116个系统事件被过滤掉了。



接着往回走,可以看到,中断选择器有三个输入,分别是:
  • RESET
  • Event[3:0]
  • Event[127:4]


RESET不看了,硬件重启。

EVENT[127:4]是系统事件,这个事件的编号根据芯片的不同而不同,拿6455来说,部分映射情况如下面两个图片所示:



不难看出,这些编号都是固定的,基本囊括了芯片上所有模块的事件。

最后,比较特别的是Event[3:0],它是组合事件,通过下图的介绍应该就一目了然了。



可见,Event0对应 4-31号事件的组合事件,Event2对应32-63号事件的组合事件,以此类推。

----------------------------------------------------华丽分割------------------------------------------------------

那么,怎么组合呢?
这就不得不从寄存器开始说起了。首先,先看如下3个寄存器组:



(注:每组都是4个32位寄存器,每一组的EVTxxx0[3:0]都不使用,故这里不涉及到组合事件)

      系统事件发生时(124个),它们在事件标志寄存器中(EVTFLAGx)的对应位会被置1,此时可以通过向EVTCLR寄存器中对应位写入1来清除中断标志,然后执行中断服务程序。若不清除,那么相同事件再次发生时会产生问题。故,手动清除中断标志是必须的!且只能通过向EVTCLR寄存器中写入1来清除,不能直接向EVTFLAG寄存器写入0,因为EVTFLAG寄存器是Read Only的。


      另外,EVTSET寄存器的存在意义就是我们可以手动产生中断,这一点可以让我们测试中断服务程序的功能。


      介绍完上面三个基本的寄存器组,我们可以开始讨论组合事件的机制了。先看下图:




可以明显的看出,124个事件被分成了4组。然后经过两个寄存器的运算,产生组合事件。

下面介绍EVTMASKMEVT FLAG两个寄存器组。

  •       EVT MASK寄存器组用于决定每一个组中的哪些事件被屏蔽掉。默认情况下,没有事件被屏蔽(全0)。


  •       鉴于最终的组合事件EVTx的发生机制是对Group中所有事件进行或运算,即只要Group中有一个事件发生,就代表组合事件发生。


举个例子:
假如EVTMASK3=0x0FFFFFFF,那么代表只有事件124,125,126,127参与组合。其他事件96-123都被忽略。



  •       MEVT FLAG寄存器同EVT FLAG寄存器的值相同,表示事件是否发生。这样一旦知道了EVTMASK和MEVT FLAG两个寄存器的值就可以断定组合事件EVTx(0<=x<=3)是否发生了。


----------------------------------------------------华丽分割-----------------------------------------------------

通过上面的介绍,应该已经很清楚C6455的中断机制了,再贴一张图来巩固一下上面所说的内容:


说到这里,我们对上图中红色框以及它之前的东西了解的很清楚了,下面就是Interrupt Selector的机制了。
其实很简单,为12个中断分别配置对应的事件编号即可。只需要3个寄存器就OK啦。

分别是INTMUX1,INTMUX2,INTMUX3。贴一个图就应该很明了了。


举个例子:
假设我要让INT4映射到GPIO4,那么通过查找前面的图,发现GPINT4的事件编号是55,那么只要把INTMUX1的低7位设置成0x37即可。


此外,官方文档里还说了下面一段话:

可见,INT4优先级最高,INT15优先级最低


----------------------------------------------------华丽分割------------------------------------------------------
中断模块CSL库使用
上面介绍了很多,其实就是想说清楚C6455的中断机制。实际使用还是CSL比较方便。       使用CSL配置中断需要如下几个步骤:

  • 1.   初始化中断模块
  • 2.   使能NMI
  • 3.   全局中断使能
  • 4.   打开中断模块
  • 5.   绑定中断服务程序
  • 6.   使能相应事件


完整中断配置例子----把GPIO4事件映射到INT4


[cpp] view plaincopyprint?

  • CSL_Status                  intStat;  
  • CSL_IntcContext             gpiocontext;  
  • CSL_IntcEventHandlerRecord  isr_gpio;  
  • CSL_IntcEventHandlerRecord  record[1];  
  • CSL_IntcGlobalEnableState   state;  
  • CSL_IntcParam               vectId;  
  • CSL_IntcHandle              gpioIntcHandle;  
  • CSL_IntcObj                 gpioIntcObj;  
  •   
  •   
  • static void HANDLE_INTR4(void *arg)  
  • {  
  •     //中断服务程序   
  • }  
  • /*-----------------------------------------------------------------------------------
  • *  
  • *                  初始化外部中断4     
  • *  
  • -----------------------------------------------------------------------------------*/  
  • void InitAndEnableIntc4(void)  
  • {      
  •     //初始化   
  •     gpiocontext.numEvtEntries = 1;  
  •     gpiocontext.eventhandlerRecord = record;  
  •     intStat = CSL_intcInit(&gpiocontext);     
  •       
  •     //使能NMI(不可屏蔽中断)   
  •     intStat = CSL_intcGlobalNmiEnable();  
  •       
  •     //全局中断使能   
  •     intStat = CSL_intcGlobalEnable(&state);   
  •       
  •     //打开中断模块(把GPIO4中断事件映射到系统中断INT4)   
  •     vectId = CSL_INTC_VECTID_4;  
  •     gpioIntcHandle = CSL_intcOpen(&gpioIntcObj, CSL_INTC_EVENTID_GPINT4, &vectId, &intStat);      
  •         
  •     //绑定中断服务程序   
  •     isr_gpio.handler = (CSL_IntcEventHandler)&HANDLE_INTR4;  
  •     CSL_intcPlugEventHandler(gpioIntcHandle, &isr_gpio); //绑定   
  •       
  •     //使能该事件(开始监听)   
  •     CSL_intcHwControl(gpioIntcHandle, CSL_INTC_CMD_EVTENABLE, NULL);  
  • }  

CSL_Status                      intStat;CSL_IntcContext                         gpiocontext;CSL_IntcEventHandlerRecord         isr_gpio;CSL_IntcEventHandlerRecord         record[1];CSL_IntcGlobalEnableState   state;CSL_IntcParam                                 vectId;CSL_IntcHandle                          gpioIntcHandle;CSL_IntcObj                             gpioIntcObj;static void HANDLE_INTR4(void *arg){        //中断服务程序}/*----------------------------------------------------------------------------------- *  *                                         初始化外部中断4         *  -----------------------------------------------------------------------------------*/void InitAndEnableIntc4(void){            //初始化    gpiocontext.numEvtEntries = 1;    gpiocontext.eventhandlerRecord = record;    intStat = CSL_intcInit(&gpiocontext);               //使能NMI(不可屏蔽中断)        intStat = CSL_intcGlobalNmiEnable();            //全局中断使能    intStat = CSL_intcGlobalEnable(&state);         //打开中断模块(把GPIO4中断事件映射到系统中断INT4)    vectId = CSL_INTC_VECTID_4;        gpioIntcHandle = CSL_intcOpen(&gpioIntcObj, CSL_INTC_EVENTID_GPINT4, &vectId, &intStat);                  //绑定中断服务程序    isr_gpio.handler = (CSL_IntcEventHandler)&HANDLE_INTR4;    CSL_intcPlugEventHandler(gpioIntcHandle, &isr_gpio); //绑定        //使能该事件(开始监听)    CSL_intcHwControl(gpioIntcHandle, CSL_INTC_CMD_EVTENABLE, NULL);}




通过本文以及上一篇**,我们应该对DSP6000系列的GPIO和中断系统有了一定的了解。(注,本文只是基本的介绍C6000的中断系统,有不少部分没有涉及,若要了解更多,请参考TI官方文档)


接下来将介绍:

  • DSP的EDMA系统与EMIFA接口
  • FPGA的乒乓RAM应用
  • CCIR656视频标准(PAL)
  • FPGA与DSP实现的视频采集与传输实验


最后,给出一些资源下载:


  • 1.C6000系列的GPIO与中断系统笔记(即两篇**的PDF版本)
  • 2.C6455CSL库文档
  • 3.C6455的GPIO与中断系统官方文档

使用特权

评论回复
zhangjin_comeon|  楼主 | 2015-1-31 17:15 | 显示全部楼层
DSP中的CMD文件是链接命令文件(Linker Command File),以.cmd为后缀。


在分析cmd文件之前,必需先了解
(1)DSP具体芯片的内存映射(Memory Map)
(2)知道点链接的知识,知道C程序中段的概念
(3)知道RAM,Flash等存储模块的区别


======================================================================
1. coff目标文件
======================================================================
coff是一种流行的二进制可执行文件格式,在CCS v5中扩展名为.out,可以直接
下载到芯片中。可执行文件包括段头、可执行代码、初始化数据、可重定位信息
和符号表字符串表等信息。
编译器处理段的过程为:
(1)把每个源文件都编译成独立目标文件(.obj),每个目标文件都有自己的段
(2)链接器将目标文件中相同段名的部分连接在一起,生成最终的coff可执行文件
CCS v5中的Compile Files完成功能(1),Build完成功能(2)。


======================================================================
2. TMS320C6713内存映射
======================================================================




======================================================================
3. 自定义代码段和数据段
======================================================================
// 将symbol分配到section name指示的数据段
#pragma DATA_SECTION(symbol, "section name");
// 将symbol分配到section name指示的代码段
#pragma CODE_SECTION(symbol, "section name");  
常常结合结构体定义symbol,如下,
volatile struct Symbol symbol;  // Symbol预先定义好的描述特定外设的结构


比如,对于C6713中的Timer0外设,做如下定义,

  • struct Timer0 {  
  •     ...  
  • }  
  • #pragma DATA_SECTION(C6713_Timer0, "C6713_Timer0_cmd");   
  • volatile struct Timer0 C6713_Timer0;  

struct Timer0 {    ...}#pragma DATA_SECTION(C6713_Timer0, "C6713_Timer0_cmd");volatile struct Timer0 C6713_Timer0;
"C6713_Timer0_cmd"将在cmd文件中分配空间。
======================================================================
4. cmd文件
======================================================================
cmd文件主要用于完成链接的功能,因此可以在cmd文件中使用链接命令,比如:

-stack 0x200    设置栈大小为0x200字节
-heap 0x200     设置堆大小为0x200字节
-l rst67xx.lib  链接rst67xx.lib库

除了链接命令外,cmd 文件还包括MEMORY和SECTOINS两部分,分别用于存储区的划分和段的分配。
MEMORY划分的格式为:


  • L2SRAM    : o = 00000000h l = 00030000h  /* L2 SRAM 192K */  

L2SRAM    : o = 00000000h l = 00030000h  /* L2 SRAM 192K */o表示起始地址,l表示存储区长度(以字节为单位)

一个简单的例子(TMS320C6713为例,不同芯片不同),外设只添加了Timer0:

  • MEMORY  
  • {  
  •     L2SRAM    : o = 00000000h l = 00030000h  /* L2 SRAM 192K */  
  •     L2CACHE   : o = 00030000h l = 00010000h  /* L2 Cache 64 K */  
  •   
  •   
  •     /* Peripheral */  
  •     CPU_TIMER0 : o = 01940000h l = 00040000 /* Timer0 */  
  •   
  •   
  •     EXTERNAL  : o = 80000000h l = 80010000h  
  • }  
  •   
  •   
  • SECTIONS  
  • {  
  •     /* Allocate program areas */  
  •     .text     > L2SRAM        /* code segment */  
  •     .cinit    > L2SRAM        /* init segment */  
  •   
  •   
  •     /* Allocate data areas */  
  •     .stack    > L2SRAM  
  •     .far      > L2SRAM  
  •     .switch   > L2SRAM        /* C switch table */  
  •     .tables   > L2SRAM  
  •     .data     > L2SRAM        /* data segment */  
  •     .bss      > L2SRAM        /* data that haven't init */  
  •     .sysmem   > L2SRAM  
  •     .const    > L2SRAM        /* string, const ... */  
  •     .cio      > L2SRAM  
  •   
  •   
  •     .buffers  > EXTERNAL  
  •   
  •   
  •     C6713_Timer0_cmd > CPU_TIMER0  /* Timer 0 */  
  • }  

MEMORY{        L2SRAM    : o = 00000000h l = 00030000h  /* L2 SRAM 192K */        L2CACHE   : o = 00030000h l = 00010000h  /* L2 Cache 64 K */        /* Peripheral */        CPU_TIMER0 : o = 01940000h l = 00040000 /* Timer0 */        EXTERNAL  : o = 80000000h l = 80010000h}SECTIONS{        /* Allocate program areas */        .text     > L2SRAM        /* code segment */        .cinit    > L2SRAM        /* init segment */        /* Allocate data areas */        .stack    > L2SRAM        .far      > L2SRAM        .switch   > L2SRAM        /* C switch table */        .tables   > L2SRAM        .data     > L2SRAM        /* data segment */        .bss      > L2SRAM        /* data that haven't init */        .sysmem   > L2SRAM        .const    > L2SRAM        /* string, const ... */        .cio      > L2SRAM        .buffers  > EXTERNAL        C6713_Timer0_cmd > CPU_TIMER0  /* Timer 0 */}
cmd文件包括2部分 —— MEMORY与SECTIONS
MEMORY完成地址空间的划分;
SECTIONS完成地址空间的分配到具体用途(除了程序中通用段之外还可以有自定义段)。


NOTES: 平时开发时都是将程序下载到RAM空间,当要发布时需要下载到Flash空间,
此处为SRAM的cmd文件,Flash的cmd文件有所不同。


下面是TI公司DSK的cmd,可以直接参考,


  • /****************************************************************************/  
  • /*  C6713.cmd                                                               */  
  • /*  Copyright (c) 2010 Texas Instruments Incorporated                       */  
  • /*                                                                          */  
  • /*    Description: This file is a sample linker command file that can be    */  
  • /*                 used for linking programs built with the C compiler and  */  
  • /*                 running the resulting .out file on an TMS320C6713        */  
  • /*                 device.  Use it as a guideline.  You will want to        */  
  • /*                 change the memory layout to match your specific C6xxx    */  
  • /*                 target system.  You may want to change the allocation    */  
  • /*                 scheme according to the size of your program.            */  
  • /*                                                                          */  
  • /****************************************************************************/  
  •   
  • -stack 0x2000  
  • -heap 0x8000  
  •   
  • MEMORY  
  • {  
  •     IRAM        o = 0x00000000  l = 0x00030000  /* 192kB - Internal RAM */  
  •     L2RAM       o = 0x00030000  l = 0x00010000  /* 64kB - Internal RAM/CACHE */  
  •     EMIFCE0     o = 0x80000000  l = 0x10000000  /* SDRAM in 6713 DSK */  
  •     EMIFCE1     o = 0x90000000  l = 0x10000000  /* Flash/CPLD in 6713 DSK */  
  •     EMIFCE2     o = 0xA0000000  l = 0x10000000  /* Daughterboard in 6713 DSK */  
  •     EMIFCE3     o = 0xB0000000  l = 0x10000000  /* Daughterboard in 6713 DSK */  
  • }  
  •   
  • SECTIONS  
  • {  
  •     .text          >  IRAM  
  •     .stack         >  IRAM  
  •     .bss           >  IRAM  
  •     .cio           >  IRAM  
  •     .const         >  IRAM  
  •     .data          >  IRAM  
  •     .switch        >  IRAM  
  •     .sysmem        >  IRAM  
  •     .far           >  IRAM  
  •   .args          >  IRAM  
  •     .ppinfo        >  IRAM  
  •     .ppdata        >  IRAM  
  •   
  •   /* COFF sections */  
  •     .pinit         >  IRAM  
  •     .cinit         >  IRAM  
  •   
  •   /* EABI sections */  
  •   .binit         >  IRAM  
  •     .init_array    >  IRAM  
  •   .neardata      >  IRAM  
  •     .fardata       >  IRAM  
  •     .rodata        >  IRAM  
  •     .c6xabi.exidx  >  IRAM  
  •     .c6xabi.extab  >  IRAM  
  • }  

/****************************************************************************//*  C6713.cmd                                                               *//*  Copyright (c) 2010 Texas Instruments Incorporated                       *//*                                                                                                                                                        *//*    Description: This file is a sample linker command file that can be    *//*                 used for linking programs built with the C compiler and  *//*                 running the resulting .out file on an TMS320C6713        *//*                 device.  Use it as a guideline.  You will want to        *//*                 change the memory layout to match your specific C6xxx    *//*                 target system.  You may want to change the allocation    *//*                 scheme according to the size of your program.            *//*                                                                          *//****************************************************************************/-stack 0x2000-heap 0x8000MEMORY{        IRAM                o = 0x00000000        l = 0x00030000        /* 192kB - Internal RAM */        L2RAM                o = 0x00030000        l = 0x00010000        /* 64kB - Internal RAM/CACHE */        EMIFCE0                o = 0x80000000        l = 0x10000000        /* SDRAM in 6713 DSK */        EMIFCE1                o = 0x90000000        l = 0x10000000        /* Flash/CPLD in 6713 DSK */        EMIFCE2                o = 0xA0000000        l = 0x10000000        /* Daughterboard in 6713 DSK */        EMIFCE3                o = 0xB0000000        l = 0x10000000        /* Daughterboard in 6713 DSK */}SECTIONS{        .text          >  IRAM        .stack         >  IRAM        .bss           >  IRAM        .cio           >  IRAM        .const         >  IRAM        .data          >  IRAM        .switch        >  IRAM        .sysmem        >  IRAM        .far           >  IRAM  .args          >  IRAM        .ppinfo        >  IRAM        .ppdata        >  IRAM  /* COFF sections */        .pinit         >  IRAM        .cinit         >  IRAM  /* EABI sections */  .binit         >  IRAM        .init_array    >  IRAM  .neardata      >  IRAM        .fardata       >  IRAM        .rodata        >  IRAM        .c6xabi.exidx  >  IRAM        .c6xabi.extab  >  IRAM}


下面再给出一个TMS320F2818的完整cmd文件例子,与6713有所不同,比如16进制格式
表示,MEMORY和SECTIONS书写等。

  • MEMORY  
  • {  
  • PAGE 0 :   
  •    PRAMH0     : origin = 0x3f8000, length = 0x001000         
  •            
  • PAGE 1 :   
  •    /* SARAM                     */      
  •    RAMM0    : origin = 0x000000, length = 0x000400  
  •    RAMM1    : origin = 0x000400, length = 0x000400  
  •   
  •   
  •    /* Peripheral Frame 0:   */  
  •    DEV_EMU    : origin = 0x000880, length = 0x000180  
  •    FLASH_REGS : origin = 0x000A80, length = 0x000060  
  •    CSM        : origin = 0x000AE0, length = 0x000010  
  •    XINTF      : origin = 0x000B20, length = 0x000020  
  •    CPU_TIMER0 : origin = 0x000C00, length = 0x000008  
  •    CPU_TIMER1 : origin = 0x000C08, length = 0x000008           
  •    CPU_TIMER2 : origin = 0x000C10, length = 0x000008           
  •    PIE_CTRL   : origin = 0x000CE0, length = 0x000020  
  •    PIE_VECT   : origin = 0x000D00, length = 0x000100  
  •   
  •   
  •    /* Peripheral Frame 1:   */  
  •    ECAN_A     : origin = 0x006000, length = 0x000100  
  •    ECAN_AMBOX : origin = 0x006100, length = 0x000100  
  •   
  •   
  •    /* Peripheral Frame 2:   */  
  •    SYSTEM     : origin = 0x007010, length = 0x000020  
  •    SPI_A      : origin = 0x007040, length = 0x000010  
  •    SCI_A      : origin = 0x007050, length = 0x000010  
  •    XINTRUPT   : origin = 0x007070, length = 0x000010  
  •    GPIOMUX    : origin = 0x0070C0, length = 0x000020  
  •    GPIODAT    : origin = 0x0070E0, length = 0x000020  
  •    ADC        : origin = 0x007100, length = 0x000020  
  •    EV_A       : origin = 0x007400, length = 0x000040  
  •    EV_B       : origin = 0x007500, length = 0x000040  
  •    SPI_B      : origin = 0x007740, length = 0x000010  
  •    SCI_B      : origin = 0x007750, length = 0x000010  
  •    MCBSP_A    : origin = 0x007800, length = 0x000040  
  •   
  •   
  •    /* CSM Password Locations */  
  •    CSM_PWL    : origin = 0x3F7FF8, length = 0x000008  
  •   
  •   
  •    /* SARAM                    */      
  •    DRAMH0     : origin = 0x3f9000, length = 0x001000           
  • }  
  •    
  • SECTIONS  
  • {  
  •    /* Allocate program areas: */  
  •    .reset           : > PRAMH0,      PAGE = 0  
  •    .text            : > PRAMH0,      PAGE = 0  
  •    .cinit           : > PRAMH0,      PAGE = 0  
  •   
  •   
  •    /* Allocate data areas: */  
  •    .stack           : > RAMM1,       PAGE = 1  
  •    .bss             : > DRAMH0,      PAGE = 1  
  •    .ebss            : > DRAMH0,      PAGE = 1  
  •    .const           : > DRAMH0,      PAGE = 1  
  •    .econst          : > DRAMH0,      PAGE = 1        
  •    .sysmem          : > DRAMH0,      PAGE = 1  
  •      
  •    /* Allocate Peripheral Frame 0 Register Structures:   */  
  •    DevEmuRegsFile    : > DEV_EMU,    PAGE = 1  
  •    FlashRegsFile     : > FLASH_REGS, PAGE = 1  
  •    CsmRegsFile       : > CSM,        PAGE = 1  
  •    XintfRegsFile     : > XINTF,      PAGE = 1  
  •    CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1        
  •    CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1        
  •    CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1        
  •    PieCtrlRegsFile   : > PIE_CTRL,   PAGE = 1        
  •    PieVectTable      : > PIE_VECT,   PAGE = 1  
  •   
  •   
  •    /* Allocate Peripheral Frame 2 Register Structures:   */  
  •    ECanaRegsFile     : > ECAN_A,      PAGE = 1     
  •    ECanaMboxesFile   : > ECAN_AMBOX   PAGE = 1  
  •   
  •   
  •    /* Allocate Peripheral Frame 1 Register Structures:   */  
  •    SysCtrlRegsFile   : > SYSTEM,     PAGE = 1  
  •    SpiaRegsFile      : > SPI_A,      PAGE = 1  
  •    SciaRegsFile      : > SCI_A,      PAGE = 1  
  •    XIntruptRegsFile  : > XINTRUPT,   PAGE = 1  
  •    GpioMuxRegsFile   : > GPIOMUX,    PAGE = 1  
  •    GpioDataRegsFile  : > GPIODAT     PAGE = 1  
  •    AdcRegsFile       : > ADC,        PAGE = 1  
  •    EvaRegsFile       : > EV_A,       PAGE = 1  
  •    EvbRegsFile       : > EV_B,       PAGE = 1  
  •    ScibRegsFile      : > SCI_B,      PAGE = 1  
  •    McbspaRegsFile    : > MCBSP_A,    PAGE = 1  
  •   
  •   
  •    /* CSM Password Locations */  
  •    CsmPwlFile      : > CSM_PWL,     PAGE = 1  
  • }  

使用特权

评论回复
zhangmangui| | 2015-1-31 19:20 | 显示全部楼层
非常感谢楼主的分享   资料很完美

使用特权

评论回复
tuzi2088| | 2015-3-16 21:26 | 显示全部楼层
太给力了,解决了我这个初学者遇到的好多问题

使用特权

评论回复
zhangmangui| | 2015-3-16 22:45 | 显示全部楼层
tuzi2088 发表于 2015-3-16 21:26
太给力了,解决了我这个初学者遇到的好多问题

初学过程中遇到的问题和找到的资料 解决办法   还望你能给大家分享
帮助到他人

使用特权

评论回复
smilingangel| | 2015-3-17 22:09 | 显示全部楼层
楼主介绍的非常详细的,,佩服!

使用特权

评论回复
smilingangel| | 2015-3-17 22:10 | 显示全部楼层
模拟电路由模拟组件构成:电阻、电容及电感等,这些组件随着电压、温度或机械结构的改变会动态影响到模拟电路的效果。

使用特权

评论回复
smilingangel| | 2015-3-17 22:14 | 显示全部楼层
使能GPIO模块之前,首先要解除锁,即向PERLOCK寄存器写入0x0F0A0B00,然后把PERCFG0寄存器中GPIO对应位置1。

使用特权

评论回复
tuzi2088| | 2015-3-21 14:25 | 显示全部楼层
zhangmangui 发表于 2015-3-16 22:45
初学过程中遇到的问题和找到的资料 解决办法   还望你能给大家分享
帮助到他人 ...

大大你好,我主要是学6678,看的是64(因为资料相对较多)的资料其实C674x系列的更好,因为他们说6678其实就是C674x系列的多核版本。
我在看的过程中有个问题搞不懂:C66系列的 SRAM 分为Local L1P/L2/L1D和Corepac x L1P/L2/L1D,后者是在核内的,前者我一直搞不清是在芯片什么位置,怎么分配的,请大大释惑。

使用特权

评论回复
angerbird| | 2015-3-22 13:46 | 显示全部楼层
模拟电路由模拟组件构成:电阻、电容及电感等,这些组件随着电压、温度或机械结构的改变会动态影响到模拟电路的效果。

使用特权

评论回复
zhangmangui| | 2015-3-22 23:24 | 显示全部楼层
tuzi2088 发表于 2015-3-21 14:25
大大你好,我主要是学6678,看的是64(因为资料相对较多)的资料其实C674x系列的更好,因为他们说6678其 ...

MSMC SRAM 用作共享的L2和L3:  ·共享的L2‐‐可以cache为L1D和L1P的缓存;L2将不会缓存请求到MSMC SRAM的数据。  ·共享的L3—MSMC没有直接的L2缓存,但可以缓存L1D和L1P。然而如果使用C66x地CorePac的址扩展功能重映射到外存地址,则MSMC存储器可以cache为L3作为L1和L2的缓存。为了实现这一点,MAR寄存器中cahing必须使能(MAR.PC位)重新映射区域。

使用特权

评论回复
zhangmangui| | 2015-3-22 23:25 | 显示全部楼层
tuzi2088 发表于 2015-3-21 14:25
大大你好,我主要是学6678,看的是64(因为资料相对较多)的资料其实C674x系列的更好,因为他们说6678其 ...

请查看文档    多核共享内存控制器
能下载的话   记得给大家分享

使用特权

评论回复
tuzi2088| | 2015-3-23 10:31 | 显示全部楼层
本帖最后由 tuzi2088 于 2015-3-23 10:50 编辑
zhangmangui 发表于 2015-3-22 23:25
请查看文档    多核共享内存控制器
能下载的话   记得给大家分享

0 0C000000 0 0C3FFFFF 4M Multicore shared memory (MSM)
大大,你说的MSM是这样的,也是上面这个地址分配
00800000 0087FFFF 0 00800000 0 0087FFFF 512K Local L2 SRAM
00E00000 00E07FFF 0 00E00000 0 00E07FFF 32K Local L1P SRAM
00F00000 00F07FFF 0 00F00000 0 00F07FFF 32K Local L1D SRAM
而LL2却是这些地址等等应该不是一个东西吧……
我在实例里面看到的CMD配置的LL2,搞不清楚是什么,你说的MSM SRAM,在官方提供的里面有介绍的,这个我大致能明白。

使用特权

评论回复
tuzi2088| | 2015-3-23 10:37 | 显示全部楼层
zhangmangui 发表于 2015-3-22 23:24
MSMC SRAM 用作共享的L2和L3:  ·共享的L2‐‐可以cache为L1D和L1P的缓存;L2将不会缓存请求到MSMC SRAM ...

或者它本身就是每个核自己L2的映射?这样的话每个核调用的时候就不用分开设置了?

使用特权

评论回复
lyhuestc| | 2015-6-4 13:46 | 显示全部楼层
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

725

帖子

5

粉丝