TMS320F28x入门的情况说明_第1页
TMS320F28x入门的情况说明_第2页
TMS320F28x入门的情况说明_第3页
TMS320F28x入门的情况说明_第4页
TMS320F28x入门的情况说明_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

wordword示例6.2说明了如何确定240xA通信的最大波特率。假定LSPCLK=40MHz。SPI最大波特率:SPI波特率===10×10bps//官方SPI例子voidInitSpiaGpio(){EALLOW;GpioCtrlRegs.GPAPUD.bit.GPIO16=0;//Enablepull-uponGPIO16(SPISIMOA)GpioCtrlRegs.GPAPUD.bit.GPIO17=0;//Enablepull-uponGPIO17(SPISOMIA)GpioCtrlRegs.GPAPUD.bit.GPIO18=0;//Enablepull-uponGPIO18(SPICLKA)GpioCtrlRegs.GPAPUD.bit.GPIO19=0;//Enablepull-uponGPIO19(SPISTEA)GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;//ConfigureGPIO16asSPISIMOAGpioCtrlRegs.GPAMUX2.bit.GPIO17=1;//ConfigureGPIO17asSPISOMIAGpioCtrlRegs.GPAMUX2.bit.GPIO18=1;//ConfigureGPIO18asSPICLKAGpioCtrlRegs.GPAMUX2.bit.GPIO19=1;//ConfigureGPIO19asSPISTEAEDIS;}voidspi_fifo_init() //InitializeSPIFIFOregisters{SpiaRegs.SPICCR.bit.SPISWRESET=0; //重设SPISpiaRegs.SPICCR.all=0x001F; //使能SPI回环模式,SIMO和SOMI在内部互联SpiaRegs.SPICTL.all=0x0017; //允许中断,Master/SlaveXMITenabledSpiaRegs.SPISTS.all=0x0000; SpiaRegs.SPIBRR=0x0063; //spbrr>4时SPI波特率=<4不加1SpiaRegs.SPIFFTX.all=0xC022; //EnableFIFO's,setTXFIFOlevelto4SpiaRegs.SPIFFRX.all=0x0022; //SetRXFIFOlevelto4SpiaRegs.SPIFFCT.all=0x00;SpiaRegs.SPIPRI.all=0x0010;SpiaRegs.SPICCR.bit.SPISWRESET=1; //EnableSPISpiaRegs.SPIFFTX.bit.TXFIFO=1;SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;}voidspi_init(){SpiaRegs.SPICCR.all=0x000F;//Reseton,risingedge,16-bitcharbitsSpiaRegs.SPICTL.all=0x0006;//开启主模式,normalphase,//enabletalk,andSPIintdisabled.SpiaRegs.SPIBRR=0x007F; //设置波特率SpiaRegs.SPICCR.all=0x009F;//RelinquishSPIfromResetSpiaRegs.SPIPRI.bit.FREE=1;//Setsobreakpointsdon'tdisturbxmission}sdata=0x0000;for(;;){//Transmitdataspi_xmit(sdata);//Waituntildataisreceivedwhile(SpiaRegs.SPIFFRX.bit.RXFFST!=1){}//Checkagainstsentdatardata=SpiaRegs.SPIRXBUF;if(rdata!=sdata)error();sdata++;}}voidspi_xmit(Uint16a){SpiaRegs.SPITXBUF=a;}CANCAN位时序配置CAN协议技术规X把表成为时间分为4个不同的时间段。SYNC_SEG:这局部时间用于同步总线上的不同节点。预计这一段内有一个边沿。这个局部始终是1个时间定额〔TQ〕PROP_SEG:这局部位时间用来补偿网络内的物理延迟时间。它是总线线路上信号传播时间。他是总线线路上信号传播时间、输入比拟器延时和输出驱动器延时总和的两倍。这局部编程为1-88个时间定额〔TQ〕PHASE_SEG1:这个香味被用于补偿正边沿相位误差。这局部可在1-8个时间定额〔TQ〕之间编辑,并可通过重新同步加长。PHASE_SEG2:这个相位被用于补偿负边沿香味误差。这局部可在2-8个时间定额〔TQ〕之间编辑,并可通过重新同步来缩短。在Ecan模式ZHONG,CAN总线上一个位的长度由参数TSEG1(BTC[6:3])、TSEG2(BTC[20])和BRP(BTC[23:16])确定。注意:修改控制和状态存放器需32位访问修改存放器第一步:执行一个32位读取,以复制整个存放器内容带他的映射存放器第二步:修改映射存放器中所需要的一个或多个位第三步:执行一个32位写入以复制修改后的映射存放器到它的映射存放器中ECanaShadow.CANTIOC.all=ECanaRegs.CANTIOC.all;ECanaShadow.CANTIOC.bit.TXFUNC=1;ECanaRegs.CANTIOC.all=ECanaShadow.CANTIOC.all;读取或者检查存放器的值首先:复制整个CANTA存放器到它的映射存放器然后:检查相关位最后:重复此操作,直到条件的带满足 do { ECanaShadow.CANES.all=ECanaRegs.CANES.all;}while(ECanaShadow.CANES.bit.CCE!=0);CAN比特率计算配置eCAN的步骤CAN模块的使能时钟将CANTX和CANRX引脚设定为CAN功能将CANTX和CANRX引脚设定为CAN功能:写入CANTIOC[3:0]=0x08复位后,CCR位〔CANMC[12]〕和CCE位〔CANES[4]〕设置为1.这使用户能够配置时序配置存放器〔CANBTC〕如果CCE位被设置〔CANES[4]=1〕,进展下一步操作:否如此,设置CCR位和(CANMC[12]=1)并等待,直到CCE位设置〔CANES[4]=1〕使用适当的时序值对CANBTC存放器进展配置,确保TSEG1和TSEG2不等于0.如果两个值等于0,如此模块不能退出初始化模式。对于SCC模式,现在对验收屏蔽存放器编程。例如:写入LAM(3)=0Xc000。对主控制器〔CANMC〕进展如下编程:去除CCR(CANMC[12])=0;去除PDR(CANMC[11])=0; 去除DBO(CANMC[10])=0;去除WUBA(CANMC[9])=0;去除CDR(CANMC[8])=0; 去除ABO(CANMC[7])=0;去除STM(CANMC[6])=0; 去除SRES(CANMC[5])=0;去除MBNR(CANMC[4:0])=0;将MSGCTRLn存放器所有为初始化为0验证CCE位是否被清0〔CANSE[4]=0〕,如果被清零如此明确CAN模块已被配置配置用于传输将CANTRS存放器中适当位清0:去除CANTRS[1]=0(向TRS写入0无效,相反设置TRR[1]并等待知道TRS[1]去除)。如果RTR位被去除,TRS可以发送一个远程帧。一旦一个远程帧被发送,如此的TRS位被CAN模块去除。因此,同一个可被用来从其他节点中请求一个数据帧通过去除使能〔CANME〕存放器的相应为来禁用,即CANME.filter1=0加载的消息标识符〔MSGID〕存放器对于正常的发送〔MSGID[30]=0和MSGID[29]=0〕,去除AME(MSGID[30])和AAM(MSGID[29])位。在操作过程中,该存放器通常不会被修改。只有在被禁用时,才能把它修改。例如:写入MSGID(1)=0x15AC0000消息控制字段存放器〔MSGCTRL[3:0]〕DLC字段写入数据的长度。RTR标志通常会被清楚〔MSGCTRL[4]=0〕通过清楚CANMD存放器的相应为来设置方向去除CANMD[1]=0通过设置CANME存放器相应位设置启用设置CANME[1]=1,这将1配置为传输模式传输一个消息将消息数据写入数据字段由于在配置时,DBO〔MC[10]〕设置为0,MSGCTRL[1]设置为2,数据存储在CANMDL[1]2个最有效字节中写入CANMDL[1]=xxxx0000h在发送请求存放器中设定相应的标志位〔CANTRS[1]=1〕来启动消息传输。现在CAN模块处理CAN消息的完整传输等待,知道相应的发送确认标志被设置〔TA[1]=1〕。成功传输后,CAN模块设置此标志传输成功或中止传输后,模块将TRS标志复位为0〔TRS[1]=0〕。为了下一个出啊书〔从同一〕发送确认必须清楚。设置TA[1]=1等到TA读取为0要在同一发送另一消息,RAM中的数据必须更新。设置TRS[1]标志来启动下一个传输。写入RAM中的可以使半字〔16位〕或者整字〔32位〕,但模块总是从偶数边界返回32位。CPU必须接收所有32为或其中的一局部配置用以接收去除是能〔CANME〕存放器的相应位来禁用,即CANME[3]=0;将所选的标识符写入相应的MSGID存放器。标识符扩展位必须被配置为适合预计的标识符。如果使用验收屏蔽,验收屏蔽使能(AME)位必须被设定〔MSGID[30]=1〕。例如MSGID(3)=0x4f780000。AME为如果设置为1,必须设定相应的验收屏蔽。写入LAM(3)-0x03C0000。通过设置方向存放器〔CANMD[3]=1〕的相应标志位,将配置为一个接收。确保此操作不会影响该存放器的其他位。如果设置中的数据收到保护,现在需要对写覆盖保护控制器〔CANOPC〕进展编程。如果没有消息必须被丢弃,这种保护是非常游泳的。如果设置了OPC,该软件必须确保一个额外的〔缓冲〕被配置用来存储“溢出〞的消息;否如此,消息可能会在没有任何通知的情况下丢失。写入OPC[3]=1通过设置中的使能存放器〔CANME〕相应的标志来启动。这必须通过都取CANME,并写回〔CANME|=0x0008〕的方法来完成以确保没有其他标志被意外更改对象先被配置为承受模式。该对象的任何传入消息都将自动处理接收一个消息以3为例。当承受到一个消息时,接收消息等待存放器〔CANRMP〕的相应标志被设为1,并产生一个终端然后CPU可以从RAM中读取消息。在CPU从读取消息之前,应先去除RMP位〔RMP[3]=1〕。CPU还应该检查接收消息丢失标志RML[3]=1。根据不同的应用,CPU来决定如何处理这种情况。读取数据后,CPU需要检查RMP位有没有模块设置再次设置。如果RMP位已经被设置为1,说明数据有可能损坏。因为当CPU读取旧消息的同时收到一个消息,所以CPU需要再次读取数据过载情况的处理远程帧的处理中断voidInitECana(void)//InitializeeCAN-Amodule{/*必须建立CAN存放器的shadowregister结构体,控制和状态存放器只允许32位访问,16位访问可能破坏该存放器的内容或正返回错误的数据structECAN_REGSECanaShadow;EALLOW;/*设置eCANRX&TX*/ECanaShadow.CANTIOC.all=ECanaRegs.CANTIOC.all;ECanaShadow.CANTIOC.bit.TXFUNC=1;ECanaRegs.CANTIOC.all=ECanaShadow.CANTIOC.all;ECanaShadow.CANRIOC.all=ECanaRegs.CANRIOC.all;ECanaShadow.CANRIOC.bit.RXFUNC=1;ECanaRegs.CANRIOC.all=ECanaShadow.CANRIOC.all;/*ConfigureeCANforHECCmode-(reqdtoaccessmailboxes16thru31)*///HECCmodealsoenablestime-stampingfeatureECanaShadow.CANMC.all=ECanaRegs.CANMC.all;ECanaShadow.CANMC.bit.SCB=1;ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;//MSGCTRL的一些位会变成未知值,MSGCTRL所有的位包含被保存必须被清0//messagecontrolregister\\ECanaMboxes.MBOX0.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX1.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX2.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX3.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX4.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX5.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX6.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX7.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX8.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX9.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX10.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX11.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX12.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX13.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX14.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX15.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX16.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX17.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX18.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX19.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX20.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX21.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX22.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX23.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX24.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX25.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX26.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX27.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX28.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX29.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX30.MSGCTRL.all=0x00000000;ECanaMboxes.MBOX31.MSGCTRL.all=0x00000000;//TAn,RMPn,GIFnbitsareallzerouponresetandareclearedagain//asamatterofprecaution.ECanaRegs.CANTA.all=0xFFFFFFFF;/*ClearallTAnbits*/ECanaRegs.CANRMP.all=0xFFFFFFFF;/*ClearallRMPnbits*/ECanaRegs.CANGIF0.all=0xFFFFFFFF;/*Clearallinterruptflagbits*/ECanaRegs.CANGIF1.all=0xFFFFFFFF;/*ConfigurebittimingparametersforeCANA*/ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;ECanaShadow.CANMC.bit.CCR=1;//SetCCR=1ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;//WaituntiltheCPUhasbeengrantedpermissiontochangetheconfigurationregistersdo{ECanaShadow.CANES.all=ECanaRegs.CANES.all;}while(ECanaShadow.CANES.bit.CCE!=1);//WaitforCCEbittobeset..ECanaShadow.CANBTC.all=0;/*Thefollowingblockisonlyfor60MHzSYSCLKOUT.(30MHzCANmoduleclockBitrate=1MbpsECanaShadow.CANBTC.bit.BRPREG=2;ECanaShadow.CANBTC.bit.TSEG2REG=1;ECanaShadow.CANBTC.bit.TSEG1REG=6;ECanaShadow.CANBTC.bit.SAM=1;ECanaRegs.CANBTC.all=ECanaShadow.CANBTC.all;ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;ECanaShadow.CANMC.bit.CCR=0;//SetCCR=0ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;//WaituntiltheCPUnolongerhaspermissiontochangetheconfigurationregistersdo{ECanaShadow.CANES.all=ECanaRegs.CANES.all;}while(ECanaShadow.CANES.bit.CCE!=0);//WaitforCCEbittobecleared../*DisableallMailboxes*/ECanaRegs.CANME.all=0;//RequiredbeforewritingtheMSGIDsEDIS;}voidInitECanaGpio(void){EALLOW;GpioCtrlRegs.GPAPUD.bit.GPIO30=0;//Enablepull-upforGPIO30(CANRXA)GpioCtrlRegs.GPAPUD.bit.GPIO31=0;//Enablepull-upforGPIO31(CANTXA)GpioCtrlRegs.GPAQSEL2.bit.GPIO30=3;//AsynchqualforGPIO30(CANRXA)GpioCtrlRegs.GPAMUX2.bit.GPIO30=1;//ConfigureGPIO30forCANRXAoperationGpioCtrlRegs.GPAMUX2.bit.GPIO31=1;//ConfigureGPIO31forCANTXAoperationEDIS;}voidCAN_Config(void){ InitECan(); //volatileeCAN_REGGSECanaShadows; ECanaMboxes.MBOX25.MSGID.all=0x95555555 //扩展的标识符 /*配置被测试的为发送*/ ECanaShadow.CANMD.all=ECanaRegs.CANMD.all; ECanaShadow.CANMD.bit.MD25=0; ECanaRegs.CANMD.all=ECanaShadow.CANMD.all; /*使能被测试的*/ ECanaShadow.CANME.all=ECanaRegs.CANME.all; ECanaRegs.CANME.bit.ME25=1; ECanaRegs.CANME.all=ECanaShadow.CANME.all; /*在主控制器存放器中写入DLC*/ ECanaMboxes.MBOX25.MDL.all=0x55555555; ECanaMboxes.MBOX25.MDH.all=0x55555555; for(i=0;i<TXVOUNT;i++) { ECanaShadow.CANTRS.all=0; ECanaShadow.CANTRS.bit.TRS25=1; //为测试的设置TRS ECanaShadow.CANTRS.all=ECanaShadow.CANTRS.all; do { ECanaShadow.CANTA.all=ECanaRegs.CANTA.all; } while(ECanaShadow.CANTA.bit.TA25==0); //等待TA5被置位 ECanaShadow.CANTA.all=0; ECanaShadow.CANTA.bit.TA25=1; //去除TA25 ECanaRegs.CANTA.all=ECanaShadow.CANTA.all; loopcount++; } asm("ESTOP0"); }

