DSP

DSPF28335学习笔记

2019-07-13 10:26发布

1. GPIO

GPxMUX(功能选择寄存器)       GPxMUX.bit=0配置为I/O功能。GPxMUX.bit=1配置为外设功能。复位时所有GPIO配置为I/O功能。 GPxDIR(方向选择寄存器),0为输入,1为输出,复位时都为输入。 GPxDAT(数据寄存器),       如果GPxDAT.bit=0,且设置为输出功能,置相应的引脚为低电平;       如果GPxDAT.bit= 1,且设置为输出功能,置相应的引脚为高电平。 GPxSET(设置寄存器),是只写寄存器,任何读操作都返回0。      如果GPxSET.bit=0,没有影响;      如果GPxSET.bit=1,且引脚设置为输出,将相应的引脚置成高电平。 GPxCLEAR(清除寄存器),是只写寄存器,任何读操作都返回0      如果GPxCLEAR.bit=0,没有影响;      如果GPxCLEAR.bit=1,且引脚设置为输出,将相应的引脚置成低电平。 GPxTOGGLE(取反寄存器),是只写寄存器,任何读操作都返回0。       如果GPxTOGGLE.bit=0,没有影响;       如果GPxTOGGLE.bit=1,且引脚设置为输出,将相应的引脚取反,原来是低电平变成高电平,原来是高电平,变为低电平。 

2. 矩阵键盘

 

矩阵键盘扫描原理GPIO48-50这三根线为行线,配置为输出口。GPIO51-53这三根线为列线,配置为输入口,用于检测端口电平。先让GPIO48输出低电平,且49,50输出高电平。检测GPIO51、52、53的电平,看哪一个是低电平,则说明相应按键按下。比如此时GPIO52为低电平,则说明SW7按键按下了。同理,再让49为低,且48,50为高;再50为低,48,49为高。这样就实现了按键扫描。

3.  SPI控制数码管显示

       SPI接口是高速同步串行输入输出接口。F28335有一个专门的SPI模块, 外两个McBSP也可以配置为SPI接口。SPI12控制寄存器控制,位于控制寄存器帧0x7040h开始的位置。所有的寄存器都为16bit寄存器
  数码管控制原理:GPIO58-61这四个管脚控制数码管的位码,当他们为高电平的时候,三极管9013导通,此时相应位的数码管点亮。芯片74HC164为串口转并口芯片,A、B为串行数据输入口,A、B是“与”的关系,这里他们连在一起,也就是说当GPIO54为“1”时,输入与后为1,反之,当GPIO54为“0”时,输入“与”后为0。CP是时钟信号输入。当MR为高电平,且在CP的上升沿期间,GPIO54口的数据进行一位位的转换,第一位放在Q0,当第二位过来后,原来的Q0放到Q1,现在的数据又放在Q0,以此类推循环8次,当一次转换结束后,8位数据经过并口输出到数码管,就实现了“串转并”。

4.  SPI

       SPI即Serial Peripheral Interface)是高速同步串行输入输出接口,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,四线制:SPISOMI(主输入/从输出引脚)SPISIMO(主输出/从输入引脚)、SPISTE|(从片选)、SPICLK(时钟引脚)。SPI接口数据传输时一共有3种模式:简单模式、基本模式、增强FIFO模式。SPI接口要配置的寄存器有12个:SPI配置控制寄存器(SPICCR)、SPI操作控制寄存器(SPICTL)、SPI状态寄存器(SPISTS)、SPI波特率设置寄存器(SPIBRR)、SPI仿真缓冲寄存器(SPIRXEMU)、SPI串行接收缓冲寄存器(SPIRXBUF)、SPI串行发送缓冲寄存器(SPITXBUF)、SPI串行数据寄存器(SPIDAT)、SPI FIFO发送寄存器SPIFFTXSPI FIFO接收寄存器SPIFFRXSPI FIFO控制寄存器SPIFFCTSPI优先级控制寄存器(SPIPRI)。每个寄存器每一位的如何配置见书《手把手教你学DSP353页。     系统在上电复位时,SPI工作在标准SPI模式,禁止FIFO功能。FIFO的寄存器SPIFFTXSPIFFRXSPIFFCT不起作用。通过将SPIFFTX寄存器中的SPIFFEN的位置1,使能FIFO模式。SPIRST能在操作的任一阶段复位FIFO模式。

5. 28BYJ-48步进电机

28BYJ-48步进电机(四相五线八拍电机):步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到 一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。你可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。这里使用减速的步进电机,减速比为1:64,步进角为5.625/64度。如果需要转动一圈,那么需要360/5.625*64=4096个脉冲信号。步进电机具有瞬间启动、急速停止的优越特性,改变脉冲的顺序,就可以改变转动的方向   工作原理:图中的三极管SS8050相当于一个反相器,J39接口接步进电机,如果步进电机的第4脚需要输入低电平,此时让控制信号EPWM2A为高电平,则三极管Q12导通,步进电机第四脚就得到低电平。给它低电平,步进电机就高电平。    明白几个概念:    步距角:表示控制系统每发一个步进脉冲信号,电机所转动的角度。真正的步距角和驱动器有关。    相数:产生不同对极N、S磁场的激磁线圈对数。常用m表示。    拍数:完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA-AB,四相八拍运行方式即 A-AB-B-BC-C-CD-D-DA-A    保持转矩:是指步进电机通电但没有转动时,定子锁住转子的力矩。

