[资料] TMS320F2812工作机制及指令周期测试.rar
418 查看
4 回复
 楼主 | 发布于 2020-02-04 | 只看楼主
分享到:

TMS320F2812TI公司的一款用于控制的高性能和高性价比的32位定点DSP芯片。该芯片最高可在150 MHz主频下工作(本文将其设置到100 MHz),并带有18K×16位0等待周期片上SRAM128K×16位片上Flash(存取时间为36 ns)。TMS320F2812采用哈佛总线结构,即在同一个时钟周期内可同时进行一次取指令、读数据和写数据的操作,同时TMS320F2812还通过采用8级流水线来提高系统指令的执行速度。

  为了观察指令周期,对TMS320F2812GPIOA0进行循环的置位操作和清除操作。C源程序如下:

#include DSP28_Device.h
void main(void) {
  InitSysCtrl();/*初始化系统*/
  DINT;/*关中断*/
  IER = 0x0000;
  IFR = 0x0000;
  InitPieCtrl();/*初始化PIE控制寄存器*/
  InitPieVectTable();/*初始化PIE矢量表*/
  InitGpio();/*初始化EV*/
  EINT;
  ERTM;
  for(;;) {
    GpioDataRegs.GPADAT.all=0xFFFF;
    GpioDataRegs.GPADAT.all=0xFFFF;
    GpioDataRegs.GPADAT.all=0xFFFF;
    GpioDataRegs.GPADAT.all=0x0000;
    GpioDataRegs.GPADAT.all=0x0000;
    GpioDataRegs.GPADAT.all=0x0000;
  }
}

500)this.width=500 border=0>
4  GPIOP0.25脚输出波形3

  其中最重要的是要对通用输入/输出进行初始化和确定系统CPU时钟。其中系统的时钟通过PLL设定为100 MHz,而初始化 InitGpio() 的源程序为:

#include DSP28_Device.h
void InitGpio(void)
{ EALLOW;
  //多路复用器选为数字I/O
  GpioMuxRegs.GPAMUX.all=0x0000;
  //GPIOAO为输出,其余为输入
  GpioMuxRegs.GPADIR.all=0x0001;
  GpioMuxRegs.GPAQUAL.all=0x0000;
  EDIS;
}

  通过在主程序for(;;)的地方加断点,可以很容易找到上面主程序中循环部分程序编译后的汇编指令:

  3F8011 L1:
  3F8011761FMOVWDP,#0x01C3
  3F8013 2820  MOV@32,#0xFFFF
  3F8015  2820  MOV@32,#0xFFFF
  3F8017 2820  MOV@32,#0xFFFF
  3F8019  2820 MOV@32,#0xFFFF
  3F801B  2820  MOV@32,#0xFFFF
  3F801D 2820 MOV@32,#0xFFFF
  3F801F 2B20  MOV@32,#0
  3F8020  2B20 MOV@32,#0
  3F8021  2B20  MOV@32,#0
  3F8022  6FEF  SBL1,UNC

  其中第1列为程序在RAM中的位置,第2列为机器码,后面就是汇编语言程序。指令“MOV @32,#0xFFFF”使GPIO输出高电平,指令“MOV @32,#0”使GPIO输出低电平。其中含有6个使GPIOA0输出高电平的指令和3个使GPIOA0输出低电平的指令,系统的指令周期为10 ns,因此循环周期中保持高电平的时间为60 ns。通过将该程序放在H0 SARAM中进行调试,可得GPIOA0的波形,如图5所示。其中高电平时间正好为60 ns。注意,由于3个低电平之后要进行跳转,故清空流水线的周期要长一些。

500)this.width=500 border=0>
5  TMS320F2812GPIOA0的波形1

  为了观察乘法指令的周期,将上述循环部分的C源程序修改为:

for(;;)
{Uint16 test1,test2,test3;
  test1=0x1234; test2=0x2345;
  GpioDataRegs.GPADAT.all=0xFFFF;
  GpioDataRegs.GPADAT.all=0xFFFF;
  GpioDataRegs.GPADAT.all=0xFFFF;
  test3=test1*test2;
  GpioDataRegs.GPADAT.all=0x0000;
  GpioDataRegs.GPADAT.all=0x0000;
  GpioDataRegs.GPADAT.all=0x0000;
}

  上述程序经过编译、链接后的汇编指令如下:

  3F8012L1:
  3F80122841MOV*-SP[1],#0x1234
  3F8014 2842 MOV*-SP[2],#0x2345
  3F8016 761F MOVWDP,#0x01C3
  3F8018 2820 MOV@32,#0xFFFF
  3F801A 2820 MOV@32,#0xFFFF
  3F801C 2820 MOV@32,#0xFFFF
  3F801E 2D42 MOVT,*-SP[2]
  3F801F 1241 MPYACC,T,*-SP[1]
  3F8020 9643 MOV*-SP[3],AL
  3F8021 2B20 MOV@32,#0
  3F8022 2B20 MOV@32,#0
  3F8023 2B20 MOV@32,#0
  3F8024 6FEE SBL1,UNC

  其中使GPIOA0为高电平的指令仍然为6个指令周期(其中包括1个乘法指令),因为乘法指令也是单周期的,因此循环周期中保持高电平的时间为 60 ns。通过将该程序放在H0 SARAM中进行调试可得GPIOA0的波形,如图6所示。其中高电平时间正好为60 ns,而由于3个低电平之后要进行跳转,要清空流水线,而且还要为乘法做准备,因此保持低电平的时间比图5所需的时间要长。当采用数字式示波器观察时,如果探头采用×1档观察的波形不是很理想,则可以采用×10,并配合调节探头的补偿旋钮。

500)this.width=500 border=0>
6  TMS320F2812GPIOA0的波形2

 


本帖有更多资源,需 登录 才可以下载,没有帐号?立即 注册

(0 ) (0 )
回复 举报

回复于 2020-02-05 沙发

感谢分享
(0 )
评论 (1) 举报

回复于 2020-02-12 2#

谢谢分享!!!
(0 )
评论 (1) 举报

回复于 2020-02-18 3#

感谢分享,欢迎关注我,资料持续更新中。有需要机械臂,电源,硬件电路设计,软件编程,开发板等各种定制的可以私聊我哦,相互学习,共同进步。
(0 )
评论 (1) 举报

回复于 2020-02-24 4#

支持下,谢谢分享!
(0 )
评论 (1) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部