DSP 2835 教程 附录3 DSP汇编语言
- 格式:ppt
- 大小:233.00 KB
- 文档页数:29
1.DSP汇编语言程序的编写(1)汇编语言源程序以.asm为其扩展名。
(2)汇编语言源程序的每一行都可以由4个部分组成,句法如下:[标号] [:] 助记符[操作数] [;注释]其中可用空格或TAB键隔开标号——供本程序的其他部分或其他程序调用。
标号是任选项,标号后面可以加也可以不加冒号“:”。
标号必须从第一列写起,标号最多可达到32个字符(A~Z ,a~z ,0~9 ,_ ,以及$),但第1个字符不能以数字开头。
引用标号时,标号的大小写必须一致。
标号的值就是SPC(段程序计数器)的值。
如果不用标号,则第一个字符必须为空格、分号或星号(*)。
助记符——助记符指令、汇编指令、宏指令和宏调用。
作为助记符指令,一般用大写;汇编命令和宏指令,以英文句号“.”开始,且为小写。
汇编命令可以形成常数和变量,当用它控制汇编和连接过程时,可以不占用存储空间。
指令和汇编命令都不能写在第1列。
操作数——指令中的操作数或汇编命令中定义的内容。
操作数之间必须用逗号“,”分开。
有的指令操作无操作数,如NOP、RESET。
注释——注释从分号“;”开始,可以放在指令或汇编命令的后面,也可以放在单独的一行或数行。
注释是任选项。
如果注释从第1列开始,也可以用“*”表示注释。
(3)常用的汇编命令如表所示。
(4)汇编语言程序中的数据形式如表所示2.程序2.1 程序一编程目的:了解DSP的输入和输出方法程序功能:求乘积之和y=a1*x1+a2*x2+a3*x3+a4*x4.title "mpy_add.asm".mmregs ;将存储映像寄存器导入列表STACK .usect "STACK",10h ;给堆栈段分配空间.bss a,4 ;将9个字空间分配给各个变量.bss x,4.bss y,1PA0 .set 0 ;将端口PA0全部置0.def start ;定义标号start.data ;定义数据代码段table: .word 4,4,4,4.word 4,4,4,4.text ;定义文本代码段start: STM #0,SWWSR ;将等待寄存器设为0,表示不等待STM #STACK+10h,SP ;设堆栈指针STM #a,AR1 ;将AR1指向变量a的地址RPT #7 ;从程序存储空间转移7+1个值到数据储存空间MVPD table,*AR1+CALL SUM ;调用SUM子程序end: B end ;循环等待SUM: STM #a,AR3 ;将AR3指向变量a的地址STM #x,AR4 ;将AR4指向变量x的地址RPTZ A,#3 ;将A清0,并重复执行下一条指令3+1次MAC *AR3+,*AR4+,ASTL A,@y ;将寄存器A中的低16位存入y地址空间PORTW @y,PA0 ;将y地址中的值输出到输出口RET ;子程序返回.end ;程序结束等待位的设置:C54x片内有一部件——软件可编程等待状态发生器,控制着外部总线的工作。
DSP28335汇编教程当硬件执行指令时,寻找指令所指定的参与运算飞操作数的方式——寻址方式。
根据程序的要求采用不同的寻址方式,可以有效地缩短程序的运行时间和提高代码执行效率。
汇编指令是可执行指令,每一条指令对应一条机器码,用来控制处理器仲的执行部分进行各种操作。
在本章节当中将主要以基于C28x的DSP芯片为例,为读者讲解DSP的寻址方式和汇编指令系统,其中大部分内容也可适用于其他Ti公司的DSP产品。
6.1汇编语言指令集概述在学习C28x系列DSP的寻址方式和汇编指令指令之前,先来对一些基础的知识进行讲解一下先,在汇编程序当中开发人员会常常使用到许多的特殊符号和标志,它们都具有特殊的含义,在学习汇编之前读者们必须先理解这些符号和标志含义,在这里会对其中最常用最重要的操作数符号和寄存器经行详细说明。
在进行汇编讲解之前先来了解一下开发的核心——CPU。
在TMS320C2000系列中,CPU 内核为:C20x/C24x/C240x:C2xLP:C27x/C28x:C27x、C28x这些CPU的硬件结构有一定差别,指令集也不相同,但是,在C28x芯片中可以通过选择兼容特性模式,使C28xCPU与C27xCPU及C2xLPCPU具有最佳兼容性。
可通过状寄存器STl的位OBJMODE和位AMODE的组合,选定模式。
C28x芯片具有3种操作模式:1.C28x模式:在该模式中,用户可以使用C28x的所有有效特性、寻址方式和指令系统,因此,一般应使C28x芯片工作于该种模式。
2.C27x目标——兼容模式:在复位时,C28x的CPU处于C27x目标-兼容模式。
在该模式下,目标码与C27xCPU完全兼容,且它的循环—计数也与C27xCPU兼容。
3.C2xLP源——兼容模式:该模式允许用户运行C2xLP的源代码,这些源代码是用C28x代码生成工具编译生成的。
在下面的讲解当中会牵涉到模式的转换,希望读者要搞清楚每一个模式的对应关系。
竭诚为您提供优质文档/双击可除dsp,tms320f28335,汇编编码,规范篇一:tms320F28335中文资料tms320F28335中文资料tms320F28335采用176引脚lqFp四边形封装,其功能结构参见参考文献。
其主要性能如下:高性能的静态cmos技术,指令周期为6.67ns,主频达150mhz;高性能的32位cpu,单精度浮点运算单元(Fpu),采用哈佛流水线结构,能够快速执行中断响应,并具有统一的内存管理模式,可用c/c++语言实现复杂的数学算法;6通道的dma控制器;片上256kxl6的Flash存储器,34kxl6的saRam存储器.1kx16otpRom和8kxl6的bootRom。
其中Flash,otpRom,16kxl6的saRam均受密码保护;控制时钟系统具有片上振荡器,看门狗模块,支持动态pll调节,内部可编程锁相环,通过软件设置相应寄存器的值改变cpu的输入时钟频率;8个外部中断,相对tms320F281x系列的dsp,无专门的中断引脚。
gpi00~gpi063连接到该中断。
gpi00一gpi031连接到xintl,xint2及xnmi外部中断,gpl032~gpi063连接到xint3一xint7外部中断;支持58个外设中断的外设中断扩展控制器(pie),管理片上外设和外部引脚引起的中断请求;增强型的外设模块:18个pwm输出,包含6个高分辨率脉宽调制模块(hRpwm)、6个事件捕获输入,2通道的正交调制模块(qep);3个32位的定时器,定时器0和定时器1用作一般的定时器,定时器0接到pie模块,定时器1接到中断intl3;定时器2用于dsp/bios的片上实时系统,连接到中断intl4,如果系统不使用dsp/bios,定时器2可用于一般定时器;串行外设为2通道can模块、3通道sci模块、2个mcbsp(多通道缓冲串行接口)模块、1个spi模块、1个i2c主从兼容的串行总线接口模块;12位的a/d转换器具有16个转换通道、2个采样保持器、内外部参考电压,转换速度为80ns,同时支持多通道转换;88个可编程的复用gpio引脚;低功耗模式;1.9V内核,3.3Vi/o供电;符合ieeell49.1标准的片内扫描仿真接口(jtag);tms320F28335的存储器映射需注意以下几点:片上外设寄存器块0~3只能用于数据存储区,用户不能在该存储区内写入程序。
《DSP技术》课程实验指导书中原工学院电子信息学院2015-5-4《电能变换与控制试验平台—DSP技术》课程实验指导书一、课程的目的、任务本课程是电气工程及其自动化专业学生在学习电力电能变换及控制方向课程中的一门实践性技术课程,其目的在于通过实验使学生能更好地理解和掌握电能变换及控制基本理论,培养学生理论联系实际的学风和科学态度,提高学生的电工实验技能和分析处理实际问题的能力。
为后续课程的学习打下基础。
二、课程的教学内容与要求本试验平台可完成DSP技术CCS使用、时钟、中断、定时器、A/D转换、EV 事件管理模块和通信等实验,可根据教学大纲的要求进行选取。
三、各实验具体要求见P2四、实验报告学生结束实验后应完成相应的实验报告并交给指导老师。
其中实验报告的主要内容包括:实验目的,实验内容,实验结果和实验心得等。
实验一 CCS软件的认识实验目的1.熟悉 CCS 集成开发环境,掌握工程的生成方法;2.掌握 CCS 集成开发环境的调试方法;实验内容:1. DSP 源文件的建立;2. DSP 程序工程文件的建立;3.学习使用 CCS 集成开发工具的调试工具;实验知识背景:CCS 提供了配置、建立、调试、跟踪和分析程序的工具,它便于实时、嵌入式信号处理程序的编制和测试,它能够加速开发进程,提高工作效率。
CCS 提供了基本的代码生成工具,它们具有一系列的调试、分析能力。
(1)CCS3.3的安装与配置和CCS3.1类似,先安装CCS3.3,路径可选择为C:\CCStudio_v3.3,桌面上会出现和两个图标,然后安装硬件仿真器usb驱动SEED-XDSUSB_CCS3.3,路径仍为C:\CCStudio_v3.3,C:\CCStudio_v3.3\drivers出现Seedusb2.cfg文件,安装完毕后,先双击图标进入Code Composer Studio Setup,在Family下拉列表中选择C28xx。
DSP实验三、TMS320F28335定时器控制LED亮灭继续我的第三个实验;实现定时器控制LED亮灭:学习⽬的:定时器的寄存器设置及准确定时功能,F28335共有三个定时器:timer0、timer1、timer2(timer2也可⽤于DSP/BIOS);功能描述:上电默认LD4灭;初始化完成后,LD4以1HZ(1S)频率做状态翻转;电路连接说明:LD4设置为通⽤GPIO 上拉输出初始化后默认为输出LD4灭状态;LD4控制LED灯的负极,如下图;本次实验选⽤定时器0,程序时刻读取计数器的值,当值为0时,LD4状态翻转,计数器重载;程序设计说明:定时器0的预定标寄存器和计数器设置:定时器时钟为sysclkout=135MHz,预定标寄存器设为1350,计数器设为100000;135Mhz/(1350*100000=1Hz)主要程序如下:CpuTimer0Regs.TPR.bit.TDDR = 0x546 & 0xFF;//0x546 预定标寄存器(预分频器)CpuTimer0Regs.TPRH.bit.TDDRH = (0x546>>8) & 0x00FF;//0x546 预定标寄存器(预分频器)注意:在对分配寄存器设置是出现问题,TDDR、TDDRH是两个8位寄存器组成的16位寄存器。
源程序如下:#include"DSP2833x_Device.h"// DSP2833x Headerfile Include File#include"DSP2833x_Examples.h"// DSP2833x Examples Include File#define LD3_ON() GpioDataRegs.GPACLEAR.bit.GPIO0 = 1#define LD3_OFF() GpioDataRegs.GPASET.bit.GPIO0 = 1#define LD3_TOGGLE() GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1#define LD4_ON() GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1#define LD4_OFF() GpioDataRegs.GPBSET.bit.GPIO34 = 1#define LD4_TOGGLE() GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1#define Key_SW12() GpioDataRegs.GPBDAT.bit.GPIO50/** main.c*/int main(void) {InitSysCtrl();IER = 0x0000;IFR = 0x0000;InitPieCtrl();InitPieVectTable();InitGpio();EALLOW;//GPIO0 LD3 控制LED负极GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;//0 gpio modeGpioCtrlRegs.GPADIR.bit.GPIO0 = 1;//1 output 0 inputGpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//1 enable pullup 0 disable pullup//GPIO34 LD4 控制LED负极GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;//0 gpio modeGpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;//1 output 0 inputGpioCtrlRegs.GPBPUD.bit.GPIO34 = 0;//1 enable pullup 0 disable pullup//GPIO50 按键矩阵SW12输⼊端GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;//0 gpio modeGpioCtrlRegs.GPBDIR.bit. GPIO50 = 0;//1 output 0 inputGpioCtrlRegs.GPBPUD.bit. GPIO50 = 0;//1 enable pullup 0 disable pullup GpioCtrlRegs.GPBCTRL.bit.QUALPRD2= 200;//采样周期=2*Tsysclkout*200GpioCtrlRegs.GPBQSEL2.bit.GPIO50 = 2;//采样窗内3次采样结构相同//GPIO53 按键矩阵负极输出0GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0;//0 gpio modeGpioCtrlRegs.GPBDIR.bit. GPIO53 = 1;//1 output 0 inputGpioCtrlRegs.GPBPUD.bit. GPIO53 = 0;//1 enable pullup 0 disable pullupGpioDataRegs.GPBCLEAR.bit.GPIO53 = 1;LD3_ON();//默认输出亮状态LD4_OFF();EDIS;//定时器0 设为1Hz = 135MHz/(1350*100000)CpuTimer0Regs.PRD.all = 100000;//0x186A0 周期寄存器CpuTimer0Regs.TPR.bit.TDDR = 0x546 & 0xFF;//0x546 预定标寄存器(预分频器)CpuTimer0Regs.TPRH.bit.TDDRH= (0x546>>8) & 0x00FF;//0x546 预定标寄存器(预分频器)CpuTimer0Regs.TCR.bit.TSS = 1;//1停⽌定时器⼯作 0启动定时器CpuTimer0Regs.TCR.bit.TRB = 1;//重载定时器计数器和预分频器CpuTimer0Regs.TCR.bit.TSS = 0;//1停⽌定时器⼯作 0启动定时器{if(CpuTimer0Regs.TIM.all==0){LD4_TOGGLE() ;CpuTimer0Regs.TCR.bit.TSS = 1;//1停⽌定时器⼯作 0启动定时器CpuTimer0Regs.TCR.bit.TRB = 1;//重载定时器计数器和预分频器CpuTimer0Regs.TCR.bit.TSS = 0;//1停⽌定时器⼯作 0启动定时器}}}主循环应该采⽤⽤下⾯的语句更合理,即采⽤判断定时器中断标志的⽅式,来判断计数器为0,计数结束,如下:while(1){if(CpuTimer0Regs.TCR.bit.TIF==1){ //中断标志位,即使没有使能中断,但是定时计数器减到0时,该位置1,该位写1清0 CpuTimer0Regs.TCR.bit.TIF=1;//清中断标志位LD4_TOGGLE() ;}}。