CMD文件为什么DSP里面有CMD文件,而普通的单片机却没有呢?通常DSP内部集成了存储器或外部扩展存储器。存储器统一映射到程序空间或者数据空间。DSP中,存储器映射空间除SRAM和flash外还有保存空间(可用于扩展外部存储器与外设),比拟杂乱。DSP的编译器自身不能定位执行代码位置,因此设计人员需要自己去定义代码存放和加载位置。单片机就比拟简单了,编译器自身会定位代码地址,所以一般无需去定位地址。CMD由几局部组成,各有什么功能?CMD由MEMORY和SECTIONS两局部组成。MEMERY用于定义每个存储器块的名字、起始地址和长度。SECTIONS主要用于描述哪个段映射到了哪段存储空间〔包括所在段的页类型,其中PAGE0规定为程序存储区,PAGE1为数据存储区〕。CMD文件中有哪些段?各自作用?CMD文件里有两个根本的段:初始化段和非初始化段。初始化段包含代码和常数等必须在DSP上电之后有效的数。故初始化块必须保存在如片内FLASH等非易失性存储器中,非初始化段中含有在程序运行过程中才像变量内写数据进去,所以非初始化段必须到易失性存储器中如RAM。

已初始化的段:.text,.cinit,.const,.econst,.pinit和.switch...text:所有可以执行的代码和常量.cinit:全局变量和静态变量的C初始化记录,包含未用const声明的外部〔extern〕或静态〔static〕数据表.const:包含字符串常量和初始化的全局变量和静态变量〔由const〕的初始化和说明.econst:包含字符串常量和初始化的全局变量和静态变量〔由farconst〕的初始化和说明,与.const不同的是.const分配X围被限制在低64K16位数据区,而.econst的分配X围是4M22位数据区.pinit:全局构造器〔C++〕程序列表.switch:包含switch声明的列表非初始化的段:.bss,.ebss,.stack,.sysmem,和esysmem.〔更好的理解就是,这些段就是存储空间而已〕.bss:为全局变量和局部变量保存的空间,在程序上电时.cinit空间中的数据复制出来并存储在.bss空间中。.ebss:为使用大存放器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss中,与.bss不同的是.bss分配X围被限制在低64K16位数据区,而.ebss的分配X围是4M22位数据区.stack:为系统堆栈保存的空间,用于和函数传递变量或为局部变量分配空间。.sysmem:为动态存储分配保存的空间。如果有malloc函数,此空间被宏函数占用,如果没有的用到,将不产生该段.esysmem:为动态存储分配保存的空间。如果有farmalloc函数,此空间被相应的占用,如果没有的用到,将不产生该段修改CMD文件时应该注意什么?不同DSP的存储空间映射地址差异很大。我们看一下2407、28035、2812的存储器间地址故修改CMD文件中MEMORY时注意,需比照相应DSP的存储器地址,来修改段。各个段的地址不能跨界;数据段空间不要映射到程序段地址。保存空间如用于外扩外设或存储器方可使用,如外部未使用保存空间,如此不能使用保存空间SECTION中,通常,.text、.cint、.switch等初始化段连接至ROM或RAM空间,且必须位于程序存储器空间(PAGE0)。.const块可以至ROM或RAM空间,且必须是数据存储器空间(PAGE1)。而.bass、.ebass、.sysmem、.eysmem等未初始化段必须连接至RAM空间,且必须位于数据存储器空间(PAGE1)。

