![第三章F2812的系统控制与中断_第1页](http://file4.renrendoc.com/view/772fde7c23b2c5c15daef6b70d82fa83/772fde7c23b2c5c15daef6b70d82fa831.gif)
![第三章F2812的系统控制与中断_第2页](http://file4.renrendoc.com/view/772fde7c23b2c5c15daef6b70d82fa83/772fde7c23b2c5c15daef6b70d82fa832.gif)
![第三章F2812的系统控制与中断_第3页](http://file4.renrendoc.com/view/772fde7c23b2c5c15daef6b70d82fa83/772fde7c23b2c5c15daef6b70d82fa833.gif)
![第三章F2812的系统控制与中断_第4页](http://file4.renrendoc.com/view/772fde7c23b2c5c15daef6b70d82fa83/772fde7c23b2c5c15daef6b70d82fa834.gif)
![第三章F2812的系统控制与中断_第5页](http://file4.renrendoc.com/view/772fde7c23b2c5c15daef6b70d82fa83/772fde7c23b2c5c15daef6b70d82fa835.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章F2812的系统控制与中断3.1F2812的存储器
F2812的存储空间:Flash128kX16bOTP存储器只能一次编程,不能擦除表4.1flash和OTP配置寄存器寄存器受EALLOW位保护(保护寄存器) 执行EALLOW指令后,可将数据写入寄存器 执行EDIS指令后,写操作禁止3.2时钟
3.2.1时钟单元基本结构
TMS320F2812处理器内部集成了振荡器、锁相环、看门狗及工作模式选择等控制电路。振荡器、锁相环主要为处理器CPU及相关外设提供可编程的时钟,每个外设的时钟都可以通过相应的寄存器进行编程设置;
看门狗可以监控程序的运行状态,提高系统的可靠性。F2810和F2812内部的各种时钟和复位电路3.2.2锁相环电路
锁相环是一种控制晶振使其相对于参考信号保持恒定相位的电路,在数字通信系统中使用比较广泛。目前微处理器或DSP集成的片上锁相环,主要作用则是通过软件实时地配置片上外设时钟,提高系统的灵活性和可靠性。此外,由于采用软件可编程锁相环,所设计的系统处理器外部允许较低的工作频率,而片内经过锁相环微处理器提供较高的系统时钟。
好处:可以有效地降低系统对外部时钟的依赖和电磁干扰,提高系统启动和运行的可靠性,降低系统对硬件的设计要求
。3.2.2锁相环电路
TMS320F2812处理器的片上晶振和锁相环模块为内核及外设提供时钟信号,并且控制器件的低功耗工作模式。片上晶振模块允许使用2种方式为器件提供时钟,即采用内部振荡器或外部时钟源。
(1)使用内部振荡器,在Xl/XCLKIN和X2这两个引脚之间连接一个石英晶体,一般选用30MHz。
(2)采用外部时钟,将输入的时钟信号直接接到Xl/XCLKIN引脚上,而X2悬空,不使用内部振荡器。旁路锁存器片上振荡器晶体振荡器及锁相环模块锁相环配置模式PLL模式说明SYSCLKOUTPLL禁止上电复位时通过将引脚拉低来调用。PLL模块完全禁止。输入到CPU的时钟(CLKIN)由来自X1/XCLKIN引脚的时钟信号直接驱动。XCLKINPLL旁路如果PLL未处于禁止状态,则为上电复位的默认配置模式。PLL自身被旁路,但是从X1/XCLKIN引脚输入的时钟在送到CPU之前,先经过PLL的‘/2’电路除以2。XCLKIN/2PLL使能通过给PLLCR寄存器写入一个非0的‘n’值来实现。时钟在送到CPU之前,先经过PLL的‘/2’电路除以2。(XCLKIN*n)/2处理器内部时钟电路锁相环模块除了为C28x内核提供时钟外,还通过系统时钟输出提供快速和慢速2种外设时钟,而系统时钟主要通过外部引脚XPLLDIS及锁相环控制寄存器进行控制。如果XPLLDIS为高电平,使能芯片内部锁相环电路,则可以通过控制寄存器PLLCR软件设置系统的工作频率。注意:1.在通过软件改变系统的工作频率时,必须等待系统时钟稳定后才可以继续完成其他操作。
2.可以通过外设时钟控制寄存器使能外设时钟。在具体的应用中。为降低系统功耗,不使用的外设最好将其时钟禁止。外设时钟包括快速外设和慢速外设两种,分别通过HISPCP和LOSPCP寄存器进行设置。
CLKIN(经过PLL后送往CPU的时钟信号)经过CPU分发,作为SYSCLKOUT送至各个外设。DSP将外设分成两种:低速外设:SCI,SPI,McBSP
高速外设:EV,ADC两种外设时钟一起提供。给各个外设提供时钟前,使能用到的外设的时钟。不用的外设时钟不使能。PCLKCR寄存器使能相应的外设时钟SysctrlRegs.PCLKCR.bit.SCIAENCLK=1;//使能SCIA时钟
二其他外设时钟
系统时钟SYSCLKOUT经过低速预定标寄存器LOSPCP,产生低速外设时钟LSPCLK提供给低速外设。系统时钟SYSCLKOUT经过高速预定标寄存器HISPCP,产生高速外设时钟HSPCLK提供给高速外设。LOSPCP寄存器HISPCP寄存器
二其他外设时钟//为降低系统功耗,不使用的外设时钟需要屏蔽。但如果使用外设必须首先使能相应的外设时钟voidInitsysctrl(){ uint16i; EALLOW; SysctrlRegs.WDCR=0x0068;//关看门狗
SysctrlRegs.PLLCR=0x0008;//初始化锁相环,系统 时钟30MX4=120M
for(i=0;i<5000;i++){}
//HISPCP/LOSPCP预定标寄存器设置 SysCtrlRegs.HISPCP.a11=0x0001; //HSPCLK=SYSCLKOUT/2; SysCtrlRegs.LOSPCP.a11=0x0002; //LSPCLK=SYSCLKOUT/4; //使能使用的外设时钟
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1; SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1; EDIS;}3.2.3时钟单元寄存器寄存器名地址长度(×16位)描述保留
0x7010~0x701910HISPCP
0x701A1HSPCLK时钟的高速外设模块时钟预分频寄存器LOSPCP0x701B1LSPCLK时钟的低速外设模块时钟预分频寄存器PCLKCR0x701C1外设模块时钟控制寄存器保留0x701D1LPMCR00x701E1低功耗工作模式控制寄存器0LPMCR10x701F1低功耗工作模式控制寄存器1保留0x70201PLLCR0x70211PLL控制寄存器‡SCSR0x70221系统控制&状态寄存器WDCNTR0x70231程序监视器计数寄存器保留0x70241WDKEY0x70251程序监视器复位密钥寄存器保留0x7026~0x70283WDCR0x70291程序监视器控制寄存器保留0x702A~0x702F6注意表中所有寄存器只有在执行EALLOW指令后,才可以访问。PLL控制寄存器(PLLCR)只能被XRS信号复位到已知状态。15141312111098ReservedECANENCLKReservedMCBSPENCLKSCIBENCLKSCIAENCLKReservedSPIENCLKR-0R/W-0R-0R/W-0R/W-0R/W-0R-0R/W-0743210ReservedADCENCLKReservedEVBENCLKEVAENCLKR-0R/w-0R-0R/W-0R/W-01.外设时钟控制寄存器(PCLKCR)位15 Reserved保留位 位14 ECANENCLK如置1,将使能CAN外设模块的时钟。要进入低功耗工作模式,用户可以将该位清零或复位为0。位13 Reserved保留位 位12 MCBSPENCLK 如置1,使能McBSP外设模块的低速时钟(LSPCLK),要让器件进入低功耗工作模式,用户可以将该位清零或复位。位11 SCIBENCLK 如置1,使能SCI-B外设模块的低速时钟(LSPCLK),要让器件进入低功耗工作模式,用户可以将该位清零或复位。位10 SCIAENCLK如置1,使能SCI-A外设模块的低速时钟(LSPCLK),要让器件进入低功耗工作模式,用户可以将该位清零或复位。位9 Reserved保留位位8 SPIAENCLK如置1,使能串行外设接口的低速时钟(LSPCLK),要让器件进入低功耗工作模式,用户可以将该位清零或复位。位7~4Reserved保留位位3 ADCENCLK如置1,使能模数转换外设模块的高速时(HSPCLK),要让器件进入低功耗工作模式,用户可以将该位清零或复位。位2 Reserved保留位 位1 EVBENCLK如置1,使能事件管理EVB外设模块的高速时钟(HSPCLK),要让器件进入低功耗工作模式,用户可以将该位清零或复位。位0 EVAENCLK如置1,使能事件管理EVA外设模块的高速时钟(HSPCLK),要让器件进入低功耗工作模式,用户可以将该位清零或复位。153210ReservedHSPCLKR-0R/W-001位15~3 Reserved保留位2.高速外设时钟寄存器(HISPCP)位2~0 HSPCLK配置与SYSCLKOUT相关的高速外设模块时钟(HSPCLK)频率。000 高速时钟=SYSCLKOUT/1001 高速时钟=SYSCLKOUT/2(复位值)010 高速时钟=SYSCLKOUT/4011 高速时钟=SYSCLKOUT/6100 高速时钟=SYSCLKOUT/8101 高速时钟=SYSCLKOUT/10110 高速时钟=SYSCLKOUT/12111 高速时钟=SYSCLKOUT/14153210ReservedLSPCLKR-0R/W-010位15~3 Reserved保留位2.低速时钟寄存器(LOSPCP)位2~0 LSPCLK配置与SYSCLKOUT相关的低速外设模块时钟(LSPCLK)频率。000 低速时钟=SYSCLKOUT/1001 低速时钟=SYSCLKOUT/2010 低速时钟=SYSCLKOUT/4(复位值)011 低速时钟=SYSCLKOUT/6100 低速时钟=SYSCLKOUT/8101 低速时钟=SYSCLKOUT/10110 低速时钟=SYSCLKOUT/12111 低速时钟=SYSCLKOUT/1415
43
0ReservedDIVR-0R/W-0位15~4 Reserved保留位3.锁相环控制寄存器(PLLCR)位3~0 DIV DIV位域控制是否旁路PLL,不旁路时,用于设置PLL时钟比率。0000 CLKIN=OSCCLK/2(PLL旁路)0001 CLKIN=(OSCCLK*1.0)/20010 CLKIN=(OSCCLK*2.0)/20011 CLKIN=(OSCCLK*3.0)/20100 CLKIN=(OSCCLK*4.0)/20101 CLKIN=(OSCCLK*5.0)/20110 CLKIN=(OSCCLK*6.0)/20111 CLKIN=(OSCCLK*7.0)/21000 CLKIN=(OSCCLK*8.0)/21001 CLKIN=(OSCCLK*9.0)/21010 CLKIN=(OSCCLK*10.0)/21011~1111 保留问题如果要使系统时钟为输入时钟的5倍频,同时使能所有的外设时钟,将高速外设的时钟设置为系统时钟的1/8,低速外设的时钟设置为系统时钟的1/10,应该如何设置相关的寄存器?
PLLCR=0x000A;PCLKCR=0xFFFF;HISPCP=0x0004;LOSPCP=0x0005;3.3看门狗看门狗主要用来检测软件和硬件的运行状态,当内部计数器溢出时,将产生一个复位信号。为了避免产生不必要的复位,要求用户定期对看门狗定时器进行复位。如果不明的原因使CPU中断程序,看门狗将产生一个复位信号,使CPU复位,程序从系统软件的开始执行。
看门狗有效地提高了系统的可靠性。程序监视器
计数寄存器晶体振荡器时钟宽度程序监视器
复位密钥寄存器程序监视器
控制寄存器程序监视器复位信号系统控制和状态寄存器程序监视器中断信号013.3.1看门狗的基本结构或门3.3.2看门狗基本操作在看门狗8位加法计数器(WDCNTR)在WDCLK的时钟下进行加1计数,计数达最大值时产生一个宽度512*OSCCLK的脉冲,使DSP复位。为了防止DSP复位1.禁止看门狗看门狗控制寄存器(WDCR)6位(WDDIS):看门狗使能位,写1无效,写0使能。5~3位(WDCHR):逻辑校验位,必须写1012~0位(WDPS):预定标设置位。设置WDCLK时钟。3.3.2看门狗基本操作
逻辑校验位(WDCHK):所有访问看门狗控制寄存器(WDCR)的写操作中,相应的校验位(位5~3)必须是“101",否则将会拒绝访问并会立即触发复位。
设置WDCLK时钟:由WDCR寄存器的WDPS(2~0位)设置。看门狗的预定标寄存器可以用来提高看门狗的计数溢出周期。2.周期性喂狗在WDCNTR溢出之前,通过软件向WDKEY写0x55+0xAA时,清除WDCNTR的值,使WDCNTR复位。写他任何值都会使系统复位。3.3.3看门狗寄存器1.看门狗控制寄存器WDCR看门狗控制寄存器的各位分配看门狗控制寄存器功能定义2.系统控制和状态寄存器SCSR系统控制和状态寄存器各位分配系统控制和状态寄存器功能定义15870ReservedWDCNTRR-0R/W-0位15~8 Reserved保留位3.看门狗计数寄存器WDCNTR位7~0 WDCNTR 程序监视器计数器的当前值。8位计数器不断地以WDCLK频率增加。如果计数器上溢,则程序监视器发出复位信号。如果写入了一个有效数据序列到WDKEY寄存器,则计数器复位到0。WDCLK频率由WDCR寄存器配置。15870ReservedWDKEYR-0R/W-0位15~8Reserved保留位4.看门狗复位寄存器WDKEY位7~0WDKEY写入0x55后再写入0xAA将清零WDCNTR。写任何其它值都会立即使程序监视器发出复位信号。读取操作时返回WDCR寄存器值。3.3.4看门狗应用
F2812上电后看门狗总是处于使能状态,如果不周期地控制看门狗就会触发复位。因此,对于看门狗最简单的处理方法就是通过禁止位(WDDIS)禁止看门狗操作。但看门狗是系统稳定运行的一个保障,因此这种方法并不可取。在实际项目开发过程中,一旦系统调试完毕独立运行就加入看门狗这个安全机制,从而保证系统的正常运行。
//一一一一一一一一一一一一一一一一一一一一一一//看门狗应用实例:Example28xWatchdog.c//一一一一一一一一一一一一一一一一一一一一一一//看门狗直接连接到PIE模块的WAKEINT中断,允许将CPU从掉电模式唤醒//程序代码放在一个无限循环中,用户可以选择使用KickDog函数操作看门狗key寄存器//如果使用KickDog函数操作看门狗key寄存器,将不会产生WAKEINT中断//如果不对key寄存器操作,将会产生WAKEINT中断//观察变量//LoopCount—无限循环次数计数//WakeCount—产生WAKEINT的中断次序//Step0、包含需要的头文件//DSP28_Device.h;采用#include包含器件使用的头文件//DSP28_Example.h;本例程需要的特定的头文件#include"DSP28_Device.h"//函数原型声明interruptvoidwakeint_isr(void);//全局变量声明Uint32WakeCount;Uint32LoopCount;
voidmain(void){//Step1、初始化系统控制寄存器、PLL、看门狗、时钟位默认状态//该函数在后面的DSP28_SysCtrl.c文件中查找InitSysCtrl();//Step2、GPI0初始化//InitGpio();//Step3、初始化中断向量表(PIE向量表)//相应中断相量表请在下面的DSP28_DefaultIsr.c文件中查找//禁止和清除所有CPU中断DINT;IER=0x0000;IFR=0x0000;//初始化PIE控制寄存器,参考DSP28_PieCtrl.c文件InitPieVectTable();//Step4、初始化外设//InitPeripherals();//Step5、用户特定函数,重新分配向量(可选择),使能中断//重新为WAKEINT分配PIE向量,并指向相应的中断服务程序EALLOW;PieVectTable.WAKEINT=&wakeint_isr;EDIS;//使能WAKEINT的中断工INT1IER|=M_NT1;//使能WAKEINT:位于PIE的组1的第8中断PieCtrlRegs.PIEIER1.bit.INTxB=1;//对整个程序状态寄存器进行操作,避免清除WDOVERRIDE标识位EALLOW;SysCtrlRegs.SCSR.a11=BIT1;//#defineBIT10x0002EDIS;//计数器清零WakeCount=0;//中断计数LoopCount=0;//循环计数//使能全局中断,并配置位real一timedebug模式EINT;//使能全局中断INTMERTM;//使能全局realtime中断DBGM//Step6、主循环for(;;){LoopCount++;//使用KickDog操作看门狗Key寄存器,避免产生WAKEINT中断//通常情况下为了保证程序正常运行,需要在主程序循环或定时中断服务程序中对Key进行操作//KickDog();}}//Step7、中断服务程序interruptvoidwakeint_isr(void){WakeCount++;//响应中断
PieCtrlRegs.PIEACK.a11=PIEACK_GROUP1;}//系统初始化voidInitSysCtrl(void){{Uint16i;EALLOW;//禁止看门狗模块
//SysCtrlRegs.WDCR=0x0068;//本例中不使用
//初始化锁相环
SysCtrlRegs.PLLCR=0xA;//等待锁相环稳定
for(i=0;i<5000;i++){}//HISPCP/LOSPCP预定标寄存器设置
SysCtrlRegs.HISPCP.a11=0x0001;SysCtrlRegs.LOSPCP.a11=0x0002;//使能选择的外设时钟
//对于不用的时钟,一般情况下为了降低功耗,提高系统的稳定性,须禁止相应的中断
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;//SysCtrlRegs.PCLKCR.bit.SCIENCLKH=1;EDIS;}//一一一一一一一一一一一一一一一一一一一//KickDog;//一一一一一一一一一一一一一一一一一一一//该函数复位看门狗定时器voidKickDog(void){EALLOW;SysCtrlRegs.WDKEY=0x0055;SysCtrlRegs.WDKEY=Ox00AA;EDIS;}3.4CPU定时器3.4.1定时器基本操作F2810和F2812器件上有3个32位的CPU定时器:
TIMER0;
TIMER1;
TIMER2。定时器1定时器2CPU定时器0用户可以使用。用于实时操作系统(RTOS)注:CPU定时器与事件管理模块(EVA,EVB)中的通用(GP)定时器是不同的。或或与或CPU定时器功能框图工作过程:计算定时时间,给周期寄存器PRDH:PRD赋值。启动定时器时,PRDH:PRD的值装载进计数寄存器TIMH:TIM,每TIMCLK计数寄存器减1,直至计数为0,产生中断信号。一个周期后,PRDH:PRD的值重新装入TIMH:TIM进行减1计数。定时时间:(PRDH:PRD+1)*TIMCLK若处理器采用30MHz的外部时钟,经过锁相环10/2倍频后,系统的时钟工作在150MHz。定时器选择SYSCLKOUT作为定时器时钟,工作频率也是150MHz。一旦定时器被使能(TCR-Bit4=0)先给分频器TDDRH:TDDR赋值,后装载进预定标器PSCH:PSC,每SYSCLKOUT脉冲,PSCH:PSC的值减1,直至计数为0,输出一个TIMCLK。下一个时钟周期开始前TDDRH:TDDR重新载入PSCH:PSC。
TIMCLK=(TDDRH:TDDR+1)*SYSCLKOUT计算一下:假设系统时钟SYSCLKOUT为x(MHZ)TIMH:TIM计数器每减1,时间:TIMCLK=(TDDRH:TDDR+1)/xCpu定时器定时时间:T=(TDDRH:TDDR+1)*(PRDH:PRD+1)/x定时时间到,定时器向cpu发送中断请求。定时器中断结构寄存器地址长度(×16位)描述TIMER0TIM0x0C001CPU定时器0,计数寄存器TIMER0TIMH0x0C011CPU定时器0,计数寄存器高位字TIMER0PRD0x0C021CPU定时器0,周期寄存器TIMER0PRDH0x0C031CPU定时器0,周期寄存器高位字TIMER0TCR0x0C041CPU定时器0,控制寄存器保留0x0C051TIMER0TPR0x0C061CPU定时器0,前定标寄存器TIMER0TPRH0x0C071CPU定时器0,前定标寄存器高位字TIMER1TIM0x0C081CPU定时器1,计数寄存器TIMER1TIMH0x0C091CPU定时器1,计数寄存器高位字TIMER1PRD0x0C0A1CPU定时器1,周期寄存器3.4.2定时器寄存器定时器配置和控制寄存器
寄存器地址长度(×16位)描述TIMER1PRDH0x0C0B1CPU定时器1,周期寄存器高位字TIMER1TCR0x0C0C1CPU定时器1,控制寄存器保留0x0C0D1TIMER1TPR0x0C0E1CPU定时器1,前定标寄存器TIMER1TPRH0x0C0F1CPU定时器1,前定标寄存器高位字TIMER2TIM0x0C101CPU定时器2,计数寄存器TIMER2TIMH0x0C111CPU定时器2,计数寄存器高位字TIMER2PRD0x0C121CPU定时器2,周期寄存器TIMER2PRDH0x0C131CPU定时器2,周期寄存器高位字TIMER2TCR0x0C141CPU定时器2,控制寄存器保留0x0C151TIMER2TPR0x0C161CPU定时器2,前定标寄存器TIMER2TPRH0x0C171CPU定时器2,前定标寄存器高位字保留0x0C18~0x0C3F40TIMERxTCR寄存器(x=0,1,2)15141312111098TIFTIEReservedFREESOFTReservedR/W-0R/W-0R-0R/W-0R/W-0R-0765430ReservedTRBTSSReservedR-0R/W-0R/W-0R-0位13~12 Reserved保留位位9~6 Reserved保留位位3~0 Reserved保留位位15 TIF CPU定时器中断标志位。当定时器减到0时,置位该标志。该位可以通过程序写入1清零,但是它只能由定时器计数到0时置位。向该位写入0无效。位14 TIE CPU定时器中断使能位。如果定时器减到0,并且该位置1,则定时器将产生中断请求。如果FREE位为1,则在软件断点时,定时器继续运行(也就是自由运行)。在此情况下,不管SOFT的状态。如果FREE为0,则SOFT将起作用。如果SOFT=0,则定时器停止下一次TIMH:TIM减计数。如果SOFT=1,则当TIMH:TIM减计数到0时,定时器停止。位11FREE位10SOFT这两位是专门的仿真位,决定了在高级语言仿真中遇到断点时定时器的状态。CPU定时器仿真模式位。FREE SOFT 定时器仿真模式0 0 在TIMH:TIM的下一次减 计数后停止(硬件停止)0 1 在TIMH:TIM减计数到0后 停止(软件停止)1 0 自由运行1 1 自由运行注:在前面的软件停止模式中,定时器在关闭之前会产生一个中断(因为到达0满足中断的产生条件)。位5 TRB CPU定时器重装载位。向TRB位写入1时,TIMH:TIM将重新装载PRDH:PRD中的值,前定标分频计数器(PSCH:PSC)重新装载定时器分频值寄存器(TDDRH:TDDR)中的值。读TRB位时,值为0。位4 TSS CPU定时器停止状态位。TSS为停止或起动定时器的一个标志位。 向TSS写入1,将会停止定时器; 写入0将会起动或重新开始定时器。 复位时,TSS清零,定时器立即起动。定时器预定标寄存器TIMERxTPR(x=0,1,2)15870PSCTDDRR-0R/W-0位15~8 PSC CPU定时器前定标分频计数器。保存定时器的当前前分频计数值。对于每一个定时器时钟源周期,PSCH:PSC值大于0,PSCH:PSC减1计数。在PSCH:PSC到0之后的一个定时器时钟周期(定时器预分频器的输出),PSCH:PSC重新装载TDDRH:TDDR的值,而定时器计数器(TIMH:TIM)减1。当软件置定时器重装载位(TRB)为1时,也会重装载PSCH:PSC。PSCH:PSC可以通过读该寄存器来检查,但是它不能直接被设置。它必须从定时器分频值寄存器(TDDRH:TDDR)中取值。复位时,PSCH:PSC为0。位7~0 TDDR CPU定时器分频位域。每(TDDRH:TDDR+1)个定时器时钟源周期,定时器计数寄存器(TIMH:TIM)减1。复位时,TDDRH:TDDR位为0。为了以整数因子增加所有计数器计数,写该因子减1的数到TDDRH:TDDR位。当前分频计数器(PSCH:PSC)值为0时,一个定时器时钟周期后,TDDRH:TDDR重新装载PSCH:PSC的值,TIMH:TIM减1。当软件置定时器重装载位(TRB)为1时,TDDRH:TDDR也重新装载到PSCH:PSC。15870PSCHTDDRHR-0R/W-0定时器预定标寄存器TIMERxTPRH(x=0,1,2)TIMERxTIM寄存器(x=0,1,2)150TIMR/W-0位15~0 TIMCPU定时器计数寄存器(TIMH:TIM)。TIM寄存器:保存定时器的当前32位计数值的低16位。TIMH寄存器保存定时器的当前32位计数值的高16位。TIMH:TIM每(TDDRH:TDDR+1)个时钟减1。TDDRH:TDDR为定时器前定标分频值。当TIMH:TIM减到0时,TIMH:TIM寄存器重新装载PRDH:PRD寄存器保存的周期值,并产生定时器中断信号()。150TIMHR/W-0位15~0 TIMHTIMERxTIMH寄存器(x=0,1,2)150PRDR/W-0位15~0 PRD定时器周期寄存器(PRDH:PRD)。TIMERxPRD寄存器(x=0,1,2)
PRD寄存器:保存32位周期值的低16位。PRDH寄存器保持32位周期值的高16位。当TIMH:TIM减到0时,在下一个定时器输入时钟(预分频器的输出)开始时,TIMH:TIM寄存器重新装载PRDH:PRD寄存器中的周期值。当定时器控制寄存器(TCR)中的定时器重装载位(TRB)置位时,PRDH:PRD的值也将装载到TIMH:TIM。150PRDHR/W-0位15~0 PRDHTIMERxPRDH寄存器(x=0,1,2)
3.4.5定时器中断应用举例定时器中断的例程文件结构如图所示。========//文件名称:Example_281xCpuTimer.c//功能描述:采用CPUTimer0定时,在定时器中断服务程序中//记录中断的次数//观察的变量:CpuTimer0.InterruptCount#include"DSP281xDevice.h"//DSP281xHeaderfileIncludeFile#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFile//函数声明interruptvoidcpu_timer0_isr(void);voidmain(void){//Step1、初始化系统控制寄存器、PLL、看门狗、时钟位默认状态//该函数在后面的DSP28_SysCtrl.c文件中查找
InitSysCtrl();//Step2,GPIO初始化(本例中不使用)//InitGpio();//Step3、清除所有中断并初始化PIE中断向量表,禁止所有CPU中断
DINT;//初始化PIE控制寄存器为其默认状态(所有PIE中断被禁止并且标志被清除)InitPieCtrl();//禁止所有CPU中断并清除所有中断标志
IER=0x0000;IFR=0x0000;//初始化PIE控制寄存器,参考DSP28_PieCtrl.c文件
InitPieVectTable();//将本例程所使用的中断向量重新映射,使其指向中断服务相应的程序
EALLOW;PieVectTable.TINT0=&cpu_timer0_isr;EDIS;//Step4、初始化所有外设(本例中不需要)//InitPeripherals();InitCpuTimers();//在本例程中仅初始化Cpu定时器//配置CPU–Timer0每间隔1s产生1次中断//150MHzCPU频率,周期为1s(采用us的形式描述)ConfigCpuTimer(&CpuTimer0,100,1500000);StartCpuTimer0();//Step5、用户特定代码,使能中断//使能连接到CPU–Timer0的CPUINT1IER|=M_INT1;//使能位于PIE中的组1的第7个中断TINT0PieCtrlRegs.PIEIER1.bit.INTx7=1;//使能全局中断,并配置为real-timedebug模式
EINT;//使能全局中断INTMERTM;//使能全局实时中断DBGM//Step6、IDLEloop等待产生中断
for(;;);}interruptvoidcpu_timer0_isr(void){CpuTimer0.InterruptCount++;//响应中断并准备接收更多的中断
PieCtrlRegs.PIEACK.a11=PIEACKGROUP1;}========//文件名称:DSP281x_CpuTimers.c//功能描述:DSP281xCPU32位定时器初始化及相关函数//#include"DSP281x_Device.h"//包含的DSP281x头文件#include"DSP281x_Examples.h"//DSP281xExamples头文件structCPUTIMER_VARSCpuTimer0;//CpuTimer1的CpuTimer2保留,由DSPBIOS及其他RTOS使用//structCPUTIMER_VARSCpuTimer1;//structCPUTIMER_VARSCpuTimer2;//初始化CPU定时器//该函数将3个定时器初始化为一个确定的状态voidInitCpuTimers(void){//CPUTimer0//初始化各自定时器的寄存器指向相应的地址
CpuTimer0.RegsAddr=&CpuTimer0Regs;//初始化定时器周期为最大值
CpuTimer0Regs.PRD.all=0xFFFFFFFF;//初始化预定标计数器,分频系数为1(时钟:SYSCLKOUT)CpuTimer0Regs.TPR.all=0;CpuTimer0Regs.TPRH.all=0;//确认定时器处于停止计数状态
CpuTimer0Regs.TCR.bit.TSS=1;//使用周期寄存器的值装载定时器计数寄存器
CpuTimer0Regs.TCR.bit.TRB=1;//复位中断计数标量InterruptCount=0CpuTimer0.InterruptCount=0;//CpuTimer1的CpuTimer2为DSPBIOS及其他RTOS保留//因此相应的定时器初始化代码被注释//初始化各自定时器的寄存器指向相应的地址//CpuTimer1.RegsAddr=&CpuTimer1Regs;//CpuTimer2.RegsAddr=&CpuTimer2Regs;//初始化定时器周期为最大值//CpuTimer1Regs.PRD.all=0xFFFFFFFF;//CpuTimer2Regs.PRD.all=0xFFFFFFFF;//确认定时器处于停止计数状态//CpuTimer1Regs.TCR.bit.TSS=1;//CpuTimer2Regs.TCR.bit.TSS=1;//使用周期寄存器的值装载定时器计数寄存器//CpuTimer1Regs.TCR.bit.TRB=1;//CpuTimer2Regs.TCR.bit.TRB=1;//复位中断计数标量//CpuTimer1.InterruptCount=0;//CpuTimer2.InterruptCount=0;}//配置CPU定时器函数//该函数初始化指定定时器的周期和频率voidConfigCpuTimer(structCPUTIMFR_VARS*Timer,floatFreq,floatPeriod){Uint32temp;//初始化周期
Timer->CPUFreqInMHz=Freq;Timer->PeriodInUSec=Period;temp=(long)(Freq*Period);Timer->RegsAddr->PRD.all=temp;//设置预定标参数(SYSCLKOUT):Timer->RegsAddr->TPR.all=0;Timer->RegsAddr->TPRH.all=0;//初始化定时器控制寄存器Timer->RegsAddr->TCR.bit.TSS=1;//1=Stoptimer,0=Start/RestartTimerTimer->RegsAddr->TCR.bit.TRB=1;//1=reloadtimerTimer->RegsAddr->TCR.bit.SOFT=1;Timer->RegsAddr->TCR.bit.FREE=1;//TimerFreeRunTimer->RegsAddr->TCR.bit.TIE=1;//0=Disable/1=EnableTimerInterrupt//复位中断计数Timer->InterruptCount=0;}3.5通用I/O3.5.1功能概述
F28x系列有56个独立可编程复用的通用I/O(GPIO)引脚。其中绝大部分是通用I/O和专用功能复用引脚。通常情况下,TMS320F2812的大多数I/O引脚都用作专用功能引脚。F28x模块图通用I/O或专用功能数字量I/O端口模块采用了一种灵活的配置方法控制复用引脚的功能:
GPIOMux功能选择寄存器用来选择F281x和C281x器件的引脚操作模式,可以通过该寄存器独立设置每个引脚的功能(数字量I/O或外设专用I/O)。如果选择数字量I/O模式,可以通过GPxDIR方向控制寄存器配置数字量I/O的方向,并通过输入限定控制寄存器GPxQUAL进一步消除数字量I/O引脚的噪声信号。此外,处理器提供GPxSET和GPxCLEAR寄存器对数字量进行置位或清零,还可以通过GPxDAT寄存器独立读/写I/O信号。3.5.2端口配置
TMS320F2812DSP对所有数字量I/O进行分组,每组作为一个端口,分别是GPIO—A、B、D、E、F和G。A、B组各16个,D组4个,E组3个,F组15个,G组2个。
C28x的绝大多数引脚内部都连接多个功能单元,但并不是所有功能单元都能同时工作。也就是说,一个物理引脚可以有多种不同的功能。可以通过软件进行功能设置,但在某一时刻只能用作一种功能。TMS320F2812复用引脚功能对照
TMS320F2812复用引脚功能对照
GPIO控制寄存器
所有GPIO端口由各自的GPxMUX复用寄存器控制,控制位设置为0时,相应引脚作为通用数字量I/O使用;设置为1时,相应引脚作为专用引脚使用。
EALLOW;GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1;//将PWM1引脚设置为PWM波的输出引脚GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=0;//将PWM1引脚设置为通用数字I/O口EDIS;
当设置为数字量I/O功能时,寄存器GPxDIR确定I/O端口的方向:控制位清零引脚配置为数字量输入;置1配置为数字量输出。
GpioMuxRegs.GPADIR.bit.GPIOA0=0;//输入引脚端口A、B、D、E作为数字量输入端口时具有输入量化功能,使用该功能时,输入脉冲必须达到一定的时钟周期长度才被认为是有效的输入信号,否则将被忽略。用户可以定义量化时间长度以消除不必要的干扰信号。GPxQUAL:输入限定控制寄存器15~8:系统保留7~0:QUALPRD,指定受限制的输入周期采样
0x00无限制,与SYSCLKOUT同步
0x01QUALPRD=2个SYSCLKOUT周期
0x02QUALPRD=4个SYSCLKOUT周期 … 0xffQUALPRD=2*255个SYSCLKOUT周期复用功能引脚图
处理器中GPIO内部结构图1:指MGPxUX的值为1,0:指GPxMUX的值为0。3.5.3数字量I/O寄存器及其应用
F2812处理器的所有外设寄存器全部分组为外设帧PF0、PF1和PF2,这些帧都映射到处理器的数据区。
外设帧PF0包括控制访问内部Flash和SARAM速度的控制寄存器;
外设帧PF1包括绝大部分外设控制寄存器;
外设帧PF2主要用于CAN模块的控制寄存器。外设帧存储空间映射关系数字量控制寄存器1I/O复用寄存器及其应用GPIO复用控制寄存器名称地址空间大小(×16)寄存器功能描述GPAMUX0x70C01GPIOA复用控制寄存器GPADIR0x70C11GPIOA方向控制寄存器GPAQUAL0x70C21GPIOA输入量化控制寄存器保留0x70C31GPBMUX0x70C41GPIOB复用控制寄存器GPBDIR0x70C51GPIOB方向控制寄存器GPBQUAL0x70C61GPIOB输入量化控制寄存器保留0x70C7~0x70CB5名称地址空间大小(×16)寄存器功能描述GPDMUX0x70CC1GPIOD复用控制寄存器GPDDIR0x70CD1GPIOD方向控制寄存器GPDQUAL0x70CE1GPIOD输入量化控制寄存器保留0x70CF1GPEMUX0x70D01GPIOE复用控制寄存器GPEDIR0x70D11GPIOE方向控制寄存器GPEQUAL0x70D21GPIOE输入量化控制寄存器保留0x70D31GPFMUX0x70D41GPIOF复用控制寄存器GPFDIR0x70D51GPIOF方向控制寄存器保留0x70D61保留0x70D71GPGMUX0x70D81GPIOG复用控制寄存器GPGDIR0x70D91GPIOG方向控制寄存器保留0x70DA~0x70DF6采用C/C++编程,GPIO复用寄存器的结构体定义(在DSP281x_Gpio.h中)StuctGPIO_MUX_REGS{ union GPAMUX_REG GPAMUX; union GPADIR_REG GPADIR; unionGPAQUAL_REG GPAQUAL;Uint16 rsvd1; unionGPBMUX_REG GPBMUX; unionGPBDIR_REG GPBDIR; unionGPBQUAL_REG GPBQUAL; Uintl6 rsvd2[5]; unionGPDMUX_REG GPDMUX; unionGPDDIR_REG GPDDIR; unionGPDQUAL_REG GPDQUAL; Uintl6 rsvd3;
union GPEMUX_REGGPEMUX; union GPEDIR_REGGPEDIR; unionGPEQUAL_REGGPEQUAL; Uintl6 rsvd4; unionGPFMUX_REGGPFMUX; unionGPFDIR_REGGPFDIR; Uintl6 rsvd5[2]; unionGPGMUX_REGGPGMUX; unionGPGDIR_REGGPGDIR; Uintl6 rsvd6[2];};用结构体定义后,对外部引脚进行初始化操作。voidGpio_select(void){Uint16var1;Uint16var2;Uint16var3;//设置GPIOMux寄存器,使相关I/O工作在GPIO模式
var1=0x0000;//设置GPIODIR寄存器,使相关I/O工作在GPIO输出模式
var2=0xFFFF;var3=0x0000;//配置量化功能EALLOW;GpioMuxRegs.GPAMUX.all=var1;GpioMuxRegs.GPBMUX.all=var1;GpioMuxRegs.GPDMUX.all=var1;GpioMuxRegs.GPFMUX.all=var1;GpioMuxRegs.GPEMUX.all=var1;GpioMuxRegs.GPGMUX.all=var1;//GPIOPORT配置为输出GpioMuxRegs.GPADIR.all=var2;GpioMuxRegs.GPBDIR.all=var2;GpioMuxRegs.GPDDIR.all=var2;GpioMuxRegs.GPDDIR.all=var2;GpioMuxRegs.GPEDIR.all=var2;GpioMuxRegs.GPFDIR.all=var2;GpioMuxRegs.GPGDIR.all=var2;//配置量化器的值GpioMuxRegs.GPAQUAL.all=var3;GpioMuxRegs.GPBQUAL.all=var3;GpioMuxRegs.GPDQUAL.all=var3;GpioMuxRegs.GPEQUAL.all=var3;EDIS;}
由于引脚的输出缓冲直接连接到输入缓冲,当前GPIO引脚上的任何信号都会同时传送到外设模块。
因此当一个引脚配置为普通的数字I/O时,必须禁止相应的能产生中断的外设模块功能,否则可能产生意外的中断。
由于所有多功能复用引脚都可以通过相应的控制寄存器的位独立配置,因此在使用时需要详细了解各GPIO引脚对应的控制位。表给出相关寄存器位对应的被控引脚,并以C语言编程的结构体定义为例给出了采用C/C++编程时的定义方法。以GPIOA复用为例介绍位结构定义。表7.3GPIOA复用引脚功能分配表//GPIOA功能复用控制寄存器位结构定义structGPAMUX_BITS{//位功能描述
Uint16PWM1_GPIOA0:1;//0 Uint16PWM2_GPIOA1:1;//1 Uint16PWM3_GPIOA2:1;//2 Uint16PWM4_GPIOA3:1;//3 Uint16PWMS_GPIOA4:1;//4 Uint16PWM6_GPIOA5:1;//5 Uint16T1PWM_GPIOA6:1;//6 Uint16T2PWM_GPIOA7:1;//7 Uint16CAP1Q1_GPIOA8:1;//8 Uint16CAP2Q2_GPIOA9:1;//9 Uint16CAP3QI1_GPIOA10:1;//10 Uint16TDIRAGPIOA11:1;//11 Uint16TCLKINA_GPIOA12:1;//12 Uint16C1TRIP_GPIOA13:1;//13 Uint16C2TRIP_GPIOA14:1;//14 Uint16C3TRIP_GPIOA15:1;//15例:点亮LED的实验。
6个贴片LED由GPIOF端口的GPIOF8~GPIOF13直接驱动。令6个贴片LED中的DS2、4、6点亮,DS1、3、5熄灭。试编写程序。源程序编写如下:/***************************************************功能描述:令6个贴片LED中的2、4、6点亮,1、3、5熄灭***************************************************/#include"DSP28_Device.h"voidIOinit(){ EALLOW; //将GPIOF8~GPIOF13配置为一般I/O端口,输出
GpioMuxRegs.GPFMUX.all=0xc0ff;GpioMuxRegs.GPFDIR.all=0x3f00; EDIS;}voidmain(void){InitSysCtrl();//系统初始化子程序,在DSP28_sysctrl.c中
DINT;//关闭总中断
IER=0x0000;//关闭外设中断
IFR=0x0000;//清中断标志
IOinit(); //I/O初始化子程序
while(1) { GpioDataRegs.GPFDAT.all=0xd500; }}注意:在CCS3.1的项目中应包含以下文件:库文件rts2800.lib;命令文件EzDSP_RAM_lnk.cmd;所有的*.h头文件;C文件:DSP28_GlobalVariableDefs.c,DSP28_SysCtrl.c。2I/O数据寄存器及其应用如果复用引脚配置为数字I/O模式,则可以直接利用数据寄存器对I/O操作(读/写),也以利用其他辅助寄存器对各I/O进行独立操作,如数字I/O置位(GPxSET寄存器)、数字I/O清零(GPxCLEAR寄存器)及数字I/O电平转换(GPxTOGGLE寄存器),如表所列。2I/O数据寄存器及其应用数据寄存器(GPxDAT):I/O设成输入,引脚有信号输入,读GPxDAT的值,可以读引脚的高低电位。I/O设成输出,写入GPxDAT的值,可以输出高低电位。置位寄存器(GPxSET):把寄存器内容置1清零寄存器(GPxCLEAR):把寄存器内容清0取反寄存器(GPxTOGGLE):把寄存器内容取反2I/O数据寄存器及其应用只能写,任何读操作都返回0。只能写1,写0无效GpioDataRegs.GPADAT.bit.GPIOA0=0;GpioDataRegs.GPACLEAR.bit.GPIOA0=1;GpioDataRegs.GPATOGGLE.bit.GPIOA0=1;名称地址空间大小(×16位)寄存器功能描述GPADAT0x70E01GPIOA数据寄存器GPASET0x70E11GPIOA置位寄存器GPACLEAR0x70E21GPIOA清零寄存器GPATOGGLE0x70E31GPIOA单独触发寄存器GPBDAT0x70E41GPIOB数据寄存器GPBSET0x70E51GPIOB置位寄存器GPBCLEAR0x70E61GPIOB清零寄存器GPBTOGGLE0x70E71GPIOB单独触发寄存器保留0x70E8~0x70EB4GPDDAT0x70EC1GPIOD数据寄存器GPDSET0x70ED1GPIOD置位寄存器GPDCLEAR0x70EE1GPIOD清零寄存器GPDTOGGLE0x70EF1GPIOD单独触发寄存器GPIO数据控制寄存器名称地址空间大小(×16位)说明GPEDAT0x70F01GPIOE数据寄存器GPESET0x70F11GPIOE置位寄存器GPECLEARL0x70F21GPIOE清零寄存器GPETOGGLE0x70F31GPIOE单独触发寄存器GPFDAT0x70F41GPIOF数据寄存器GPFSET0x70F51GPIOF置位寄存器GPFCLEAR0x70F61GPIOF清零寄存器GPFTOGGLE0x70F71GPIOF单独触发寄存器GPGDAT0x70F81GPIOG数据寄存器GPGSET0x70F91GPIOG置位寄存器GPGCLEAR0x70FA1GPIOG清零寄存器GPGTOGGLE0x70FB1GPIOG单独触发寄存器保留0x70FC~0x70FF4voidGpio_example1(void){while(1){
GpioDataRegs.GPADAT.all=0xAAAA; GpioDataRegs.GPBDAT.all=0xAAAA; GpioDataRegs.GPDDAT.all=0x0022; GpioDataRegs.GPEDAT.all=0x0022; GpioDataRegs.GPFDAT.all=0xAAAA; GpioDataRegs.GPGDAT.all=0x0020; delay_loop();例:使用数据寄存器设置I/0的输出,或者通过数据寄存器读取外部引脚的状态信息
GpioDataRegs.GPADAT.all=0x55555; GpioDataRegs.GPBDAT.all=0x55555; GpioDataRegs.GPDDAT.all=0x0041;//只有4个I/0 GpioDataRegs.GPEDAT.all=0x0005;//只有3个I/0 GpioDataRegs.GPFDAT.all=0x5555; GpioDataRegs.GPGDAT.all=0x0010;//只有2个I/0 delay_loop();}}3.5.4数字量I/O应用举例GPIO_application文件结构//#####################################################//文件名称:GPIO_application.C//功能描述:DSP28GPIO-PortB7..B0:8-BitLED//CPUTimer0ISR周期50ms//看门狗使能,在定时器中断及主程序的循环中处理//#######################################################include"DSP281x_Device.h"//使用的函数原型声明voidGpio_select(void);voidInitSystem(void)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 44931-2024纳米技术吸入毒性研究中金属纳米颗粒制备蒸发-冷凝法
- PB-22-5-Hydroxyquinoline-isomer-生命科学试剂-MCE-7761
- 1-Boc-4-carboxymethyl-piperazine-生命科学试剂-MCE-6310
- 2025年度公共停车场车位使用权抵押合同范例
- 二零二五年度离婚后小孩抚养费及生活费用监管协议
- 二零二五年度早餐车餐饮合作经营协议
- 施工现场施工排水排泥管理制度
- 施工现场施工防地震灾害制度
- 教育领域中的学生心理健康研究
- 小学数学新课程教学法复习题课件
- 《社区康复》课件-第七章 脑瘫患儿的社区康复实践
- 城乡环卫一体化内部管理制度
- 小学数学六年级解方程练习300题及答案
- 光伏十林业可行性报告
- 公路工程安全风险辨识与防控手册
- 骨科手术纠纷案例分析课件
- 2022年广西高考英语真题及答案(全国甲卷)
- 安全生产责任清单(加油站)
- 动物检疫技术-动物检疫的程序(动物防疫与检疫技术)
- 煤矿复工复产专项安全风险辨识
- DB42T 1049-2015房产测绘技术规程
评论
0/150
提交评论