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接口。SPI由12组控制寄存器控制,位于控制寄存器帧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发送寄存器SPIFFTX、SPI FIFO接收寄存器SPIFFRX、SPI
FIFO控制寄存器SPIFFCT、SPI优先级控制寄存器(SPIPRI)。每个寄存器每一位的如何配置见书《手把手教你学DSP》353页。
系统在上电复位时,SPI工作在标准SPI模式,禁止FIFO功能。FIFO的寄存器SPIFFTX、SPIFFRX、SPIFFCT不起作用。通过将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个不可屏蔽中断(RESET和NMI)+14个可屏蔽中断。【可屏蔽中断:可根据实际情况来设置优先级来决定要不要响应此类中断。不可屏蔽中断:只要接到中断请求,就要做出中断处理】在这14个可屏蔽中断中,其中定时器1与定时器2产生的中断请求通过INT13、INT14中断线到达CPU,这两个中断已经预留给了实时操作系统,因此就剩下12个可屏蔽中断。简单来说就是PIE(外设中断扩展模块)通过12根线与28335核的12个中断线相连。而PIE的另外一侧有12*8根线分别连接到外设,如AD、SPI、EXINT等等。这样PIE共管理12*8=96个外部中断。
中断系统各个寄存器的功用:
PIE控制寄存器(PIECTRL):PIECTRL的0位是PIE向量表使能位,0:禁止PIE模块,1:除复位之外的所有中断向量取自PIE向量表,复位向量始终取自boot
ROM。1-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口都可以配置为外部中断口,需要注意的就是外部中断的标志要自己通过软件来清零。而PIE和CPU的中断标志寄存器由硬件来清零。
外部中断程序例程里,将GPIO48配置为0,GPIO51、52则为外部中断,GPIO51为外部中断3,GPIO52为外部中断4。程序现象:首先将Xint3count(中断3发生中断的次数计数器)和Xint4count(中断4发生中断的次数计数器)还有总中断发生次数计数器Loopcount添加到观察窗口中,依次按下SW4和SW7,每次按下按键时中断计算器加1。
GPIOXINT3SEL寄存器配置见此图
GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 19; // Xint3 is
GPIO51
由上图可得,32+19=51,所以=19就表示外部中断3从GPIO51输入。
7. 定时器
TMS320F28335的CPU Time有三个,分别为Timer0,Timer1,Timer2,其中Timer2是为操作系统DSP/BIOS保留的,当未移植操作系统时,可用来做普通的定时器。这三个定时器的中断信号分别为TINT0,
TINT1, TINT2,分别对应于中断向量INT1,INT13,INT14。
对程序中几句代码的理解:
CpuTimer0Regs.TCR.all = 0x4001;
//启动定时器。
//4001中4是TIE位,代表中断使能,该位置1时若计数器减到0,则中断生效。再有Tss写为0,开启定时器。这个1毫无意义,如果写成4000是一样的。
IER |= M_INT1; //开中断1的意思。
//“|=”是赋值位运算符号,意思就是IER=
IER||M_INT1 IER赋值为IER和M_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
SRAM(Static Random Access Memory),即静态随机存取存储器,掉电不能保存数据。SRAM具有较高的性能,功耗较小,但是SRAM也有它的缺点,即它的集成度较低,相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积。
外部接口XINTF采用非复用异步总线,可用于扩展SRAM、FLASH、ADC、DAC模块等。扩展SRAM时,对应于DSP的映射存储区域是ZONE0、ZONE6、ZONE7。读写过程包括: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+1次NOP指令,占用N+1个指令周期,也就是执行8次NOP指令
void init_zone7(void) // DSP的映射存储区域ZONE7配置
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;//开启XINTF时钟信号
EDIS;
InitXintf16Gpio();//初始化外部SRAM的地址线,数据线,片选线
EALLOW;
// All Zones---------------P书82------------------
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;//XTIMING7:XINTF区域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+1次NOP指令,占用N+1个指令周期,也就是执行8次NOP指令
}
该配置过程参考手把手书P80和网页:
http://bbs.21ic.com/icview-1622920-1-1.html
9. AD转换实验
ADC信号输入端
TMS320F28335片上有一个12位A/D转换器,前段为2个8选一的多路切换器和2个同时采样/保持器,这两个采样保持器A、B
分别对应着DSP
引脚上的INA0~INA7
和INB0~INB7。构成16个模拟输入通道,
这16
通道可以分为两个8
通道的(独立)和一个16通道的(级联模式),模拟通道的切换由硬件自动控制。并将各模拟通道的转换结果顺序存入16个结果寄存器中。模拟量输入范围:0.0V~3.0V,输入负压或高于3V的电压就会烧毁A/D模块。 转换率:在 25MHz
的 ADC 时钟下为 80ns;
转换结果=4095×(输入的模拟信号-ADCLO)÷3;ADCL0是ADC转化的参考电压值,也就是板子上的ADCREFIN为0,那么转换结果就是在0-3V的电压范围内,输出是:0-4095
多种 A/D
触发方式:软件启动、PWM 模块和外部中断
2 引脚;中断方式:可以在每次转换结束或每隔一次转换结束触发中断;
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