TMS320F28035DEMO板实验GPIO实验第一个LED灯的点亮这是利用存放器操作,也可通过修改相应的函数进展。自己多琢磨!#include"DSP28x_Project.h"//中断程序在DSP2802x_DefaultIsr.c中填写,记得对应地址main(){ InitSysCtrl();//SystemControlregisters初始化:PLLWATCHDOG启动外设时钟 DINT; //禁止所有中断 InitPieCtrl(); //初始化中断向量控制存放器 IER=0x0000; //关闭CPU中断并清楚所有CPU中断标志位 IFR=0x0000; InitPieVectTable(); //初始化中断向量表 EALLOW; GpioCtrlRegs.GPAMUX1.bit.GPIO0=0; //数字IO GpioCtrlRegs.GPAMUX1.bit.GPIO1=0; //数字IO GpioCtrlRegs.GPAPUD.bit.GPIO0=0; GpioCtrlRegs.GPAPUD.bit.GPIO1=0; GpioCtrlRegs.GPADIR.bit.GPIO0=1; //输出 GpioCtrlRegs.GPADIR.bit.GPIO1=1; //输出 GpioCtrlRegs.GPAQSEL1.bit.GPIO0=0; GpioCtrlRegs.GPAQSEL1.bit.GPIO1=0; GpioDataRegs.GPBCLEAR.all=0XFFFFFFFF; GpioDataRegs.GPASET.bit.GPIO0=0x0001; GpioDataRegs.GPASET.bit.GPIO1=0x0001; /***定时器中断设置******/ CpuTimer0Regs.TPR.bit.TDDR=59; CpuTimer0Regs.TPRH.bit.TDDRH=0;//对输入时钟60分频,60M/60=1M CpuTimer0Regs.PRD.all=1000000;//准确定时1s CpuTimer0Regs.TCR.bit.TRB=1;//reload CpuTimer0Regs.TCR.bit.TIE=1;//使能中断 CpuTimer0Regs.TCR.bit.TSS=0;//开始计数 EALLOW; //PieVectTable.TINT0=&tim0_isr; PieCtrlRegs.PIECTRL.bit.ENPIE=1;//使能PIE IER|=0x0001; //使能GROUP1 EINT; EDIS; while(1);}interruptvoidTINT0_ISR(void)//CPU-Timer0{ GpioDataRegs.GPATOGGLE.bit.GPIO0=1; PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;}定时器中断实验系统初始化时钟配置GPIO配置定时器配置定时器中断设置原理:利用两个定时器产生占空比不断变化的PWM波。#include"DSP28x_Project.h"//includesalloftheheaderfilesanddefinesusedinthe//中断程序在DSP2802x_DefaultIsr.c中填写,记得对应地址main(){ InitSysCtrl(); DINT; //禁止所有中断 InitPieCtrl(); //初始化中断向量控制存放器 IER=0x0000; //关闭CPU中断并清楚所有CPU中断标志位 IFR=0x0000; InitPieVectTable(); //初始化中断向量表 InitGpio();//定时器中断配置EALLOW;PieVectTable.TINT0=&TINT0_ISR;EDIS;InitCpuTimers();ConfigCpuTimer(&CpuTimer0,60,10000);//设定中断周期,"Freq"为"MHz",period为"uS",故60*1M/60M=1sCpuTimer0Regs.TCR.all=0x4001;//使TSS为0,打开定时器0IER|=M_INT1;IER|=M_INT2;PieCtrlRegs.PIEIER1.bit.INTx7=1;//TINT0为PIE组1的第7位EINT;//使能全局中断INTMERTM;//使能全局实时中断DBGM for(;;);} interruptvoidINT13_ISR(void)//INT13orCPU-Timer1{ if(Duty<100) Duty++; else Duty=1; ConfigCpuTimer(&CpuTimer1,59,Duty); GpioDataRegs.GPASET.bit.GPIO0=1;//gpio0为高电平,LED_OFF EDIS;//CPU直接确认,无需经过PIE}interruptvoidINT13_ISR(void)//INT13orCPU-Timer1{CpuTimer1Regs.TCR.bit.TSS=1;//1=停定时器,0=开始定时器Countet_int1++;if(Countet_int1==800){ Countet_int1=0;if(Duty<100) Duty=Duty+1;elseDuty=1;} interruptvoidTINT0_ISR(void)//CPU-Timer0{Uint32temp;temp=(long)(59*Duty);CpuTimer1Regs.PRD.all=temp;CpuTimer1Regs.TCR.bit.TRB=1;GpioDataRegs.GPACLEAR.bit.GPIO0=1;//GPIO0低电平,LED_ONPieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//中断应答,可以继续接收中断CpuTimer1Regs.TCR.bit.TSS=0; //0=开始定时器}效果:LED从暗匀速变亮,本人未继续实现其从亮至按的过程,只需进一步修改DUTY的值使其逐渐减小即可。如果需要改变变化速度可改变定时器0的数值,越大产生的pwm的占空比越小,变化至满载速度变慢。PWM占空比调节原理:利用占空比不断变化的PWM波产生忽明忽暗的效果。功能:可以通过按键调节占空比,由于是学习,本人未将按键去抖动程序写完美,会出现持续调节占空比的情况。 修改频率通过修改 EPwm1Regs.TBPRD=1000;修改占空比通过修改EPwm1Regs.CMPA.half.CMPA=Duty++;#include"DSP28x_Project.h"Uint16Duty=300;main(){InitSysCtrl();//外设时钟60MHzDINT;//禁止所有中断InitPieCtrl();//初始化中断向量控制存放器IER=0x0000;//关闭CPU中断并清楚所有CPU中断标志位IFR=0x0000;InitPieVectTable();//初始化中断向量表/****GPIO配置****/GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;//数字IOGpioCtrlRegs.GPAPUD.bit.GPIO12=0;//使能内部上拉GpioCtrlRegs.GPADIR.bit.GPIO12=0;//配置成输入方式GpioCtrlRegs.GPAQSEL1.bit.GPIO12=0;//与系统时钟同步InitEPwm1Gpio();InitEPwm1();for(;;){Uint16i=0;if(GpioDataRegs.GPADAT.bit.GPIO12==1){for(i=0;i<50000;i++);if(GpioDataRegs.GPADAT.bit.GPIO12==1){if(Duty<600)EPwm1Regs.CMPA.half.CMPA=Duty++;elseDuty=0;}for(i=0;i<50000;i++);}}}voidInitEPwm1(void){EPwm1Regs.TBPRD=600;//设置PWM周期为601个时钟周期EPwm1Regs.CMPA.half.CMPA=300;EPwm1Regs.CMPB=200;EPwm1Regs.TBPHS.half.TBPHS=0;//将相位存放器清0EPwm1Regs.TBCTR=0x0000;//将时间计数器清0;//***设置TBCLK***/EPwm1Regs.TBCTL.bit.CTRMODE=TB_COUNT_UP;//增计数EPwm1Regs.TBCTL.bit.PHSEN=TB_DISABLE;//禁止相位控制EPwm1Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1;//TBCLK=STSCLKOUTEPwm1Regs.TBCTL.bit.CLKDIV=TB_DIV1;EPwm1Regs.CMPCTL.bit.SHDWAMODE=CC_SHADOW;//设置CMPA为映射模式EPwm1Regs.CMPCTL.bit.SHDWBMODE=CC_SHADOW;EPwm1Regs.CMPCTL.bit.LOADBMODE=CC_CTR_ZERO;//EPwm1Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZERO;//设定在CTR=ZERO时装载EPwm1Regs.AQCTLA.bit.ZRO=AQ_SET;//ePWM1为高电平当CTR=0时EPwm1Regs.AQCTLB.bit.ZRO=AQ_SET;//在0时翻转PWMEPwm1Regs.AQCTLA.bit.CAU=AQ_CLEAR;//ePWM1为低电平当CTR=CAU时EPwm1Regs.AQCTLB.bit.ZRO=AQ_TOGGLE;//在0时翻转PWM}ADC实验该试验包括:ADC模数转换配置原理:利用ADC模块对输入信号进展周期性的数模转换实验一#include"DSP28x_Project.h"Uint16ConversionCount;Uint16Voltage1[10];Uint16Voltage2[10];main(){ InitSysCtrl(); DINT; InitPieCtrl(); IER=0x0000; IFR=0x0000; InitPieVectTable(); InitAdc(); ConversionCount=0; EALLOW; AdcRegs.ADCCTL1.bit.INTPULSEPOS =1;//转换完成前一个ADC时钟周期产生EOC AdcRegs.INTSEL1N2.bit.INT1E =1;//在ADC中断存放器使能ADCINT1 AdcRegs.INTSEL1N2.bit.INT1CONT =0;//关闭连续模式0 只有用户去除ADCINTx之后才能产生ADCINTx脉冲1 每当产生EOC 脉冲时便产生ADCINTx脉冲,与ADCINTx是偶被去除无关 AdcRegs.INTSEL1N2.bit.INT1SEL =1;//EOC1是ADCINT1的触发源图STYLEREF1\s8.SEQ图\*ARABIC\s125ADCSOC0~SOC15控制存放器〔ADCSOCxCTL〕〔地址偏移量20h〕 AdcRegs.ADCSOC0CTL.bit.CHSEL =0;//将ADCINA0映射到通道0 CHANNELSELECTAdcRegs.ADCSOC1CTL.bit.CHSEL =1;//将ADCINA1映射到通道1AdcRegs.ADCSOC0CTL.bit.TRIGSEL =0;//软件触发SOC0AdcRegs.ADCSOC1CTL.bit.TRIGSEL =0;//软件触发SOC1AdcRegs.ADCSOC0CTL.bit.ACQPS =6;//设置窗口采样次数AdcRegs.ADCSOC1CTL.bit.ACQPS =6;//设置窗口采样次数EDIS;AdcRegs.ADCSOCFRC1.all=0x0003; //强制给通道0和1产生SOC信号SOCx强制开始转换标志位。向该位写1将会强制向ADCSOCFLG1存放器中的SOCx标志位写1。这样便可以进展一次由软件启动的转换。写0无影响。通道0和1为11 for(;;) { while(AdcRegs.ADCINTFLG.bit.ADCINT1==0){}//等待EOC1信号〔ADCINT1〕 AdcRegs.ADCINTFLGCLR.bit.ADCINT1=1;//去除EOC1信号〔ADCINT1〕 AdcRegs.ADCSOCFRC1.all=0x0003; //强制给通道0和1产生SOC信号 if(ConversionCount==9) {ConversionCount=0; } elseConversionCount++; Voltage1[ConversionCount]=AdcResult.ADCRESULT0; Voltage2[ConversionCount]=AdcResult.ADCRESULT1; }}__interruptvoidadc_isr(void){Voltage1[ConversionCount]=AdcResult.ADCRESULT1;Voltage2[ConversionCount]=AdcResult.ADCRESULT2;//If20conversionshavebeenlogged,startoverif(ConversionCount==9)ConversionCount=0;elseConversionCount++;AdcRegs.ADCINTFLGCLR.bit.ADCINT1=1;//ClearADCINT1flagreinitializefornextSOCPieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//AcknowledgeinterrupttoPIEreturn;}SPI实验原理:采用内部互联功能、使能FIFO模式和SPIFIFO中断。由于内部互联功能LOOPBACK可以使SPI发送的数据被自己接收,可将接收到的数据与发送的数据进展比照,对SPI进展验证性学习#include<DSPF28335.h>interruptvoidspiTxFioIsr(void);interruptvoidspiRxFioIsr(void);voiderror();Uint16sdata[8];Uint16rdata[8];Uint16rdata_point;voidmain(void){Uint16i;InitSysCtrl();//系统初始化DINT();//关闭全局中断InitPieCtrl();//初始化中断控制存放器IER=0X0000;//关闭CPU中断IFR=0x0000;//去除CPU中断信号InitPieVectTable();//初始化中断向量表InitSpiaGpio();//初始化APIIO口EALLOW;//关闭写保护PieVectTable.SPIRXINTA=&spiRxFioIsr;PieVectTable.SPIRXINTA=&spiTxFioIsr;EDIS;spi_fifo_init();for(i=0;i<8;i++){sdata[i]=i;rdata_point=0;PieCtrlRegs.PIECTRL.bit.ENPIE=1;//使能PIE组PieCtrlRegs.PIEIER6.bit.INTx1=1;//使能PIEGroup6,INT1PieCtrlRegs.PIEIER6.bit.INTx2=1;//使能PIEGroup6,INT2IER=0x20;//使能CPUGroup6EINT;for(;;)}}voiderror(void){asm("ESTOP0");for(;;);}vodispi_fifo_init(void){SpiaRegs.SPICCR.bit.SPISWRESET=0;//软件复位SPISpiaRegs.SPICCR.all=0x001F;//数据长度为16bit、LOOPBACK模式SpiaRegs.SPICTL.all=0x0017;//使能中断、使能MASTER/SLAVEXMITSpiaRegs.SPISTS.all=0x0000;SpiaRegs.SPIBRR=0X0063;//设置波特率SpiaRegs.SPIFFTX.all=0xC028;//使能FIFO设置TXFIFOlevel为8SpiaRegs.SPIFFRX.all=0x0028;//是能FIFO设置RXFIFOlevel为8SpiaRegs.SPIFFCT.all=0x00;SpiaRegs.SPIPRI.all=0x0010;SpiaRegs.SPICCR.bit.SPISWRESET=1;//重新使能SPISpiaRegs.SPIFFTX.bit.TXFIFO=1;SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;}interruptvoidspiTxFifoIsr(void){Uint16i;for(i=0;i<8,i++){SpiaRegs.SPITXBUF=sdata[i];//发送数据1-8}for(i=0;i<8;i++){sdata[i]++;//为下一次发送准备数据SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;//去除中断标志位PieCtrlRegs.PIEACK.all=0x20;}}interruptvoidspiRxFioIsr(void){Uint16I;for(i=0;i<8;i++){rdata[i]=SpiaRegs.SPIRXBUF;//读取接收到的数据}for(i=0;i<8;i++){if(rdata[i]!=rdata_point+i)//检查接收到的数据error();}rdata_point++;SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;//去除溢出中断标志位SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;//去除中断标志位PieCtrlRegs.PIEACK.all=0X20;}///NOMORE//SCI实验/*《利用SCI控制当前的PWM和ADC转换的工作模式和输出结果》 (由于模式已定,ADC也是在以此类推进展嵌套) 8.将PWM的波形和参数,以与ADC转换的结果输出到串口9:03:252018/5/2 */#include"DSP28x_Project.h"voidGpio_Config(void);voidCpu_Timer_Config(void);voidSCI_Config(void);voidscia_xmit(Uint16a);voidscia_msg(char*msg);voidmsg_get(Uint16data);voidmsg_handle(Uint16msg_geted[10]);voidGPIO_LED_Init(void);Uint16msg_geted[10];Uint16i,order_flag;voidPWM_Config(void);Uint16Period,Duty;main(void){ InitSysCtrl(); DINT; //禁止所有中断 InitPieCtrl(); //初始化中断向量控制存放器 IER=0x0000; //关闭CPU中断 IFR=0x0000; //去除所有中断标志位 InitPieVectTable(); //初始化中断向量表 /*SCI初始化*/ SCI_Config(); GPIO_LED_Init(); EALLOW; PieVectTable.SCIRXINTA=&SCIRXINTA_ISR; PieVectTable.SCITXINTA=&SCITXINTA_ISR; EDIS; PieCtrlRegs.PIECTRL.bit.ENPIE=1; PieCtrlRegs.PIEIER9.bit.INTx1=1; PieCtrlRegs.PIEIER9.bit.INTx2=1; GpioDataRegs.GPASET.bit.GPIO0=1; GpioDataRegs.GPASET.bit.GPIO1=1; IER|=M_INT9; EINT; ERTM; char*msg; Period=600; Duty=300; msg="PleaseInput:\n"; scia_msg(msg); i=0; order_flag=0; for(;;) { //Uint16k=0; //for(k=0;k<0xfffff;++k); GpioDataRegs.GPASET.bit.GPIO0=1; GpioDataRegs.GPASET.bit.GPIO1=1; if(order_flag==1) { order_flag=0; msg_handle(msg_geted); } else order_flag=0; }}voidSCI_Config(void){ InitSciaGpio(); SciaRegs.SCICCR.all=0x0007;//1stopbit,Noloopback非回送测试模式 //Noparity,8charbits, //asyncmode,idle-lineprotocol SciaRegs.SCICTL1.all=0x0003;//enableTX,RX,internalSCICLK, //DisableRXERR,SLEEP,TXWAKE //SciaRegs.SCICTL2.all=0x0003;/*本实验中采用100MHz的系统时钟频率9600baudLSPCLK=25MHz(100MHzSYSCLK)*/ SciaRegs.SCIHBAUD =0x0001; SciaRegs.SCILBAUD =0x0044; SciaRegs.SCICTL1.all=0x0023;//RelinquishSCIfromReset SciaRegs.SCICTL2.bit.TXINTENA=1; //使能TX中断 SciaRegs.SCICTL2.bit.RXBKINTENA=1; //使能RX中断 SciaRegs.SCICTL1.bit.SWRESET=1; //使能FIFO/* SciaRegs.SCIFFTX.all=0xE040; SCI复位,使能增强型操作、重新使能发送FIFO操作 发送FIFO为空,没有出现发送中断 写1清楚位7的TXFIFFO位 禁止基于TXFFIVDETXfifo中断 SciaRegs.SCIFFRX.all=0x2044; 接收FIFO溢出,只读位 在RXFFOVF标志写0没有任何影响,位读返回0 写1去除7位的RXFFINT标志 SciaRegs.SCIFFCT.all=0x0;*/}/*发送一个Byte*/voidscia_xmit(Uint16a){SciaRegs.SCITXBUF=a; while(SciaRegs.SCICTL2.bit.TXRDY==0);//等待SCITXBUF可以接收下一个数据}/*发送一个字符串*/voidscia_msg(char*msg){ SciaRegs.SCICTL2.bit.TXINTENA=0; //关闭TX中断,确保在连续发送字符时不产生中断Uint16i;i=0;while(msg[i]!='\0'){scia_xmit(msg[i]);i++;}SciaRegs.SCICTL2.bit.TXINTENA=1; //关闭TX中断,确保在连续发送字符时不产生中断}voidGPIO_LED_Init(void){ GpioCtrlRegs.GPAMUX1.bit.GPIO0=0; //数字IO GpioCtrlRegs.GPAMUX1.bit.GPIO1=0; //数字IO GpioCtrlRegs.GPAPUD.bit.GPIO0=0; GpioCtrlRegs.GPAPUD.bit.GPIO1=0; GpioCtrlRegs.GPADIR.bit.GPIO0=1; //输出 GpioCtrlRegs.GPADIR.bit.GPIO1=1; //输出 GpioCtrlRegs.GPAQSEL1.bit.GPIO0=0; GpioCtrlRegs.GPAQSEL1.bit.GPIO1=0; GpioDataRegs.GPBCLE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论