DSPF28335学习笔记
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 引脚;中断方式:可以在每次转换结束或每隔一次转换结束触发中断;
1.如何查看CCS5.2中包含的源文件有哪些?以及他们的位置?
CCS5.2工程中C语言源文件有两部分组成,一部分是在project路径下的.c文件,另外一部分是通过连接添加到工程里的(.project文件中的<linkedResources></linkedResources>字段)。因此CCS5.2中的源文件一部分在工程目录下,另外一部分在.project文件中的<linkedResources></linkedResources>字段包含的路径下。
2.CCS中GEL文件的作用是什么?
ccs的gel语言是一种交互式的命令,它是解释执行的,即不能被编译成可执行文件。它的作用在于扩展了ccsstudio的功能,可以用gel来调用一些菜单命令,对DSP的存储器进行配置等等。但是作者建议对于使用仿真器和DSP功能板的仿真环境用户来说,这种GEL语言文件是没必要加入到配置中的。gel语言的重要性在于针对计算机模拟环境的用户,使用gel可以为其准备一个虚拟的DSP仿真环境,但也不是非用不可的。
3.引用例子中的源文件时要注意什么?
使用CCS5.2导入例子中的源文件时,最好不要选择连接方式,而使用复制的方式,这样必要时可以更改这些源文件,而不会影响其他的程序的使用。
4.CCS5.2如果没有包含函数的声名头文件时也能运行但是结果会不正常,故当函数调用出现莫名其妙的问题时,要检查声名函数的头文件是否包含。
5.CCS5.2开发DSP28335程序时如何设置程序堆栈的大小?
CCS5.2默认情况下堆栈的大小都为0x400,在Project->Properties->Build->C200 Linker->Basic Options下设置。设置完堆栈的大小后,还要在cmd文件中分配堆栈存储空间的
段的位置和大小,栈空间的段名为.stack用于函数中的临时变量,堆空间的段名为.sysmem用于c语言malloc函数分配内存,malloc最大可分配内存为Project->Properties->Build
->C200 Linker->Basic Options下设置的大小减2。cmd文件中的堆栈段的大小不能小于Project->Properties->Build->C200 Linker->Basic Options下设置的大小。一般来讲不用
变动栈空间的大小和位置,如果函数中需要大的空间就申请堆空间。堆空间可以指定为外部内存,但要注意在第一次malloc函数调用之前一定要初始化外部内存。否则malloc能执行成功但是空间指向未定。
heap大小限制为32k word即0x10000。
6.相关参考网站
http://processors.wiki.ti.com/index.php
7.如何添加头文件的相对路径?
首先在Project->Properties->Build选项下,点击Variables添加一个变量,然后就可以在Project->Properties->Build->C2000 Compiler->Include Options下用${}引用变
量。表示工程路径的系统变量是PROJECT_ROOT,可以在Project->Properties->Build->C2000 Compiler->Include Options下直接引用。注意Project->Properties->Resource-
>Linked Resources下的变量在Project->Properties->Build->C2000 Compiler->Include Options下无效,只有Project->Properties->Build下Variables选项卡中的变量才能
用。
http://processors.wiki.ti.com/index.php/Include_paths_and_options
8.当程序烧写到flash中运行时,设置断点为什么总是出错?
当程序烧写到flash中时设置的断点为硬件断点,此断点对C28x系列DSP只能设置两个多的话就会报错,另外有些函数有可能会占用硬件断点,故设置断点失败时可查一下如何清理c函数的硬件断点。
9.CCS5 Debug模式下Tool->Graphs的用法的要点?
· 进入CCS Debug模式,点击debug按钮右边的小箭头打开下拉列表,选中Debug Configurations,在target选项卡下选择Realtime Options->Halt the target before any debugger access。如果不选此项当target running时,graph波形会是一条为0的直线。
· 在代码中打断点,运行到断点处,因为只有运行在断点处Graphs才能识别变量地址,才能在设定Start Address时使用数组名和&变量名的形式。
· Graphs只能跟踪全局变量,所以缓冲区要设置为全局变量。
参考网址:http://forum.eepw.com.cn/thread/214974/1
http://hi.baidu.com/chanceyue/item/af7ecddc744aa34eddf9bed8
/Article/CCS/Experience/201211/45940.html
10.如果ccs出现莫名其妙的问题时,请删除.metadata
11.arm和dsp之间进行串口通信如果dsp先启动,arm后启动,通讯有异常,反之正常?
主要原因是arm启动时会有一个导致BRKDT错误的信号出现,此时如果dsp已经启动就会收到此错误,并停止工作,直到SW Rest或者DSP重启。解决方法是当收到此错误时,SW Reset SCI模块。
参考网址:http://www.deyisupport.com/question_answer/f/56/t/11621.aspx