6. 中断系统(外部中断)

      F28335内部有16个中断线,包括2个不可屏蔽中断(RESETNMI+14个可屏蔽中断。【可屏蔽中断:可根据实际情况来设置优先级来决定要不要响应此类中断。不可屏蔽中断:只要接到中断请求,就要做出中断处理】在这14个可屏蔽中断中,其中定时器1与定时器2产生的中断请求通过INT13INT14中断线到达CPU,这两个中断已经预留给了实时操作系统,因此就剩下12个可屏蔽中断。简单来说就是PIE(外设中断扩展模块)通过12根线与28335核的12个中断线相连。而PIE的另外一侧有12*8根线分别连接到外设,如ADSPIEXINT等等。这样PIE共管理12*8=96个外部中断。       中断系统各个寄存器的功用:        PIE控制寄存器(PIECTRL):PIECTRL0位是PIE向量表使能位,0:禁止PIE模块,1:除复位之外的所有中断向量取自PIE向量表,复位向量始终取自boot  ROM1-15位是PIE中断向量。        PIE中断应答寄存器(PIEACK):PIE中断响应标志位。        PIE中断标志寄存器(PIEIFRx):(激活or清除中断)操作PIEIFRx(x=1~12)的低8位,表示相应的中断是否被激活,当一个中断被激活时,相应的寄存器为置“1”,当中断响应后或向这些寄存器写0时,对应的寄存器位被清零。可以通过读取该值来确定哪个中断有效或被挂起,访问该寄存器时,硬件比CPU有更高的优先级。       PIE中断使能寄存器(PIEIERx):(确定大组下的小组)PIEIERx(x=1~12,这个x 指大组)中的低8位确定该中断是这一组的第几个中断,位“1”为使能。位“0 为禁止。      CPU中断标志寄存器(IFR):(激活or清除中断)用于标志和清除被执行的中断,具体配置见书113页。      CPU中断使能寄存器(IER):(确定大组)确定每个中断到底属于哪一组大中断, 就是12组里面的哪一组,位“1”为使能,位“0”为禁止。      CPU调试中断使能寄存器(DBGIER):CPU在实时仿真模式下暂停中需要中断的时候就要用到CPU调试中断使能寄存器。    外部中断控制寄存器(XINTnCR):    外部NMI中断控制寄存器(XNMICR):    外部中断x计数器(XINTxCTR):    总的来说,CPU的所有中断寄存器控制12组的中断,PIE的所有中断寄存器控制每组内8个的中断。除此之外,我们用到哪一个外部中断,相应的还有外部中断的寄存器,DSP的GPIO口都可以配置为外部中断口,需要注意的就是外部中断的标志要自己通过软件来清零。而PIECPU的中断标志寄存器由硬件来清零。        外部中断程序例程里,将GPIO48配置为0GPIO5152则为外部中断,GPIO51为外部中断3GPIO52为外部中断4程序现象:首先将Xint3count(中断3发生中断的次数计数器)和Xint4count(中断4发生中断的次数计数器)还有总中断发生次数计数器Loopcount添加到观察窗口中,依次按下SW4SW7,每次按下按键时中断计算器加1   GPIOXINT3SEL寄存器配置见此图 GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 19;   // Xint3 is GPIO51    由上图可得,32+19=51,所以=19就表示外部中断3GPIO51输入。

7. 定时器

        TMS320F28335CPU Time有三个,分别为Timer0Timer1Timer2,其中Timer2是为操作系统DSP/BIOS保留的,当未移植操作系统时,可用来做普通的定时器。这三个定时器的中断信号分别为TINT0, TINT1, TINT2,分别对应于中断向量INT1INT13INT14        对程序中几句代码的理解:        CpuTimer0Regs.TCR.all = 0x4001; //启动定时器        //40014TIE位,代表中断使能,该位置1时若计数器减到0,则中断生效。再有Tss写为0,开启定时器。1毫无意义,如果写成4000是一样的        IER |= M_INT1;             //开中断1的意思       //“|=”是赋值位运算符号,意思就是IER= IER||M_INT1 IER赋值为IERM_INT1位或,类似的还有 &= ^=        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//ACK中断,使得同组的其他中断能响应       #if的使用说明       #if的后面接的是表达式,如果表达式为1,则编译#if下面的代码       #if (MAX==10)||(MAX==20)       code...       #endif    它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会把其中的#if #endif之间的代码编译进去(注意:是编译进去,不是执行!!)

8. 外部接口XINTF操作SRAM

       SRAMStatic Random Access Memory),即静态随机存取存储器掉电不能保存数据。SRAM具有较高的性能,功耗较小,但是SRAM也有它的缺点,即它的集成度较低,相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积。     外部接口XINTF采用非复用异步总线,可用于扩展SRAMFLASHADCDAC模块等。扩展SRAM时,对应于DSP的映射存储区域是ZONE0ZONE6ZONE7。读写过程包括:LEAD(引导)-------ACTIVE(使能)-------TRAIL(拖尾)三部分,每个区域可以配置单独的读写访问等待周期。通过XTIMING寄存器可以配置以上信息。每个区域有专用的片选信号,可以连接各种外部存储器。读写访问时刻基于内部的XTIMCLK时钟,因此配置XINTF时,需要配置XTIMCLK与系统时钟SYSCLKOUT的关系,通过XINTF-CN2寄存器中的XTIMCLK控制位可将XTIMCLK时钟频率设定为与SYSCLKOUT时钟频率相同或为其一半,默认情况为其一半。所有的XINTF的操作都由XCLKOUT的上升沿开始。    下图为外扩的SRAM存储器,XRDn为读控制信号,XWEn为写控制信号,XZCS7n为片选信号。数据线为16位,地址线为19根,        程序解读: #pragma CODE_SECTION(cpu_timer0_isr,"xintffuncs"); //SECTION关键字把中断服务程序放到"xintffuncs"段中去,也就是中断服务程序最终是在外部接口映射区域ZONE7中执行 SECTION关键字在.CMD文件里,并申明四个全局变量,指定运行首地址,装载长度。   MemCopy(&XintffuncsLoadStart, &XintffuncsLoadEnd, &XintffuncsRunStart); //把原地址代码复制到目的地址,也就是把外部中断代码复制到ZONE7区域 asm(" RPT #7 || NOP"); //会执行N+1NOP指令,占用N+1个指令周期,也就是执行8NOP指令   void init_zone7(void) // DSP的映射存储区域ZONE7配置 {     EALLOW;     SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;//开启XINTF时钟信号     EDIS;     InitXintf16Gpio();//初始化外部SRAM的地址线,数据线,片选线     EALLOW;     // All Zones---------------P82------------------ XintfRegs.XINTCNF2.bit.XTIMCLK = 0;//基准时 XTIMCLK=SYSCLKOUT     XintfRegs.XINTCNF2.bit.WRBUFF = 3;//有三个写缓冲器     XintfRegs.XINTCNF2.bit.CLKOFF = 0;//使能XCLKOUT     XintfRegs.XINTCNF2.bit.CLKMODE = 0;//XCLKOUT=XTIMCLK       XintfRegs.XTIMING7.bit.XWRLEAD = 1;//XTIMING7XINTF区域7的时序寄存器写访问的建立时间中等待周期个数设定位,区域7写建立时间1b,周期为1x1=1,因为X2TIMING=0     XintfRegs.XTIMING7.bit.XWRACTIVE = 2;//写访问有效时间等待周期个数设定位,有效时间是10b,周期数为2X1=2.     XintfRegs.XTIMING7.bit.XWRTRAIL = 1;//跟踪时间是1b,周期数为1.     XintfRegs.XTIMING7.bit.XRDLEAD = 1;//读建立时间,1b,周期为1     XintfRegs.XTIMING7.bit.XRDACTIVE = 3;//有效时间是11b,周期是1     XintfRegs.XTIMING7.bit.XRDTRAIL = 0;//跟踪时间是0     XintfRegs.XTIMING7.bit.X2TIMING = 0;     XintfRegs.XTIMING7.bit.USEREADY = 0;//忽略XREADY信号     XintfRegs.XTIMING7.bit.READYMODE = 0;//同步采样     XintfRegs.XTIMING7.bit.XSIZE = 3;//16位数据总线模式     EDIS;    asm(" RPT #7 || NOP");//会执行N+1NOP指令,占用N+1个指令周期,也就是执行8NOP指令 } 该配置过程参考手把手书P80和网页: http://bbs.21ic.com/icview-1622920-1-1.html

9. AD转换实验

  ADC信号输入端 TMS320F28335片上有一个12A/D转换器,前段为28选一的多路切换器和2个同时采样/保持器,这两个采样保持器AB 分别对应着DSP 引脚上的INA0~INA7 INB0~INB7。构成16个模拟输入通道, 16 通道可以分为两个8 通道的(独立)和一个16通道的(级联模式),模拟通道的切换由硬件自动控制。并将各模拟通道的转换结果顺序存入16个结果寄存器中。模拟量输入范围:0.0V~3.0V,输入负压或高于3V的电压就会烧毁A/D模块。 转换率:在 25MHz 的 ADC 时钟下为 80ns; 转换结果=4095×(输入的模拟信号-ADCLO)÷3ADCL0ADC转化的参考电压值,也就是板子上的ADCREFIN0,那么转换结果就是在0-3V的电压范围内,输出是:0-4095 多种 A/D 触发方式:软件启动、PWM 模块和外部中断 2 引脚;中断方式:可以在每次转换结束或每隔一次转换结束触发中断;