哈工大威海大四通信课设Word格式.docx
《哈工大威海大四通信课设Word格式.docx》由会员分享,可在线阅读,更多相关《哈工大威海大四通信课设Word格式.docx(85页珍藏版)》请在冰豆网上搜索。
每个GPIO端口可通过软件分别配置成输入或输出。
5509芯片提供了8个通用输入/输出引脚,即GPIO0−GPIO7。
每个引脚可以通过IODIR寄存器被独立的设置为输入或输出引脚。
IODATA寄存器用来监控输入引脚的状态,控制输出引脚的状态。
(二)相关寄存器
1)IODIR寄存器
IOXDIR为输入/输出控制位。
当IOXDIR=0,IOX引脚为输入引脚,当IOXDIR=1,IOX引脚为输出引脚。
1)IODATA寄存器
第0到7位IOXD为IOX数据位。
当IOX为输入引脚,IOXD=0说明在IOX引脚上的信号为低电平,IOXD=1说明在IOX引脚上的信号为高电平。
当IOX为输出引脚,IOXD=0说明驱动IOX引脚上的信号为低电平,IOXD=1说明驱动IOX引脚上的信号为高电平。
(三)PLL锁相环输出频率的计算
输出频率计算公式:
将输入时钟频率乘以CLKMD中PLL_MULT的值,再除以PLL_DIV的值。
PLL_MULT的取值范围是2-31。
PLL_DIV是从0(除以1)到3(除以4)。
输出频率=(PLL_MULT/(PLL_DIV+1))*输入时钟频率
例如:
(24/(1+1))*12M=144M
(四)源码及注释
#include<
csl.h>
csl_pll.h>
csl_chip.h>
csl_gpio.h>
voiddelay();
/*锁相环的设置*/
PLL_ConfigmyConfig={
0,//IAI:
thePLLlocksusingthesameprocessthatwasunderway
//beforetheidlemodewasentered
1,//IOB:
IfthePLLindicatesabreakinthephaselock,
//itswitchestoitsbypassmodeandrestartsthePLLphase-locking
//sequence
24,//PLLmultiplyvalue;
multiply24times
1//Divideby2PLLdividevalue;
itcanbeeitherPLLdividevalue
//(whenPLLisenabled),orBypass-modedividevalue
//(PLLinbypassmode,ifPLLmultiplyvalueissetto1)
};
/*输出频率=(PLL_MULT/(PLL_DIV+1))*输入时钟频率=12M*24/(1+1)=144M*/
main()
{
inti=0;
/*初始化CSL库*/
CSL_init();
/*设置系统的运行速度为144MHz*/
PLL_config(&
myConfig);
/*时钟配置/
/*确定方向为输出*/
GPIO_RSET(IODIR,0xFF);
/每个端口通过软件配置为输入或输出,1为输出*/
for(i=0;
i<
0x0a;
i++)
{
/*全亮*/
GPIO_RSET(IODATA,0xff);
//设置IODATA寄存器
delay();
//延时
/*全灭*/
GPIO_RSET(IODATA,0x0);
}
/*循环闪烁*/
for(;
;
)
GPIO_RSET(IODATA,0x1);
GPIO_RSET(IODATA,0x2);
GPIO_RSET(IODATA,0x4);
GPIO_RSET(IODATA,0x8);
GPIO_RSET(IODATA,0x10);
GPIO_RSET(IODATA,0x40);
GPIO_RSET(IODATA,0x80);
}
}
voiddelay()
Uint32j=0,k=0;
for(j=0;
j<
0x0c;
j++)
for(k=0;
k<
0xffff;
k++)
{}
(五)实验现象
板上LED先闪亮一次后循环点亮,每个LED灯点亮时间和熄灭时间均约1s。
二、中断的软件编程——外部中断实验
(一)外部中断简介
VC5509一共有5个外部中断,为INT[0-4],中断时序如下:
关于中断的处理方法,VC5509通过以下的寄存器来管理中断。
其中:
IVPD与IVPH是中断入口的定位寄存器,也就是说VC5509的中断向量也是可以重新定位的。
IFR0、IFR1是中断状态寄存器。
IER0、IER1是中断使能寄存器。
DBIER0、DBIER1是用来确定在调试时是否将可屏蔽的中断作为事件敏感的中断处理。
在设置与修改中断向量表时应注意:
在修改中断向量表寄存器IVPD与IVPH之前,设置INTM为1,阻止外来的中断使程序跑飞。
对于不可屏蔽的中断,应有新旧两个中断向量表,来保证在修改期间,不会执行错误的指令使程序跑飞。
中断向量表的安排如下表:
(一)源码及注释
csl_irq.h>
csl_emif.h>
stdio.h>
CSLBoolb;
Uint16eventId0;
intold_intm;
interruptvoidint1(void);
//---------Functionprototypes---------
/*Referencestartofinterruptvectortable*/
/*Thissymbolisdefinedinfile,vectors_IP.s55*/
externvoidVECSTART(void);
//itswitchestoitsbypassmodeandrestartsthePLLphase-locking
12,//PLLmultiplyvalue;
multiply12times
itcanbeeitherPLLdividevalue
/***************5509A终端设置,使能INT1中断***********************/
/*参考资料TMS320C55xChipSupportLibraryAPIReferenceGuide(Rev.J)
TMS320VC5509ADataSheet
HX-5509A开发板使用手册*/
voidINTconfig()
/*Temporarilydisableallmaskableinterrupts*/
IRQ_setVecs((Uint32)(&
VECSTART));
old_intm=IRQ_globalDisable();
/*GetEventIdassociatedwithExternalINT1(8019),forusewith*/
eventId0=IRQ_EVT_INT0;
/*ClearanypendingINT1interrupts*/
IRQ_clear(eventId0);
/*Placeinterruptserviceroutineaddressat*/
/*associatedvectorlocation*/
IRQ_plug(eventId0,&
int1);
/*EnableINT1(8019)interrupt*/
IRQ_enable(eventId0);
/*Enableallmaskableinterrupts*/
IRQ_globalEnable();
/*EMIF为全EMIF接口*/
CHIP_RSET(XBSR,0x0a01);
/*设置系统的运行速度144MHz*/
//设置并使能5509A芯片的INT0中断(EXINT中断)
INTconfig();
while
(1);
//ExternalINT0(EXINT)中断处理函数
interruptvoidint1()
inti,j;
printf("
EXINToccurs\n"
);
for(i=0;
i<
0xfff;
i++)
for(j=0;
j<
j++)
;
(一)实验现象及分析
当按下中断的按键时,打印出EXINToccurs。
注意程序的最后一段:
for(i=0;
这段程序是作延时消按键抖动之用的,实际情况下可合理设置到几十毫秒左右。
如果不加这一段程序,按键抖动可能导致打印出几行EXINToccurs而不是一行,产生错误。
三、通用计时器的使用——timer实验
(一)通用定时器Timer简介
通用定时器包括一个4位的预定标计数器(PSC)和一个16位的主计数器(TIM),从而提供20位的动态范围。
它还包含两个周期寄存器,即TDDR和PRD。
Timer的结构如下图:
在Timer初始化过程中,周期寄存器中的内容加载给计数器,其中TDDR加载到PSC,PRD加载到TIM中,开始工作。
Timer控制寄存器TCR控制并监控Timer的操作及其引脚(TIN/TOUT)。
PSC由CPU输入时钟或者外部时钟驱动,计数器工作,开始计数。
计时器发出信号的速率
(一)相关寄存器
2个计数寄存器和2个周期寄存器
PSC预定标计数器
TIM主计数寄存器
TDDR预定标周期寄存器
PRD主周期计数器
计时器控制寄存器TCR
TCR可以实现Timer的配置、工作、停止、加载、重新加载等。
1)IDLEEN:
Timer的空闲使能位。
IDLEEN=0,Timer不能置于空闲状态;
IDLEEN=1,当PERIPH域为空闲状态,Timer终止在低功耗状态。
2)FUNC:
可以将定时器引脚配置为:
通用输出(10b);
计时器输出(01b);
一个时钟输入(11b)或高阻状态(00b)。
3)TLB:
Timer加载位。
当TLB=0,TIM与PSC不被加载;
直到TLB=1,PRD加载到TIM,TDDR加载到PSC。
4)SOFT:
Soft终止位。
SOFT=0,硬终止,Timer直接终止;
SOFT=1,软终止,当main中的TIM计数到0时终止。
5)FREE:
自由运行位。
FREE=0,Timer如受SOFT位一样被影响;
FREE=1,Timer继续运行。
6)PWID:
定时器输出的脉冲宽度位。
1个CPU时钟周期(00b);
2个CPU时钟周期(01b);
4个CPU时钟周期(10b);
8个(11b)。
7)ARB:
自动重新装入位。
ARB=1,主计数器(TIM)一旦减少为0,计数寄存器自动从周期寄存器重新装入。
8)TSS:
Timer停止状态位。
TSS=0,启动Timer;
TSS=1,终止Timer;
9)CP:
时钟模式/脉冲模式位。
CP=0,脉冲模式;
CP=1,时钟模式。
10)DATOUT:
数据输出位。
DATOUT=0,驱动Timer引脚信号为低;
DATOUT=1,驱动Timer引脚信号为高。
11)源码及注释
csl_timer.h>
csl_chiphal.h>
#defineTIMER_CTRLTIMER_TCR_RMK(\
TIMER_TCR_IDLEEN_DEFAULT,/*IDLEEN==0*/
TIMER_TCR_FUNC_OF(0),/*FUNC==0*/
TIMER_TCR_TLB_RESET,/*TLB==1*/
TIMER_TCR_SOFT_BRKPTNOW,/*SOFT==0*/
TIMER_TCR_FREE_WITHSOFT,/*FREE==0*/
TIMER_TCR_PWID_OF(0),/*PWID==0*/
TIMER_TCR_ARB_RESET,/*ARB==1*/
TIMER_TCR_TSS_START,/*TSS==0*/
TIMER_TCR_CP_PULSE,/*CP==0*/
TIMER_TCR_POLAR_LOW,/*POLAR==0*/
TIMER_TCR_DATOUT_0/*DATOUT==0*/
)
/*Timer寄存器配置,信号输出频率1Khz左右*/
TIMER_ConfigtimCfg0={
TIMER_CTRL,/*TCR0*/
0x3400u,/*PRD0*/
0x0000/*PRSC*/
/*CreateaTIMER_HandleobjectforusewithTIMER_open*/
TIMER_HandlemhTimer0;
volatileUint16timer0_cnt=0;
/*Function/ISRprototypes*/
interruptvoidtimer0Isr(void);
voidtaskFxn(void);
Uint16tim_val;
Uint16xfchange=0;
//控制输出方向/
voidmain(void)
/*CLS库的初始化,这是必需的*/
/*修改寄存器IVPH,IVPD重新定义中断向量表*/
/*禁止所有可屏蔽的中断源*/
/*打开定时器0,设置其为上电的默认值,并返回其句柄*/
mhTimer0=TIMER_open(TIMER_DEV0,TIMER_OPEN_RESET);
/*CSLinterruptenablefunctions.*/
/*获得定时器0的中断ID号*/
eventId0=TIMER_getEventId(mhTimer0);
/*清除定时器0的中断状态位*/
/*为定时器0设置中断服务程序*/
timer0Isr);
/*设置定时器0的控制与周期寄存器*/
TIMER_config(mhTimer0,&
timCfg0);
/*使能定时器的中断*/
/*设置寄存器ST1的INTM位,使能所有的中断*/
/*启动定时器0*/
TIMER_start(mhTimer0);
/*Waitforatleast10timerperiods*/
/*等待10个定时周期*/
if(xfchange==0)
/*点亮XF的LED*/
CHIP_FSET(ST1_55,XF,1);
else
/*关掉XF的LED*/
CHIP_FSET(ST1_55,XF,0);
}/*XF输出01010101…*/
/*RestoreoldvalueofINTM*/
/*恢复INTM旧的值*/
IRQ_globalRestore(old_intm);
/*Wearethroughwithtimer,socloseit*/
/*关掉定时器0*/
TIMER_close(mhTimer0);
/*定时器0的中断程序*/
interruptvoidtimer0Isr(void)
++timer0_cnt;
if(timer0_cnt==1000)
xfchange=1;
if(timer0_cnt==2000)
timer0_cnt=0;
xfchange=0;
(二)实验现象
板上LED灯闪亮,间隔时间约1s。
四、通用计时器的使用——看门狗wdt实验
(一)看门狗简介
1.概念
硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。
那么定时时间到后就会使单片机复位。
常用的WDT芯片MAX813,5045,IMP813等。
软件看门狗技术的原理和这差不多,只不过是用软件的方法实现,用DSP的片上外设资源定时器timer来对主程序的运行进行监控。
2.作用
监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。
那么定时时间到后就会使DSP复位。
即:
防止因为软件死循环而造成的系统死锁。
3.HX-5509看门狗的结构
WatchdogTimer包括一个16bit的预定标计数器和一个16bit的主计数器,从而提供一个32bit动态范围的计数器
当预定标计数器达到0时,就会被重新加载,并重新开始计数。
装入的值由WDTCR中TDDR位+WDTCR2中的预定标模式PREMD位来决定。
当PREMD位为0时,4位TDDR域的值直接加载到预定标计数器上,提供20位动态范围;
当PREMD位为1时,预定标计数器通过非直接的方式加载16位的TDDR,这种模式提供32位动态范围的看门狗计时器。
当主计时器减为0时,产生超时事件,引发以下的可编程事件:
00b,一个看门狗定时器中断
10b,DSP复位
01b,一个非屏蔽中断(NMI)
11b,不发生任何事件
所产生的超时事件,通过编程控制寄存器WDTCR中的WDOUT域来控制
WDTIM计数器寄存器
WDPRD周期寄存器
WDTCR控制寄存器
WDTCR2控制寄存器2
1.WDTCR:
看门狗控制寄存器
WDOUT:
用来控制超时引发的可编程事件
PSC:
当PREMD=0时,用来存放预定标计数器的值。
TDDR:
当PREMD=0时,若预定标计数器的值减为0,则将TDDR加载到预定标计数器中。
当PREMD=1时,若预定标计数器的值减为0,则通过TDDR中的值选择加载到预定标计数器中的数。
1.WDTCR2:
PREMD:
预定标寄存器模式选择位,0为直接模式,1